diff --git a/.build b/.build index 0bc471b64e..cd1a74239c 100644 --- a/.build +++ b/.build @@ -32,8 +32,9 @@ ActivityPub.Pruner.PruneDatabaseWorker.html ActivityPub.Pruner.html ActivityPub.Queries.html ActivityPub.Safety.Containment.html +ActivityPub.Safety.Encryption.html +ActivityPub.Safety.HTTP.Signatures.html ActivityPub.Safety.Keys.html -ActivityPub.Safety.Signatures.html ActivityPub.Utils.html ActivityPub.Web.ActivityPubController.html ActivityPub.Web.ActorView.html @@ -100,14 +101,15 @@ Bonfire.Boundaries.Blocks.html Bonfire.Boundaries.Circles.html Bonfire.Boundaries.Controlleds.html Bonfire.Boundaries.Debug.html -Bonfire.Boundaries.Fixtures.html -Bonfire.Boundaries.FixturesUsersMigrations.html Bonfire.Boundaries.Grants.html Bonfire.Boundaries.Integration.html Bonfire.Boundaries.LiveHandler.html Bonfire.Boundaries.Queries.html Bonfire.Boundaries.Roles.html Bonfire.Boundaries.RuntimeConfig.html +Bonfire.Boundaries.Scaffold.Instance.html +Bonfire.Boundaries.Scaffold.Users.html +Bonfire.Boundaries.Scaffold.html Bonfire.Boundaries.Summary.html Bonfire.Boundaries.Users.PreparedBoundaries.html Bonfire.Boundaries.Users.html @@ -132,6 +134,7 @@ Bonfire.Classify.Tree.html Bonfire.Classify.html Bonfire.Classify.html Bonfire.Common.AntiSpam.Akismet.html +Bonfire.Common.AntiSpam.BumblebeeAdapter.html Bonfire.Common.AntiSpam.Mock.html Bonfire.Common.AntiSpam.Provider.html Bonfire.Common.AntiSpam.html @@ -144,6 +147,7 @@ Bonfire.Common.Config.LoadExtensionsConfig.html Bonfire.Common.Config.html Bonfire.Common.ConfigModule.html Bonfire.Common.ContextModule.html +Bonfire.Common.Crypto.html Bonfire.Common.DatesTimes.html Bonfire.Common.E.html Bonfire.Common.Enums.html @@ -519,6 +523,7 @@ Bonfire.Social.Graph.Integration.html Bonfire.Social.Graph.html Bonfire.Social.Likes.LiveHandler.html Bonfire.Social.Likes.html +Bonfire.Social.LivePush.html Bonfire.Social.Objects.LiveHandler.html Bonfire.Social.Objects.html Bonfire.Social.Pins.LiveHandler.html @@ -648,7 +653,6 @@ Bonfire.UI.Reflow.html Bonfire.UI.Social.Benchmark.html Bonfire.UI.Social.Graph.RuntimeConfig.html Bonfire.UI.Social.Integration.html -Bonfire.UI.Social.LivePush.html Bonfire.UI.Social.Routes.html Bonfire.UI.Social.RuntimeConfig.html Bonfire.UI.Social.html @@ -719,7 +723,6 @@ Entrepot.html EntrepotEcto.html Exto.html Exto.html -Grumble.html Iconify.Icon.html Iconify.MaterialSymbols.CalendarMonth.html Iconify.html @@ -740,7 +743,6 @@ Mix.Tasks.Bonfire.User.Admin.Promote.html Mix.Tasks.Bonfire.User.New.html Mix.Tasks.Bonfire.Widget.New.html Mix.Tasks.Import2alias.html -Mix.Tasks.Papertrail.Install.html Nebulex.DiskAdapter.DiskCacheHelper.html Nebulex.DiskAdapter.html Needle.Changesets.html @@ -767,13 +769,6 @@ Paginator.Page.html Paginator.PageInfo.html Paginator.html Paginator.html -PaperTrail.Multi.html -PaperTrail.RepoClient.html -PaperTrail.Serializer.html -PaperTrail.Version.html -PaperTrail.VersionQueries.html -PaperTrail.html -PaperTrail.html Releaser.Git.html Releaser.Publish.html Releaser.Tests.html @@ -899,8 +894,8 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-C93A2972.js -dist/sidebar_items-4535CF76.js +dist/search_data-E29AE5D0.js +dist/sidebar_items-7A93CEFA.js edit-an-existing-extension.html extensions-overview.html hacking.html diff --git a/404.html b/404.html index 68e0a0fda4..cafe0e8dd0 100644 --- a/404.html +++ b/404.html @@ -5,18 +5,18 @@ - + - 404 — Bonfire v0.9.10-classic-beta.156 + 404 — Bonfire v0.9.10-classic-beta.160 - + @@ -56,7 +56,7 @@ Bonfire diff --git a/AbsintheClient.Helpers.html b/AbsintheClient.Helpers.html index 858ec10a0d..97e4deb221 100644 --- a/AbsintheClient.Helpers.html +++ b/AbsintheClient.Helpers.html @@ -5,16 +5,16 @@ - + - AbsintheClient.Helpers — Bonfire v0.9.10-classic-beta.156 + AbsintheClient.Helpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

AbsintheClient.Helpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/AbsintheClient.html b/AbsintheClient.html index 2e07715448..c333aa27e8 100644 --- a/AbsintheClient.html +++ b/AbsintheClient.html @@ -5,16 +5,16 @@ - + - AbsintheClient — Bonfire v0.9.10-classic-beta.156 + AbsintheClient — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

AbsintheClient behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -145,29 +145,29 @@

Example

First, use AbsintheClient, passing your schema and -notifying Absinthe to operate in internal mode:

defmodule MyAppWeb.UserController do
+notifying Absinthe to operate in internal mode:

defmodule MyAppWeb.UserController do
   use MyAppWeb, :controller
-  use AbsintheClient, schema: MyAppWeb.Schema, action: [mode: :internal]
+  use AbsintheClient, schema: MyAppWeb.Schema, action: [mode: :internal]
 
   # ... actions
 
-end

For each action you want Absinthe to process, provide a GraphQL document using +end

For each action you want Absinthe to process, provide a GraphQL document using the @graphql module attribute (before the action):

@graphql """
   query ($filter: UserFilter) {
     users(filter: $filter, limit: 10)
   }
 """
-def index(conn_or_socket, %{data: data}) do
+def index(conn_or_socket, %{data: data}) do
   render conn_or_socket, "index.html", data
-end

The params for the action will be intercepted by the +end

The params for the action will be intercepted by the AbsintheClient.Action plug, and used as variables for the GraphQL document you've specified.

For instance, given a definition for a :user_filter input object -type like this:

input_object :user_filter do
+type like this:

input_object :user_filter do
   field :name_matches, :string
   field :age_above, :integer
   field :age_below, :integer
-end

And a query that looks like this (assuming you have the normal -Plug.Parsers configuration for param parsing):

?filter[name_matches]=joe&filter[age_above]=42

Then Absinthe will receive variable definitions of:

%{"filter" => %{"name_matches" => "joe", "age_above" => 42}}

(For how the string "42" was converted into 42, see cast_param/3).

The params on the conn_or_socket will then be replaced by the result of the +end

And a query that looks like this (assuming you have the normal +Plug.Parsers configuration for param parsing):

?filter[name_matches]=joe&filter[age_above]=42

Then Absinthe will receive variable definitions of:

%{"filter" => %{"name_matches" => "joe", "age_above" => 42}}

(For how the string "42" was converted into 42, see cast_param/3).

The params on the conn_or_socket will then be replaced by the result of the execution by Absinthe. The action function can then match against that result to respond correctly to the user:

It's up to you to handle the three possible results:

app_name()

- + View Source @@ -506,7 +506,7 @@

from(email, address)

handle_error(error, stacktrace \\ nil)

- + View Source diff --git a/Bonfire.Me.Accounts.ChangeEmailFields.html b/Bonfire.Me.Accounts.ChangeEmailFields.html index 652761787d..a388fc534e 100644 --- a/Bonfire.Me.Accounts.ChangeEmailFields.html +++ b/Bonfire.Me.Accounts.ChangeEmailFields.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.ChangeEmailFields — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.ChangeEmailFields — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.ChangeEmailFields - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Accounts.ChangePasswordFields.html b/Bonfire.Me.Accounts.ChangePasswordFields.html index 54ac43b146..0dc8591bd9 100644 --- a/Bonfire.Me.Accounts.ChangePasswordFields.html +++ b/Bonfire.Me.Accounts.ChangePasswordFields.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.ChangePasswordFields — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.ChangePasswordFields — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.ChangePasswordFields - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Accounts.ConfirmEmailFields.html b/Bonfire.Me.Accounts.ConfirmEmailFields.html index 8310cfb2f1..cd58904468 100644 --- a/Bonfire.Me.Accounts.ConfirmEmailFields.html +++ b/Bonfire.Me.Accounts.ConfirmEmailFields.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.ConfirmEmailFields — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.ConfirmEmailFields — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.ConfirmEmailFields - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Accounts.ForgotPasswordFields.html b/Bonfire.Me.Accounts.ForgotPasswordFields.html index edd522893d..1a5f7321a9 100644 --- a/Bonfire.Me.Accounts.ForgotPasswordFields.html +++ b/Bonfire.Me.Accounts.ForgotPasswordFields.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.ForgotPasswordFields — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.ForgotPasswordFields — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.ForgotPasswordFields - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Accounts.LoginFields.html b/Bonfire.Me.Accounts.LoginFields.html index 3b8943a965..74e3cd6636 100644 --- a/Bonfire.Me.Accounts.LoginFields.html +++ b/Bonfire.Me.Accounts.LoginFields.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.LoginFields — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.LoginFields — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.LoginFields - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Accounts.Queries.html b/Bonfire.Me.Accounts.Queries.html index c2a392546e..7c4b825aff 100644 --- a/Bonfire.Me.Accounts.Queries.html +++ b/Bonfire.Me.Accounts.Queries.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.Queries — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -263,8 +263,8 @@

by_confirm_token(token)

Examples -
iex> by_confirm_token("some_token")
-#Ecto.Query<...>
+
iex> by_confirm_token("some_token")
+#Ecto.Query<...>
@@ -292,8 +292,8 @@

by_email(email)

Examples -
iex> Bonfire.Me.Accounts.Queries.by_email("example@example.com")
-#Ecto.Query<...>
+
iex> Bonfire.Me.Accounts.Queries.by_email("example@example.com")
+#Ecto.Query<...>
@@ -323,9 +323,9 @@

count(q \\ Account)

Examples -
iex> Bonfire.Me.Accounts.Queries.count()
+
iex> Bonfire.Me.Accounts.Queries.count()
 
-iex> Bonfire.Me.Accounts.Queries.count(from(a in Account, where: a.active == true))
+
iex> Bonfire.Me.Accounts.Queries.count(from(a in Account, where: a.active == true))
@@ -353,7 +353,7 @@

current(id)

Examples -
iex> Bonfire.Me.Accounts.Queries.current("some_id")
+
iex> Bonfire.Me.Accounts.Queries.current("some_id")
diff --git a/Bonfire.Me.Accounts.SecondFactors.html b/Bonfire.Me.Accounts.SecondFactors.html index 83fb81b7aa..290bfa4c9e 100644 --- a/Bonfire.Me.Accounts.SecondFactors.html +++ b/Bonfire.Me.Accounts.SecondFactors.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts.SecondFactors — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts.SecondFactors — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts.SecondFactors - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -315,8 +315,8 @@

changeset(totp \\ %AuthSecondFactor{}, attr Examples

-
iex> Bonfire.Me.Accounts.SecondFactors.changeset(%AuthSecondFactor{}, %{secret: "new_secret"}, [])
-%Ecto.Changeset{data: %AuthSecondFactor{}}
+
iex> Bonfire.Me.Accounts.SecondFactors.changeset(%AuthSecondFactor{}, %{secret: "new_secret"}, [])
+%Ecto.Changeset{data: %AuthSecondFactor{}}
@@ -344,9 +344,9 @@

delete_account_totp(account_totp)

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(%AuthSecondFactor{id: "some_id"})
+
iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(%AuthSecondFactor{id: "some_id"})
 
-iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp("some_id")
+
iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp("some_id")
@@ -374,7 +374,7 @@

enabled?()

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.enabled?()
+
iex> Bonfire.Me.Accounts.SecondFactors.enabled?()
 true
@@ -405,7 +405,7 @@

format_secret(secret \\ new())

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.format_secret("JBSWY3DPEHPK3PXP")
+
iex> Bonfire.Me.Accounts.SecondFactors.format_secret("JBSWY3DPEHPK3PXP")
 "JBSW Y3DP EHPK 3PXP"
@@ -434,11 +434,11 @@

get_account_totp(account)

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(%{auth_second_factor: %AuthSecondFactor{}})
-%AuthSecondFactor{}
+
iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(%{auth_second_factor: %AuthSecondFactor{}})
+%AuthSecondFactor{}
 
-iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp("some_id")
-%AuthSecondFactor{}
+
iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp("some_id") +%AuthSecondFactor{}
@@ -466,8 +466,8 @@

maybe_authenticate(account, params)

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.maybe_authenticate("account_id", %{"auth_second_factor" => %{"code" => "123456"}})
-{:ok, :valid_totp}
+
iex> Bonfire.Me.Accounts.SecondFactors.maybe_authenticate("account_id", %{"auth_second_factor" => %{"code" => "123456"}})
+{:ok, :valid_totp}
@@ -495,8 +495,8 @@

maybe_cast_totp_changeset(changeset, params Examples

-
iex> Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset(changeset, %{auth_second_factor: %{code: "123456"}}, [])
-%Ecto.Changeset{data: %AuthSecondFactor{}}
+
iex> Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset(changeset, %{auth_second_factor: %{code: "123456"}}, [])
+%Ecto.Changeset{data: %AuthSecondFactor{}}
@@ -524,7 +524,7 @@

new()

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.new()
+
iex> Bonfire.Me.Accounts.SecondFactors.new()
 "JBSWY3DPEHPK3PXP"
@@ -555,7 +555,7 @@

new_qrcode(opts \\ [])

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.new_qrcode()
+
iex> Bonfire.Me.Accounts.SecondFactors.new_qrcode()
 "<svg>...</svg>"
@@ -610,10 +610,10 @@

new_uri(secret \\ nil)

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.new_uri()
+
iex> Bonfire.Me.Accounts.SecondFactors.new_uri()
 "otpauth://totp/bonfire:AccountName?secret=APYWY3DPEHPK3PXV&issuer=Issuer"
 
-iex> Bonfire.Me.Accounts.SecondFactors.new_uri("JBSWY3DPEHPK3PXP")
+iex> Bonfire.Me.Accounts.SecondFactors.new_uri("JBSWY3DPEHPK3PXP")
 "otpauth://totp/bonfire:AccountName?secret=JBSWY3DPEHPK3PXP&issuer=Issuer"
@@ -642,10 +642,10 @@

validate_account_totp(totp, code)

Examples -
iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(%AuthSecondFactor{id: "some_id", secret: "JBSWY3DPEHPK3PXP"}, "123456")
+
iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(%AuthSecondFactor{id: "some_id", secret: "JBSWY3DPEHPK3PXP"}, "123456")
 :valid_totp
 
- iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp("some_id", "123456")
+ iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp("some_id", "123456")
 :valid_totp
diff --git a/Bonfire.Me.Accounts.html b/Bonfire.Me.Accounts.html index 0b67059b8f..73e984e5e7 100644 --- a/Bonfire.Me.Accounts.html +++ b/Bonfire.Me.Accounts.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Accounts — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Accounts — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Accounts - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -483,7 +483,7 @@

allow_signup?(opts)

- + View Source @@ -499,7 +499,7 @@

allow_signup?(opts)

Examples -
iex> allow_signup?(%{invite: "invite_code"})
+
iex> allow_signup?(%{invite: "invite_code"})
 true
@@ -514,7 +514,7 @@

allow_signup?(opts)

change_email(current_account, params_or_changeset, opts \\ [])

- + View Source @@ -530,11 +530,11 @@

change_email(current_account, params_or_cha Examples

-
> change_email(%Account{}, %{old_email: "old@example.com", email: "new@example.com"})
-{:ok, %Account{}}
+
> change_email(%Account{}, %{old_email: "old@example.com", email: "new@example.com"})
+{:ok, %Account{}}
 
-> change_email(%Account{}, %Changeset{valid?: false})
-{:error, %Changeset{}}
+
> change_email(%Account{}, %Changeset{valid?: false}) +{:error, %Changeset{}}
@@ -548,7 +548,7 @@

change_email(current_account, params_or_cha

change_password(current_account, params_or_changeset, opts \\ [])

- + View Source @@ -564,11 +564,11 @@

change_password(current_account, params_or_ Examples

-
> change_password(%Account{}, %{old_password: "old", password: "new"})
-{:ok, %Account{}}
+
> change_password(%Account{}, %{old_password: "old", password: "new"})
+{:ok, %Account{}}
 
-> change_password(%Account{}, %Changeset{valid?: false})
-{:error, %Changeset{}}
+
> change_password(%Account{}, %Changeset{valid?: false}) +{:error, %Changeset{}}
@@ -580,7 +580,7 @@

change_password(current_account, params_or_

change_password(current_account, cs, params, opts)

- + View Source @@ -617,7 +617,7 @@

changeset(changeset_name, params, opts \\ [
@spec changeset(changeset_name(), params :: map(), opts :: Keyword.t()) ::
-  Ecto.Changeset.t()
+ Ecto.Changeset.t()

@@ -627,11 +627,11 @@

changeset(changeset_name, params, opts \\ [ Examples

-
> changeset(:forgot_password, %{})
-%Changeset{}
+
> changeset(:forgot_password, %{})
+%Changeset{}
 
-> changeset(:login, %{email: "test@example.com", password: "secret"})
-%Changeset{}
+
> changeset(:login, %{email: "test@example.com", password: "secret"}) +%Changeset{}
@@ -645,7 +645,7 @@

changeset(changeset_name, params, opts \\ [

confirm_email(account_or_token, opts \\ [])

- + View Source @@ -661,11 +661,11 @@

confirm_email(account_or_token, opts \\ []) Examples

-
> confirm_email("some_token")
-{:ok, %Account{}}
+
> confirm_email("some_token")
+{:ok, %Account{}}
 
-> confirm_email(%Account{})
-{:ok, %Account{}}
+
> confirm_email(%Account{}) +{:ok, %Account{}}
@@ -677,7 +677,7 @@

confirm_email(account_or_token, opts \\ [])

confirm_email_manually(email)

- + View Source @@ -693,8 +693,8 @@

confirm_email_manually(email)

Examples -
> confirm_email_manually("test@example.com")
-{:ok, %Account{}}
+
> confirm_email_manually("test@example.com")
+{:ok, %Account{}}
@@ -706,7 +706,7 @@

confirm_email_manually(email)

count()

- + View Source @@ -722,7 +722,7 @@

count()

Examples -
iex> count()
+
iex> count()
 42
@@ -737,7 +737,7 @@

count()

delete(account, opts \\ [])

- + View Source @@ -753,10 +753,10 @@

delete(account, opts \\ [])

Examples -
iex> delete(%Account{})
+
iex> delete(%Account{})
 :ok
 
-iex> delete("some_account_id")
+iex> delete("some_account_id")
 :ok
@@ -791,7 +791,7 @@

do_signup(cs_or_params, opts)

enqueue_delete(account)

- + View Source @@ -807,10 +807,10 @@

enqueue_delete(account)

Examples -
> enqueue_delete(%Account{})
+
> enqueue_delete(%Account{})
 :ok
 
-> enqueue_delete("some_account_id")
+> enqueue_delete("some_account_id")
 :ok
@@ -839,11 +839,11 @@

fetch_current(id)

Examples -
iex> fetch_current(nil)
-{:error, :not_found}
+
iex> fetch_current(nil)
+{:error, :not_found}
 
-> fetch_current("some_id")
-{:ok, %Account{id: "some_id"}}
+
> fetch_current("some_id") +{:ok, %Account{id: "some_id"}}
@@ -871,8 +871,8 @@

get_by_email(email)

Examples -
> get_by_email("test@example.com")
-%Account{email: "test@example.com"}
+
> get_by_email("test@example.com")
+%Account{email: "test@example.com"}
@@ -900,11 +900,11 @@

get_current(id)

Examples -
iex> get_current(nil)
+
iex> get_current(nil)
 nil
 
-> get_current("some_id")
-%Account{id: "some_id"}
+
> get_current("some_id") +%Account{id: "some_id"}
@@ -916,7 +916,7 @@

get_current(id)

instance_is_invite_only?()

- + View Source @@ -932,7 +932,7 @@

instance_is_invite_only?()

Examples -
> instance_is_invite_only?()
+
> instance_is_invite_only?()
 true
@@ -945,7 +945,7 @@

instance_is_invite_only?()

is_admin?(assigns)

- + View Source @@ -961,10 +961,10 @@

is_admin?(assigns)

Examples -
> is_admin?(user)
+
> is_admin?(user)
 true
 
-> is_admin?(account)
+> is_admin?(account)
 true
@@ -977,7 +977,7 @@

is_admin?(assigns)

is_first_account?()

- + View Source @@ -1019,14 +1019,14 @@

login(params_or_changeset, opts \\ [])

Examples -
> login(%{email: "test@example.com", password: "secret"})
-{:ok, %Account{}, nil}
+
> login(%{email: "test@example.com", password: "secret"})
+{:ok, %Account{}, nil}
 
-> login(%{username: "test", password: "secret"})
-{:ok, %Account{}, %User{}}
+> login(%{username: "test", password: "secret"})
+{:ok, %Account{}, %User{}}
 
-> login(%Changeset{valid?: false})
-{:error, %Changeset{}}
+
> login(%Changeset{valid?: false}) +{:error, %Changeset{}}
@@ -1064,7 +1064,7 @@

login_valid?(user, password)

make_account(attrs \\ %{}, opts \\ [])

- + View Source @@ -1086,7 +1086,7 @@

make_account(attrs \\ %{}, opts \\ [])

maybe_redeem_invite(data, opts)

- + View Source @@ -1130,7 +1130,7 @@

prepare_signup_opts(opts)

redeemable_invite?(invite)

- + View Source @@ -1170,11 +1170,11 @@

request_confirm_email(params_or_changeset_o Examples

-
> request_confirm_email(%{email: "test@example.com"})
-{:ok, :resent, %Account{}}
+
> request_confirm_email(%{email: "test@example.com"})
+{:ok, :resent, %Account{}}
 
-> request_confirm_email(%Changeset{valid?: false})
-{:error, %Changeset{}}
+
> request_confirm_email(%Changeset{valid?: false}) +{:error, %Changeset{}}
@@ -1186,7 +1186,7 @@

request_confirm_email(params_or_changeset_o

request_forgot_password(params)

- + View Source @@ -1202,8 +1202,8 @@

request_forgot_password(params)

Examples -
> request_forgot_password(%{email: "test@example.com"})
-{:ok, :resent, %Account{}}
+
> request_forgot_password(%{email: "test@example.com"})
+{:ok, :resent, %Account{}}
@@ -1233,11 +1233,11 @@

signup(params_or_changeset, opts \\ [])

Examples -
> signup(%{email: "test@example.com", password: "secret"})
-{:ok, %Account{}}
+
> signup(%{email: "test@example.com", password: "secret"})
+{:ok, %Account{}}
 
-> signup(%Changeset{valid?: false})
-{:error, %Changeset{}}
+
> signup(%Changeset{valid?: false}) +{:error, %Changeset{}}
@@ -1251,7 +1251,7 @@

signup(params_or_changeset, opts \\ [])

update_is_admin(user_or_account, make_admin_or_revoke, user \\ nil)

- + View Source diff --git a/Bonfire.Me.Acts.Caretaker.html b/Bonfire.Me.Acts.Caretaker.html index 580beb5b1f..8f53f29f65 100644 --- a/Bonfire.Me.Acts.Caretaker.html +++ b/Bonfire.Me.Acts.Caretaker.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Acts.Caretaker — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Acts.Caretaker — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Acts.Caretaker - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Acts.Creator.html b/Bonfire.Me.Acts.Creator.html index 9b799599da..11ae97f2a9 100644 --- a/Bonfire.Me.Acts.Creator.html +++ b/Bonfire.Me.Acts.Creator.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Acts.Creator — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Acts.Creator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Acts.Creator - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Archive.LiveHandler.html b/Bonfire.Me.Archive.LiveHandler.html index d99c7d8f86..8d207733e4 100644 --- a/Bonfire.Me.Archive.LiveHandler.html +++ b/Bonfire.Me.Archive.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Archive.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Archive.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Archive.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Characters.html b/Bonfire.Me.Characters.html index 7fd8449c22..d15a7752ed 100644 --- a/Bonfire.Me.Characters.html +++ b/Bonfire.Me.Characters.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Characters — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Characters — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Characters - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -351,8 +351,8 @@

by_username(username)

Examples -
> Bonfire.Me.Characters.by_username("username")
-%Bonfire.Data.Identity.Character{}
+
> Bonfire.Me.Characters.by_username("username")
+%Bonfire.Data.Identity.Character{}
@@ -434,7 +434,7 @@

changeset(char \\ %Character{}, params, pro

character_mention_prefix(object)

- + View Source @@ -450,7 +450,7 @@

character_mention_prefix(object)

Examples -
iex> Bonfire.Me.Characters.character_mention_prefix(%Bonfire.Data.Identity.User{})
+
iex> Bonfire.Me.Characters.character_mention_prefix(%Bonfire.Data.Identity.User{})
 "@"
@@ -463,7 +463,7 @@

character_mention_prefix(object)

character_url(character)

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

character_url(character)

Examples -
iex> Bonfire.Me.Characters.character_url(%Bonfire.Data.Identity.Character{})
+
iex> Bonfire.Me.Characters.character_url(%Bonfire.Data.Identity.Character{})
 "http://example.com/character/username"
@@ -508,7 +508,7 @@

clean_username(username)

Examples -
iex> Bonfire.Me.Characters.clean_username("invalid username!")
+
iex> Bonfire.Me.Characters.clean_username("invalid username!")
 "invalid_username"
@@ -527,7 +527,7 @@

clean_username(username)

display_username(user, always_include_domain \\ false, is_local? \\ nil, prefix \\ nil)

- + View Source @@ -543,10 +543,10 @@

display_username(user, always_include_domai Examples

-
iex> Bonfire.Me.Characters.display_username("username")
+
iex> Bonfire.Me.Characters.display_username("username")
 "@username"
 
-iex> Bonfire.Me.Characters.display_username("username", true, true, "@")
+iex> Bonfire.Me.Characters.display_username("username", true, true, "@")
 "@username@domain.com"
@@ -575,11 +575,11 @@

get(ids)

Examples -
> Bonfire.Me.Characters.get("id_or_username")
-%Bonfire.Data.Identity.Character{}
+
> Bonfire.Me.Characters.get("id_or_username")
+%Bonfire.Data.Identity.Character{}
 
-> Bonfire.Me.Characters.get(["id1", "id2"])
-{:ok, [%Bonfire.Data.Identity.Character{}, %Bonfire.Data.Identity.Character{}]}
+
> Bonfire.Me.Characters.get(["id1", "id2"]) +{:ok, [%Bonfire.Data.Identity.Character{}, %Bonfire.Data.Identity.Character{}]}
@@ -607,7 +607,7 @@

hash_available?(hash)

Examples -
iex> Bonfire.Me.Characters.hash_available?("hash")
+
iex> Bonfire.Me.Characters.hash_available?("hash")
 true
@@ -636,7 +636,7 @@

hash_delete(hash)

Examples -
> Bonfire.Me.Characters.hash_delete("hash")
+
> Bonfire.Me.Characters.hash_delete("hash")
@@ -648,7 +648,7 @@

hash_delete(hash)

indexing_object_format(obj)

- + View Source @@ -692,7 +692,7 @@

q_by_id(ids)

remote_changeset(changeset, params)

- + View Source @@ -752,8 +752,8 @@

update(character, attrs)

Examples -
> Bonfire.Me.Characters.update(%Bonfire.Data.Identity.Character{}, %{field: "value"})
-{:ok, %Bonfire.Data.Identity.Character{}}
+
> Bonfire.Me.Characters.update(%Bonfire.Data.Identity.Character{}, %{field: "value"})
+{:ok, %Bonfire.Data.Identity.Character{}}
@@ -781,7 +781,7 @@

username_available?(username)

Examples -
iex> Bonfire.Me.Characters.username_available?("non_existing_username")
+
iex> Bonfire.Me.Characters.username_available?("non_existing_username")
 true
diff --git a/Bonfire.Me.DeleteWorker.html b/Bonfire.Me.DeleteWorker.html index 1eef02ad13..27587712e7 100644 --- a/Bonfire.Me.DeleteWorker.html +++ b/Bonfire.Me.DeleteWorker.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.DeleteWorker — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.DeleteWorker — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.DeleteWorker - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -193,7 +193,7 @@

-

Callback implementation for Oban.Worker.perform/1.

+

Callback implementation for Oban.Worker.perform/1.

@@ -317,7 +317,7 @@

perform(map)

-

Callback implementation for Oban.Worker.perform/1.

+

Callback implementation for Oban.Worker.perform/1.

diff --git a/Bonfire.Me.Fake.Helpers.html b/Bonfire.Me.Fake.Helpers.html index 52b963f051..c45efcf77a 100644 --- a/Bonfire.Me.Fake.Helpers.html +++ b/Bonfire.Me.Fake.Helpers.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Fake.Helpers — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Fake.Helpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Fake.Helpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Fake.html b/Bonfire.Me.Fake.html index 4df40d586d..c8c8a78eb8 100644 --- a/Bonfire.Me.Fake.html +++ b/Bonfire.Me.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Integration.html b/Bonfire.Me.Integration.html index 3da3bcaa6b..a7ddc01391 100644 --- a/Bonfire.Me.Integration.html +++ b/Bonfire.Me.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Mails.EmailView.html b/Bonfire.Me.Mails.EmailView.html index 0cdc220290..4ef77d5f04 100644 --- a/Bonfire.Me.Mails.EmailView.html +++ b/Bonfire.Me.Mails.EmailView.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Mails.EmailView — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Mails.EmailView — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Mails.EmailView - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Mails.html b/Bonfire.Me.Mails.html index 910b4668c3..317204abd9 100644 --- a/Bonfire.Me.Mails.html +++ b/Bonfire.Me.Mails.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Mails — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Mails — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Mails - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -175,6 +175,14 @@

+
+
+ mailer() + +
+ +
+
render(email, template, assigns \\ []) @@ -217,7 +225,7 @@

confirm_email(account, opts \\ [])

- + View Source @@ -239,12 +247,12 @@

confirm_email(account, opts \\ [])

Examples

-
iex> Bonfire.Me.Mails.confirm_email(%Account{})
+
iex> Bonfire.Me.Mails.confirm_email(%Account{})
 # sends signup confirmation
 
-iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)
+iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)
 
-iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)
+
iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)
@@ -256,7 +264,7 @@

confirm_email(account, opts \\ [])

forgot_password(account)

- + View Source @@ -278,8 +286,30 @@

forgot_password(account)

Examples -
iex> Bonfire.Me.Mails.forgot_password(%Account{email: %{confirm_token: "token"}})
+
iex> Bonfire.Me.Mails.forgot_password(%Account{email: %{confirm_token: "token"}})
 :ok
+
+ +
+ + + +
+ +
@@ -315,7 +345,7 @@

render(email, template, assigns \\ [])

signup_confirm_email(account)

- + View Source @@ -337,7 +367,7 @@

signup_confirm_email(account)

Examples -
iex> Bonfire.Me.Mails.signup_confirm_email(%Account{email: %{confirm_token: "token"}})
+
iex> Bonfire.Me.Mails.signup_confirm_email(%Account{email: %{confirm_token: "token"}})
diff --git a/Bonfire.Me.Profiles.LiveHandler.html b/Bonfire.Me.Profiles.LiveHandler.html index ba5b0ca728..11455f7fa3 100644 --- a/Bonfire.Me.Profiles.LiveHandler.html +++ b/Bonfire.Me.Profiles.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Profiles.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Profiles.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Profiles.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -333,7 +333,7 @@

init(params, socket)

maybe_assign_aliases(socket, user)

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

maybe_assign_aliases(socket, user)

set_image_setting(atom, scope, uploaded_media, settings_key, socket)

- + View Source @@ -425,7 +425,7 @@

sigil_p(route, extra)

user_assigns(user, current_user, follows_me \\ false)

- + View Source diff --git a/Bonfire.Me.Profiles.html b/Bonfire.Me.Profiles.html index 59803a06c8..40a0c88fd8 100644 --- a/Bonfire.Me.Profiles.html +++ b/Bonfire.Me.Profiles.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Profiles — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Profiles — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Profiles - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.RuntimeConfig.html b/Bonfire.Me.RuntimeConfig.html index 6a96209d40..981348863e 100644 --- a/Bonfire.Me.RuntimeConfig.html +++ b/Bonfire.Me.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.SharedUsers.html b/Bonfire.Me.SharedUsers.html index 96003bfec4..e9dad23d5e 100644 --- a/Bonfire.Me.SharedUsers.html +++ b/Bonfire.Me.SharedUsers.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.SharedUsers — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.SharedUsers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.SharedUsers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Me.Users.LiveHandler.html b/Bonfire.Me.Users.LiveHandler.html index 7bcdea818a..adfdd96f64 100644 --- a/Bonfire.Me.Users.LiveHandler.html +++ b/Bonfire.Me.Users.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Users.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Users.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Users.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -225,7 +225,7 @@

disconnect_account_session(conn)

- + View Source @@ -247,7 +247,7 @@

disconnect_account_session(conn)

disconnect_sockets(context)

- + View Source @@ -269,7 +269,7 @@

disconnect_sockets(context)

disconnect_user_session(conn)

- + View Source @@ -337,7 +337,7 @@

sigil_p(route, extra)

to_tuple(u)

- + View Source diff --git a/Bonfire.Me.Users.Queries.html b/Bonfire.Me.Users.Queries.html index ed3e196994..a47881f117 100644 --- a/Bonfire.Me.Users.Queries.html +++ b/Bonfire.Me.Users.Queries.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Users.Queries — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Users.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Users.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -435,7 +435,7 @@

by_account(account_id)

Examples -
iex> Bonfire.Me.Users.Queries.by_account("account_id")
+
iex> Bonfire.Me.Users.Queries.by_account("account_id")
@@ -465,7 +465,7 @@

by_canonical_uri(canonical_uri, opts \\ []) Examples

-
iex> Bonfire.Me.Users.Queries.by_canonical_uri("canonical_uri")
+
iex> Bonfire.Me.Users.Queries.by_canonical_uri("canonical_uri")
@@ -495,7 +495,7 @@

by_id(id, opts \\ [])

Examples -
iex> Bonfire.Me.Users.Queries.by_id("user_id")
+
iex> Bonfire.Me.Users.Queries.by_id("user_id")
@@ -523,7 +523,7 @@

by_user_and_account(username_or_user_id, ac Examples

-
iex> Bonfire.Me.Users.Queries.by_user_and_account("username_or_user_id", "account_id")
+
iex> Bonfire.Me.Users.Queries.by_user_and_account("username_or_user_id", "account_id")
@@ -553,7 +553,7 @@

by_username_or_id(username_or_id, opts \\ [ Examples

-
iex> Bonfire.Me.Users.Queries.by_username_or_id("username_or_id")
+
iex> Bonfire.Me.Users.Queries.by_username_or_id("username_or_id")
@@ -583,7 +583,7 @@

by_username_query(username, opts \\ [])

Examples -
iex> Bonfire.Me.Users.Queries.by_username_query("username")
+
iex> Bonfire.Me.Users.Queries.by_username_query("username")
@@ -633,11 +633,11 @@

count(arg1)

Examples -
iex> Bonfire.Me.Users.Queries.count(:all)
+
iex> Bonfire.Me.Users.Queries.count(:all)
 
-iex> Bonfire.Me.Users.Queries.count(:local)
+iex> Bonfire.Me.Users.Queries.count(:local)
 
-iex> Bonfire.Me.Users.Queries.count(:remote)
+
iex> Bonfire.Me.Users.Queries.count(:remote)
@@ -665,7 +665,7 @@

current(user_id)

Examples -
iex> Bonfire.Me.Users.Queries.current("user_id")
+
iex> Bonfire.Me.Users.Queries.current("user_id")
@@ -693,7 +693,7 @@

current(user_id, account_id)

Examples -
iex> Bonfire.Me.Users.Queries.current("user_id", "account_id")
+
iex> Bonfire.Me.Users.Queries.current("user_id", "account_id")
@@ -743,13 +743,13 @@

list(arg1)

Examples -
iex> Bonfire.Me.Users.Queries.list(:all)
+
iex> Bonfire.Me.Users.Queries.list(:all)
 
-iex> Bonfire.Me.Users.Queries.list(:local)
+iex> Bonfire.Me.Users.Queries.list(:local)
 
-iex> Bonfire.Me.Users.Queries.list(:remote)
+iex> Bonfire.Me.Users.Queries.list(:remote)
 
-iex> Bonfire.Me.Users.Queries.list({:instance, "instance_id"})
+
iex> Bonfire.Me.Users.Queries.list({:instance, "instance_id"})
@@ -779,12 +779,12 @@

query(filters, opts \\ [])

Examples -
iex> Bonfire.Me.Users.Queries.query(id: "some_id")
+
iex> Bonfire.Me.Users.Queries.query(id: "some_id")
 
-iex> Bonfire.Me.Users.Queries.query(username: "some_username")
+iex> Bonfire.Me.Users.Queries.query(username: "some_username")
 
-iex> Bonfire.Me.Users.Queries.query(:invalid_filter)
-{:error, "Could not query"}
+
iex> Bonfire.Me.Users.Queries.query(:invalid_filter) +{:error, "Could not query"}
@@ -836,7 +836,7 @@

search(text, opts \\ [])

Examples -
iex> Bonfire.Me.Users.Queries.search("userna")
+
iex> Bonfire.Me.Users.Queries.search("userna")
diff --git a/Bonfire.Me.Users.html b/Bonfire.Me.Users.html index f25ec7f704..4ae8093cf5 100644 --- a/Bonfire.Me.Users.html +++ b/Bonfire.Me.Users.html @@ -5,16 +5,16 @@ - + - Bonfire.Me.Users — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me.Users — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me.Users - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -749,11 +749,11 @@

by_account(account)

Examples -
> Bonfire.Me.Users.by_account(%Bonfire.Data.Identity.Account{id: "account_id"})
-[%Bonfire.Data.Identity.User{}]
+
> Bonfire.Me.Users.by_account(%Bonfire.Data.Identity.Account{id: "account_id"})
+[%Bonfire.Data.Identity.User{}]
 
-> Bonfire.Me.Users.by_account!("account_id")
-[%Bonfire.Data.Identity.User{}]
+
> Bonfire.Me.Users.by_account!("account_id") +[%Bonfire.Data.Identity.User{}]
@@ -847,8 +847,8 @@

by_canonical_uri(uri)

Examples -
> Bonfire.Me.Users.by_canonical_uri("http://example.com")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.by_canonical_uri("http://example.com")
+%Bonfire.Data.Identity.User{}
@@ -878,11 +878,11 @@

by_id(id, opts \\ [])

Examples -
> Bonfire.Me.Users.by_id("user_id")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.by_id("user_id")
+%Bonfire.Data.Identity.User{}
 
-> Bonfire.Me.Users.by_id(["user_id"])
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.by_id(["user_id"]) +%Bonfire.Data.Identity.User{}
@@ -910,8 +910,8 @@

by_user_and_account(username_or_user_id, ac Examples

-
> Bonfire.Me.Users.by_user_and_account("username", "account_id")
-{:ok, %Bonfire.Data.Identity.User{}}
+
> Bonfire.Me.Users.by_user_and_account("username", "account_id")
+{:ok, %Bonfire.Data.Identity.User{}}
@@ -941,8 +941,8 @@

by_username(username, opts \\ [])

Examples -
> Bonfire.Me.Users.by_username("username")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.by_username("username")
+%Bonfire.Data.Identity.User{}
@@ -970,8 +970,8 @@

by_username!(username)

Examples -
> Bonfire.Me.Users.by_username!("username")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.by_username!("username")
+%Bonfire.Data.Identity.User{}
@@ -1002,7 +1002,7 @@

changeset(name, user \\ %User{}, params, ex user :: Bonfire.Data.Identity.User.t(), params :: map(), extra :: Bonfire.Data.Identity.Account.t() | :remote -) :: Ecto.Changeset.t()

+) :: Ecto.Changeset.t()
@@ -1034,11 +1034,11 @@

check_active(users)

Examples -
iex> Bonfire.Me.Users.check_active([user1])
-[{:ok, %Bonfire.Data.Identity.User{}}]
+
iex> Bonfire.Me.Users.check_active([user1])
+[{:ok, %Bonfire.Data.Identity.User{}}]
 
-iex> Bonfire.Me.Users.check_active(user)
-{:ok, %Bonfire.Data.Identity.User{}}
+
iex> Bonfire.Me.Users.check_active(user) +{:ok, %Bonfire.Data.Identity.User{}}
@@ -1202,8 +1202,8 @@

fetch_current(id)

Examples -
> Bonfire.Me.Users.fetch_current("user_id")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.fetch_current("user_id")
+%Bonfire.Data.Identity.User{}
@@ -1275,11 +1275,11 @@

get_current(id)

Examples -
iex> Bonfire.Me.Users.get_current(nil)
+
iex> Bonfire.Me.Users.get_current(nil)
 nil
 
-> Bonfire.Me.Users.get_current("user_id")
-%Bonfire.Data.Identity.User{}
+
> Bonfire.Me.Users.get_current("user_id") +%Bonfire.Data.Identity.User{}
@@ -1439,7 +1439,7 @@

is_active?(user)

Examples -
> Bonfire.Me.Users.is_active?(user)
+
> Bonfire.Me.Users.is_active?(user)
@@ -1761,8 +1761,8 @@

search(search, opts \\ [])

Examples -
> Bonfire.Me.Users.search("username")
-[%Bonfire.Data.Identity.User{}]
+
> Bonfire.Me.Users.search("username")
+[%Bonfire.Data.Identity.User{}]
@@ -1792,8 +1792,8 @@

search_query(search, opts \\ [])

Examples -
> Bonfire.Me.Users.search_query("search_term")
-%Ecto.Query{}
+
> Bonfire.Me.Users.search_query("search_term")
+%Ecto.Query{}
diff --git a/Bonfire.Me.html b/Bonfire.Me.html index b539155548..86244e8c90 100644 --- a/Bonfire.Me.html +++ b/Bonfire.Me.html @@ -5,16 +5,16 @@ - + - Bonfire.Me — Bonfire v0.9.10-classic-beta.156 + Bonfire.Me — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Me - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Messages.Fake.html b/Bonfire.Messages.Fake.html index c422de0930..f95df4008c 100644 --- a/Bonfire.Messages.Fake.html +++ b/Bonfire.Messages.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Messages.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Messages.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Messages.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Messages.Integration.html b/Bonfire.Messages.Integration.html index 986531158e..9e0d0f3b71 100644 --- a/Bonfire.Messages.Integration.html +++ b/Bonfire.Messages.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.Messages.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.Messages.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Messages.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Messages.LiveHandler.html b/Bonfire.Messages.LiveHandler.html index 2bb479c6b6..8c9e4b89dd 100644 --- a/Bonfire.Messages.LiveHandler.html +++ b/Bonfire.Messages.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Messages.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Messages.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Messages.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -345,7 +345,7 @@

live_more(context, opts, socket)

send_message(params, socket)

- + View Source diff --git a/Bonfire.Messages.html b/Bonfire.Messages.html index c69ff0de3a..fed925c2f1 100644 --- a/Bonfire.Messages.html +++ b/Bonfire.Messages.html @@ -5,16 +5,16 @@ - + - Bonfire.Messages — Bonfire v0.9.10-classic-beta.156 + Bonfire.Messages — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Messages - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -324,7 +324,7 @@

ap_publish_activity(subject, verb, message) Examples

-
iex> Bonfire.Messages.ap_publish_activity(subject, verb, message)
+
iex> Bonfire.Messages.ap_publish_activity(subject, verb, message)
@@ -352,7 +352,7 @@

ap_receive_activity(creator, activity, obje Examples

-
iex> Bonfire.Messages.ap_receive_activity(creator, activity, object)
+
iex> Bonfire.Messages.ap_receive_activity(creator, activity, object)
@@ -404,8 +404,8 @@

draft(context, attrs)

Examples -
iex> Bonfire.Messages.draft(creator, attrs)
-{:ok, %Message{}}
+
iex> Bonfire.Messages.draft(creator, attrs)
+{:ok, %Message{}}
@@ -481,8 +481,8 @@

list(current_user, with_user \\ nil, opts \ Examples

-
iex> Bonfire.Messages.list(current_user)
-[%Message{}]
+
iex> Bonfire.Messages.list(current_user)
+[%Message{}]
@@ -554,8 +554,8 @@

read(message_id, opts)

Examples -
iex> Bonfire.Messages.read(message_id, current_user: me)
-%Message{}
+
iex> Bonfire.Messages.read(message_id, current_user: me)
+%Message{}
@@ -607,7 +607,7 @@

send(sender_or_context, attrs, to \\ nil) Examples

-
iex> Bonfire.Messages.send(me, %{post_content: %{html_body: "test message"}}, to_user_id)
+
iex> Bonfire.Messages.send(me, %{post_content: %{html_body: "test message"}}, to_user_id)
diff --git a/Bonfire.OpenID.Client.html b/Bonfire.OpenID.Client.html index 75be8eb8c2..e32ffb3669 100644 --- a/Bonfire.OpenID.Client.html +++ b/Bonfire.OpenID.Client.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Client — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Client — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Client - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Fake.html b/Bonfire.OpenID.Fake.html index d8f0212a1e..6c6b7eefdc 100644 --- a/Bonfire.OpenID.Fake.html +++ b/Bonfire.OpenID.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Plugs.AuthRequired.html b/Bonfire.OpenID.Plugs.AuthRequired.html index a3edb47719..a7a6872685 100644 --- a/Bonfire.OpenID.Plugs.AuthRequired.html +++ b/Bonfire.OpenID.Plugs.AuthRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Plugs.AuthRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Plugs.AuthRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Plugs.AuthRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Plugs.Authorize.html b/Bonfire.OpenID.Plugs.Authorize.html index 0df6006622..3a789493bc 100644 --- a/Bonfire.OpenID.Plugs.Authorize.html +++ b/Bonfire.OpenID.Plugs.Authorize.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Plugs.Authorize — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Plugs.Authorize — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Plugs.Authorize - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Plugs.ClientID.html b/Bonfire.OpenID.Plugs.ClientID.html index 04328b6dcc..808f3d9b4a 100644 --- a/Bonfire.OpenID.Plugs.ClientID.html +++ b/Bonfire.OpenID.Plugs.ClientID.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Plugs.ClientID — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Plugs.ClientID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Plugs.ClientID - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Provider.ClientApps.html b/Bonfire.OpenID.Provider.ClientApps.html index 69f9afe30c..c36f7c8159 100644 --- a/Bonfire.OpenID.Provider.ClientApps.html +++ b/Bonfire.OpenID.Provider.ClientApps.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Provider.ClientApps — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Provider.ClientApps — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Provider.ClientApps - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Provider.OAuth.html b/Bonfire.OpenID.Provider.OAuth.html index 7f5fda3a43..ac5c5c1603 100644 --- a/Bonfire.OpenID.Provider.OAuth.html +++ b/Bonfire.OpenID.Provider.OAuth.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Provider.OAuth — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Provider.OAuth — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Provider.OAuth - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.RuntimeConfig.html b/Bonfire.OpenID.RuntimeConfig.html index d02dd789d0..78a3282a60 100644 --- a/Bonfire.OpenID.RuntimeConfig.html +++ b/Bonfire.OpenID.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.Web.Routes.html b/Bonfire.OpenID.Web.Routes.html index 14c0eace22..1ddc6f9597 100644 --- a/Bonfire.OpenID.Web.Routes.html +++ b/Bonfire.OpenID.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenID.html b/Bonfire.OpenID.html index f182538a23..515d580b2e 100644 --- a/Bonfire.OpenID.html +++ b/Bonfire.OpenID.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenID - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenId.html b/Bonfire.OpenId.html index 8d412c0437..371c93e1e1 100644 --- a/Bonfire.OpenId.html +++ b/Bonfire.OpenId.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenID — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.OpenScience.APIs.html b/Bonfire.OpenScience.APIs.html index 61c97a2e84..feb9e299c6 100644 --- a/Bonfire.OpenScience.APIs.html +++ b/Bonfire.OpenScience.APIs.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenScience.APIs — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenScience.APIs — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenScience.APIs - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

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

fetch_crossref(url)

fetch_orcid_for_all_known_scientists(opts \\ [])

- + View Source @@ -373,7 +373,7 @@

fetch_orcid_for_all_known_scientists(opts \

fetch_orcid_latest(user, media, opts \\ [])

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

fetch_orcid_record(user, orcid_user_media,

fetch_orcid_works(user, orcid_user_media, opts \\ [])

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

fetch_orcid_works(user, orcid_user_media, o

find_orcid_id(aliases)

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

maybe_fetch(url)

open_alex_fetch_topics(orcid_id)

- + View Source @@ -641,7 +641,7 @@

pub_uri_matchers()

trigger(atom, user, media)

- + View Source diff --git a/Bonfire.OpenScience.Fake.html b/Bonfire.OpenScience.Fake.html index 5873dd4631..ac2ce1db53 100644 --- a/Bonfire.OpenScience.Fake.html +++ b/Bonfire.OpenScience.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenScience.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenScience.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenScience.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenScience.RuntimeConfig.html b/Bonfire.OpenScience.RuntimeConfig.html index a70351883e..94bcee0e41 100644 --- a/Bonfire.OpenScience.RuntimeConfig.html +++ b/Bonfire.OpenScience.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenScience.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenScience.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenScience.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenScience.Web.Routes.html b/Bonfire.OpenScience.Web.Routes.html index 9f711e1121..27962cb137 100644 --- a/Bonfire.OpenScience.Web.Routes.html +++ b/Bonfire.OpenScience.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenScience.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenScience.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenScience.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.OpenScience.html b/Bonfire.OpenScience.html index a0447ee632..1b5275f08b 100644 --- a/Bonfire.OpenScience.html +++ b/Bonfire.OpenScience.html @@ -5,16 +5,16 @@ - + - Bonfire.OpenScience — Bonfire v0.9.10-classic-beta.156 + Bonfire.OpenScience — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.OpenScience - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Acts.Page.Create.html b/Bonfire.Pages.Acts.Page.Create.html index 27357d3393..e891e35aa2 100644 --- a/Bonfire.Pages.Acts.Page.Create.html +++ b/Bonfire.Pages.Acts.Page.Create.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Acts.Page.Create — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Acts.Page.Create — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Acts.Page.Create - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Acts.Section.Upsert.html b/Bonfire.Pages.Acts.Section.Upsert.html index ecbbb07755..2573b98e0a 100644 --- a/Bonfire.Pages.Acts.Section.Upsert.html +++ b/Bonfire.Pages.Acts.Section.Upsert.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Acts.Section.Upsert — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Acts.Section.Upsert — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Acts.Section.Upsert - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.LiveHandler.html b/Bonfire.Pages.LiveHandler.html index 5dffb7dadd..22eed3fbe5 100644 --- a/Bonfire.Pages.LiveHandler.html +++ b/Bonfire.Pages.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Page.html b/Bonfire.Pages.Page.html index 35bf49237d..387c841da9 100644 --- a/Bonfire.Pages.Page.html +++ b/Bonfire.Pages.Page.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Page — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Page — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Page - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Section.html b/Bonfire.Pages.Section.html index cbe4a5d6f6..0afda58bfa 100644 --- a/Bonfire.Pages.Section.html +++ b/Bonfire.Pages.Section.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Section — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Section — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Section - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Sections.html b/Bonfire.Pages.Sections.html index 21794514a1..c3065a4568 100644 --- a/Bonfire.Pages.Sections.html +++ b/Bonfire.Pages.Sections.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Sections — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Sections — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Sections - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.Web.Routes.html b/Bonfire.Pages.Web.Routes.html index 8a95c2b28f..16ccbf2fde 100644 --- a/Bonfire.Pages.Web.Routes.html +++ b/Bonfire.Pages.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Pages.html b/Bonfire.Pages.html index 6bad249b75..2a754f7dd2 100644 --- a/Bonfire.Pages.html +++ b/Bonfire.Pages.html @@ -5,16 +5,16 @@ - + - Bonfire.Pages — Bonfire v0.9.10-classic-beta.156 + Bonfire.Pages — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Pages - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Acts.Choices.Upsert.html b/Bonfire.Poll.Acts.Choices.Upsert.html index 00807f068d..2a3f8bef69 100644 --- a/Bonfire.Poll.Acts.Choices.Upsert.html +++ b/Bonfire.Poll.Acts.Choices.Upsert.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Acts.Choices.Upsert — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Acts.Choices.Upsert — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Acts.Choices.Upsert - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Choice.html b/Bonfire.Poll.Choice.html index d628a8e403..8b9b984f21 100644 --- a/Bonfire.Poll.Choice.html +++ b/Bonfire.Poll.Choice.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Choice — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Choice — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Choice - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Choices.html b/Bonfire.Poll.Choices.html index 39653ea8f5..53937f64d0 100644 --- a/Bonfire.Poll.Choices.html +++ b/Bonfire.Poll.Choices.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Choices — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Choices — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Choices - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Fake.html b/Bonfire.Poll.Fake.html index 534eabb6d2..35480ae89f 100644 --- a/Bonfire.Poll.Fake.html +++ b/Bonfire.Poll.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.LiveHandler.html b/Bonfire.Poll.LiveHandler.html index bf5127eb84..a0fd5c7430 100644 --- a/Bonfire.Poll.LiveHandler.html +++ b/Bonfire.Poll.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Question.Create.html b/Bonfire.Poll.Question.Create.html index b5087567ca..ebeda5b5d5 100644 --- a/Bonfire.Poll.Question.Create.html +++ b/Bonfire.Poll.Question.Create.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Question.Create — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Question.Create — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Question.Create - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Question.html b/Bonfire.Poll.Question.html index b27f50e3e8..c38001f846 100644 --- a/Bonfire.Poll.Question.html +++ b/Bonfire.Poll.Question.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Question — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Question — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Question - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Questions.html b/Bonfire.Poll.Questions.html index e154757d49..8daf8faff4 100644 --- a/Bonfire.Poll.Questions.html +++ b/Bonfire.Poll.Questions.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Questions — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Questions — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Questions - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.RuntimeConfig.html b/Bonfire.Poll.RuntimeConfig.html index c99fd9f3a3..f08092eefe 100644 --- a/Bonfire.Poll.RuntimeConfig.html +++ b/Bonfire.Poll.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Vote.html b/Bonfire.Poll.Vote.html index 98add4da03..76f88536e6 100644 --- a/Bonfire.Poll.Vote.html +++ b/Bonfire.Poll.Vote.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Vote — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Vote — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Vote - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Votes.html b/Bonfire.Poll.Votes.html index e055fda0b6..a40b2a3026 100644 --- a/Bonfire.Poll.Votes.html +++ b/Bonfire.Poll.Votes.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Votes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Votes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Votes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.Web.Routes.html b/Bonfire.Poll.Web.Routes.html index c97b40f18d..63ee6d434f 100644 --- a/Bonfire.Poll.Web.Routes.html +++ b/Bonfire.Poll.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Poll.html b/Bonfire.Poll.html index d16b503424..5694889411 100644 --- a/Bonfire.Poll.html +++ b/Bonfire.Poll.html @@ -5,16 +5,16 @@ - + - Bonfire.Poll — Bonfire v0.9.10-classic-beta.156 + Bonfire.Poll — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Poll - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Posts.Acts.Posts.Publish.html b/Bonfire.Posts.Acts.Posts.Publish.html index 9ac58aa447..415b956e22 100644 --- a/Bonfire.Posts.Acts.Posts.Publish.html +++ b/Bonfire.Posts.Acts.Posts.Publish.html @@ -5,16 +5,16 @@ - + - Bonfire.Posts.Acts.Posts.Publish — Bonfire v0.9.10-classic-beta.156 + Bonfire.Posts.Acts.Posts.Publish — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Posts.Acts.Posts.Publish - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Posts.Fake.html b/Bonfire.Posts.Fake.html index da4cff7fca..ba077927da 100644 --- a/Bonfire.Posts.Fake.html +++ b/Bonfire.Posts.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Posts.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Posts.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Posts.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Posts.Integration.html b/Bonfire.Posts.Integration.html index 88ddc017b2..c3c10c1f33 100644 --- a/Bonfire.Posts.Integration.html +++ b/Bonfire.Posts.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.Posts.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.Posts.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Posts.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Posts.LiveHandler.html b/Bonfire.Posts.LiveHandler.html index 44745b499d..0a84e96405 100644 --- a/Bonfire.Posts.LiveHandler.html +++ b/Bonfire.Posts.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Posts.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Posts.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Posts.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Posts.html b/Bonfire.Posts.html index d9c86a1156..bfa94b595f 100644 --- a/Bonfire.Posts.html +++ b/Bonfire.Posts.html @@ -5,16 +5,16 @@ - + - Bonfire.Posts — Bonfire v0.9.10-classic-beta.156 + Bonfire.Posts — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Posts - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -186,7 +186,7 @@

@@ -418,20 +418,18 @@

ap_publish_activity(subject, verb, post) Examples

-
iex> Bonfire.Posts.ap_publish_activity(user, :create, post)
-{:ok, %ActivityPub.Activity{}}
+
iex> Bonfire.Posts.ap_publish_activity(user, :create, post)
+{:ok, %ActivityPub.Activity{}}
-
- - +
- + Link to this function -

ap_receive_activity(creator, activity, object, circles \\ [])

+

ap_receive_activity(creator, ap_activity, ap_object)

@@ -443,26 +441,26 @@

ap_receive_activity(creator, activity, obje
-

Receives an incoming ActivityPub post.

- +

Receives an incoming ActivityPub post.

+ Parameters

-
  • creator: The creator of the post.
  • activity: The ActivityPub activity.
  • object: The ActivityPub object.
  • circles: The circles to publish to (default: []).

- +
  • creator: The creator of the post.
  • activity: The ActivityPub activity.
  • object: The ActivityPub object.
  • circles: The circles to publish to (default: []).

+ Returns

-

{:ok, post} on success, {:error, reason} on failure.

- +

{:ok, post} on success, {:error, reason} on failure.

+ Examples

-
iex> Bonfire.Posts.ap_receive_activity(creator, activity, object)
-{:ok, %Post{}}
+
iex> Bonfire.Posts.ap_receive_activity(creator, activity, object)
+{:ok, %Post{}}

@@ -506,7 +504,7 @@

changeset(action, attrs, creator \\ nil, pr Examples

-
iex> Bonfire.Posts.changeset(:create, %{title: "New Post"})
+
iex> Bonfire.Posts.changeset(:create, %{title: "New Post"})
@@ -570,8 +568,8 @@

delete(object, opts \\ [])

Examples

-
iex> Bonfire.Posts.delete(post)
-{:ok, %Post{}}
+
iex> Bonfire.Posts.delete(post)
+{:ok, %Post{}}
@@ -663,8 +661,8 @@

indexing_object_format(post, opts \\ []) Examples

-
iex> Bonfire.Posts.indexing_object_format(post)
-%{id: "post_123", index_type: "Bonfire.Data.Social.Post", post_content: %{}, created: %{}, tags: []}
+
iex> Bonfire.Posts.indexing_object_format(post)
+%{id: "post_123", index_type: "Bonfire.Data.Social.Post", post_content: %{}, created: %{}, tags: []}
@@ -706,8 +704,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Posts.list_by(user)
-[%Post{}, %Post{}]
+
iex> Bonfire.Posts.list_by(user)
+[%Post{}, %Post{}]
@@ -749,8 +747,8 @@

list_paginated(filters, opts \\ [])

Examples -
iex> Bonfire.Posts.list_paginated([])
-%{edges: [%Post{}, %Post{}], page_info: %{}}
+
iex> Bonfire.Posts.list_paginated([])
+%{edges: [%Post{}, %Post{}], page_info: %{}}
@@ -812,16 +810,16 @@

publish(opts)

Examples -
iex> Bonfire.Posts.publish(
+
iex> Bonfire.Posts.publish(
   current_user: me, 
   boundary: "public",
-  post_attrs: %{
-    post_content: %{
+  post_attrs: %{
+    post_content: %{
       name: "test post title",
       html_body: "<p>epic html message</p>"
-    }
-  })
-{:ok, %Post{}}
+
} + }) +{:ok, %Post{}}
@@ -865,8 +863,8 @@

query(filters \\ [], opts \\ nil)

Examples -
iex> Bonfire.Posts.query([id: "post_123"])
-#Ecto.Query<>
+
iex> Bonfire.Posts.query([id: "post_123"])
+#Ecto.Query<>
@@ -930,8 +928,8 @@

query_paginated(filters, opts \\ [])

Examples -
iex> Bonfire.Posts.query_paginated([])
-#Ecto.Query<>
+
iex> Bonfire.Posts.query_paginated([])
+#Ecto.Query<>
@@ -973,8 +971,8 @@

read(post_id, opts \\ [])

Examples -
iex> Bonfire.Posts.read("post_123")
-%Post{}
+
iex> Bonfire.Posts.read("post_123")
+%Post{}
@@ -1018,8 +1016,8 @@

run_epic(type, options \\ [], on \\ :post)< Examples

-
iex> Bonfire.Posts.run_epic(:publish, [])
-{:ok, %Post{}}
+
iex> Bonfire.Posts.run_epic(:publish, [])
+{:ok, %Post{}}
@@ -1083,8 +1081,8 @@

search(search, opts \\ [])

Examples -
iex> Bonfire.Posts.search("example")
-[%Post{}, %Post{}]
+
iex> Bonfire.Posts.search("example")
+[%Post{}, %Post{}]
diff --git a/Bonfire.Quantify.GraphQL.Hydration.html b/Bonfire.Quantify.GraphQL.Hydration.html index 65f7a91085..3313b376ce 100644 --- a/Bonfire.Quantify.GraphQL.Hydration.html +++ b/Bonfire.Quantify.GraphQL.Hydration.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.GraphQL.Hydration — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.GraphQL.Hydration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.GraphQL.Hydration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Measure.html b/Bonfire.Quantify.Measure.html index b28eeec401..081d80dd20 100644 --- a/Bonfire.Quantify.Measure.html +++ b/Bonfire.Quantify.Measure.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Measure — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Measure — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Measure - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Measures.Queries.html b/Bonfire.Quantify.Measures.Queries.html index 9c5e04abc5..33e408a1ab 100644 --- a/Bonfire.Quantify.Measures.Queries.html +++ b/Bonfire.Quantify.Measures.Queries.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Measures.Queries — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Measures.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Measures.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Measures.html b/Bonfire.Quantify.Measures.html index f3a98b9742..be865aceb2 100644 --- a/Bonfire.Quantify.Measures.html +++ b/Bonfire.Quantify.Measures.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Measures — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Measures — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Measures - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Simulate.html b/Bonfire.Quantify.Simulate.html index 497f0395bf..881a6ec629 100644 --- a/Bonfire.Quantify.Simulate.html +++ b/Bonfire.Quantify.Simulate.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Simulate — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Simulate — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Simulate - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Unit.html b/Bonfire.Quantify.Unit.html index 718462218c..7db266d6ca 100644 --- a/Bonfire.Quantify.Unit.html +++ b/Bonfire.Quantify.Unit.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Unit — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Unit — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Unit - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Units.Queries.html b/Bonfire.Quantify.Units.Queries.html index 3039bdf7d9..4cd053146c 100644 --- a/Bonfire.Quantify.Units.Queries.html +++ b/Bonfire.Quantify.Units.Queries.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Units.Queries — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Units.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Units.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.Units.html b/Bonfire.Quantify.Units.html index a42f096840..1a17fe45b5 100644 --- a/Bonfire.Quantify.Units.html +++ b/Bonfire.Quantify.Units.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify.Units — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify.Units — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify.Units - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Quantify.html b/Bonfire.Quantify.html index d3fd2ab188..7593b6c981 100644 --- a/Bonfire.Quantify.html +++ b/Bonfire.Quantify.html @@ -5,16 +5,16 @@ - + - Bonfire.Quantify — Bonfire v0.9.10-classic-beta.156 + Bonfire.Quantify — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Quantify - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.RuntimeConfig.html b/Bonfire.RuntimeConfig.html index 0151fff7b7..0974d4d2ff 100644 --- a/Bonfire.RuntimeConfig.html +++ b/Bonfire.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.Acts.Queue.html b/Bonfire.Search.Acts.Queue.html index 3d8c530152..732248c963 100644 --- a/Bonfire.Search.Acts.Queue.html +++ b/Bonfire.Search.Acts.Queue.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Acts.Queue — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Acts.Queue — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.Acts.Queue - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.Fuzzy.html b/Bonfire.Search.Fuzzy.html index 94bd0dc523..3363a9df3e 100644 --- a/Bonfire.Search.Fuzzy.html +++ b/Bonfire.Search.Fuzzy.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Fuzzy — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Fuzzy — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.Fuzzy - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.HTTP.html b/Bonfire.Search.HTTP.html index a098807aca..eb588831d3 100644 --- a/Bonfire.Search.HTTP.html +++ b/Bonfire.Search.HTTP.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.HTTP — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.HTTP — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.HTTP - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.Indexer.html b/Bonfire.Search.Indexer.html index 5397413e8b..86bcf3b904 100644 --- a/Bonfire.Search.Indexer.html +++ b/Bonfire.Search.Indexer.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Indexer — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Indexer — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.Indexer - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.LiveHandler.html b/Bonfire.Search.LiveHandler.html index 09120aace9..0b7d792298 100644 --- a/Bonfire.Search.LiveHandler.html +++ b/Bonfire.Search.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -126,13 +126,13 @@

- + View Source Bonfire.Search.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -205,7 +205,7 @@

content_live_search(q, search_limit, facet_filters, extra_results, socket, opts)

- + View Source @@ -227,7 +227,7 @@

content_live_search(q, search_limit, facet_

handle_event(binary, params, socket)

- + View Source @@ -253,7 +253,7 @@

handle_event(binary, params, socket)

live_search(q, search_limit \\ 20, facet_filters \\ nil, socket)

- + View Source @@ -275,7 +275,7 @@

live_search(q, search_limit \\ 20, facet_fi

sigil_p(route, extra)

- + View Source diff --git a/Bonfire.Search.Meili.html b/Bonfire.Search.Meili.html index 1c01992b1d..97abb8fa60 100644 --- a/Bonfire.Search.Meili.html +++ b/Bonfire.Search.Meili.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Meili — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Meili — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Search.Meili - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.RuntimeConfig.html b/Bonfire.Search.RuntimeConfig.html index b3de363f18..f725230946 100644 --- a/Bonfire.Search.RuntimeConfig.html +++ b/Bonfire.Search.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.Stopwords.html b/Bonfire.Search.Stopwords.html index 25c72aee00..b5c174fc00 100644 --- a/Bonfire.Search.Stopwords.html +++ b/Bonfire.Search.Stopwords.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Stopwords — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Stopwords — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.Stopwords - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.Web.Routes.html b/Bonfire.Search.Web.Routes.html index 5cfd7aedc5..828f753426 100644 --- a/Bonfire.Search.Web.Routes.html +++ b/Bonfire.Search.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Search.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Search.html b/Bonfire.Search.html index 722c265d9c..6a30e2a2ea 100644 --- a/Bonfire.Search.html +++ b/Bonfire.Search.html @@ -5,16 +5,16 @@ - + - Bonfire.Search — Bonfire v0.9.10-classic-beta.156 + Bonfire.Search — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Search - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Seeder.html b/Bonfire.Seeder.html index bb4e04cff8..cafd28e90b 100644 --- a/Bonfire.Seeder.html +++ b/Bonfire.Seeder.html @@ -5,16 +5,16 @@ - + - Bonfire.Seeder — Bonfire v0.9.10-classic-beta.156 + Bonfire.Seeder — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Seeder - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.APActivities.html b/Bonfire.Social.APActivities.html index 19ce2e3dcb..82cbf23bb1 100644 --- a/Bonfire.Social.APActivities.html +++ b/Bonfire.Social.APActivities.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.APActivities — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.APActivities — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.APActivities - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -220,11 +220,11 @@

ap_receive_activity(creator, activity, obje Examples

-
iex> creator = %Character{id: "user123"}
-iex> activity = %{data: %{"type" => "Create"}}
-iex> object = %{data: %{"type" => "Note", "content" => "Hello, fediverse!"}}
-iex> Bonfire.Social.APActivities.ap_receive_activity(creator, activity, object)
-{:ok, %APActivity{}}
+
iex> creator = %Character{id: "user123"}
+iex> activity = %{data: %{"type" => "Create"}}
+iex> object = %{data: %{"type" => "Note", "content" => "Hello, fediverse!"}}
+iex> Bonfire.Social.APActivities.ap_receive_activity(creator, activity, object)
+{:ok, %APActivity{}}
@@ -260,14 +260,14 @@

create(character, activity, object, public Examples

-
iex> character = %Character{id: "user123"}
-iex> activity = %{data: %{"type" => "Create", "object" => %{"content" => "Hello, world!"}}}
-iex> object = %{data: %{"type" => "Note"}}
-iex> Bonfire.Social.APActivities.create(character, activity, object)
-{:ok, %APActivity{}}
-
-iex> Bonfire.Social.APActivities.create(character, activity, object, true)
-{:ok, %APActivity{}}
+
iex> character = %Character{id: "user123"}
+iex> activity = %{data: %{"type" => "Create", "object" => %{"content" => "Hello, world!"}}}
+iex> object = %{data: %{"type" => "Note"}}
+iex> Bonfire.Social.APActivities.create(character, activity, object)
+{:ok, %APActivity{}}
+
+iex> Bonfire.Social.APActivities.create(character, activity, object, true)
+{:ok, %APActivity{}}
diff --git a/Bonfire.Social.Activities.html b/Bonfire.Social.Activities.html index 516380edea..448e33853b 100644 --- a/Bonfire.Social.Activities.html +++ b/Bonfire.Social.Activities.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Activities — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Activities — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Activities - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -630,7 +630,7 @@

activity_preloads(query_or_object_or_object Examples

-
iex> activity_preloads(query, preload: [])
+
iex> activity_preloads(query, preload: [])
 # Query with applied activity preloads
@@ -659,16 +659,16 @@

activity_preloads(query_or_object_or_object Examples

-
> activity_preloads(query, [], [])
+
> activity_preloads(query, [], [])
 # Original query, with no extra joins/preloads
 
-> activity_preloads(object, [], [])
+> activity_preloads(object, [], [])
 # Original object, with no extra assocs preloads
 
-> activity_preloads(object_or_query, [:with_creator], [])
+> activity_preloads(object_or_query, [:with_creator], [])
 # Object or query with extra assocs preloads
 
-> activity_preloads(object_or_query, [:feed, :with_reply_to, :with_media, :with_object_more, :maybe_with_labelled])
+> activity_preloads(object_or_query, [:feed, :with_reply_to, :with_media, :with_object_more, :maybe_with_labelled])
 # Object or query several extra assoc preloads

Other possible preloads:

:default
 :all
 :feed
@@ -723,8 +723,8 @@ 

activity_under_object(top_object)

Examples -
iex> activity_under_object(%{activity: %{id: 2, object: %{id: 1}}})
-%{id: 1, activity: %{id: 2}}
+
iex> activity_under_object(%{activity: %{id: 2, object: %{id: 1}}})
+%{id: 1, activity: %{id: 2}}
@@ -844,7 +844,7 @@

as_permitted_for(q, opts \\ [], verbs \\ [: Examples

-
> as_permitted_for(query, [])
+
> as_permitted_for(query, [])
 # Filtered query
@@ -939,7 +939,7 @@

cast(changeset, verb, creator, opts)

Examples -
> cast(changeset, :like, %User{}, feed_ids: [])
+
> cast(changeset, :like, %User{}, feed_ids: [])
 # Changeset with associations set
@@ -993,8 +993,8 @@

create(subject, verb, object, activity_id \ Examples

-
> create(%User{id: "1"}, :like, %Post{id: "1"})
-{:ok, %Activity{}}
+
> create(%User{id: "1"}, :like, %Post{id: "1"})
+{:ok, %Activity{}}
@@ -1022,13 +1022,13 @@

delete(id)

Examples -
> delete(activity)
+
> delete(activity)
 # Number of deleted activities
 
-> delete("1")
+> delete("1")
 # Number of deleted activities
 
-> delete([id: "1"])
+> delete([id: "1"])
 # Number of deleted activities
@@ -1057,7 +1057,7 @@

delete_by_object(id)

Examples -
iex> delete_by_object("1")
+
iex> delete_by_object("1")
 # Number of deleted objects
@@ -1086,7 +1086,7 @@

delete_by_subject_verb_object(subject, verb Examples

-
> delete_by_subject_verb_object(%User{id: "1"}, :like, %Post{id: "1"})
+
> delete_by_subject_verb_object(%User{id: "1"}, :like, %Post{id: "1"})
 # Number of deleted activities
@@ -1115,7 +1115,7 @@

fetch_cursor_value_fun(replied, list)

Examples -
> fetch_cursor_value_fun(%{nested_replies_count: 5}, :num_replies)
+
> fetch_cursor_value_fun(%{nested_replies_count: 5}, :num_replies)
 # returns the cursor value based on the number of replies
@@ -1144,7 +1144,7 @@

get(id, opts)

Examples -
iex> get("activity_id", [])
+
iex> get("activity_id", [])
@@ -1174,7 +1174,7 @@

load_object(id_or_pointer, opts \\ [])

Examples -
> load_object("object_id")
+
> load_object("object_id")
@@ -1202,10 +1202,10 @@

maybe_join_creator(query, exclude_user_ids) Examples

-
iex> maybe_join_creator(query, [])
+
iex> maybe_join_creator(query, [])
 # returns query with creator preloaded if different from the subject
 
-iex> maybe_join_creator(query, [1, 2, 3])
+iex> maybe_join_creator(query, [1, 2, 3])
 # returns query with creator included only if creator.id not in [1, 2, 3]
@@ -1234,10 +1234,10 @@

maybe_join_subject(query, exclude_user_ids) Examples

-
iex> maybe_join_subject(query, [])
+
iex> maybe_join_subject(query, [])
 # returns query with subject preloaded
 
-iex> maybe_join_subject(query, [1, 2, 3])
+iex> maybe_join_subject(query, [1, 2, 3])
 # returns query with subject included only if subject.id not in [1, 2, 3]
@@ -1310,8 +1310,8 @@

object_from_activity(activity)

Examples -
iex> object_from_activity(%{object: %{id: 1}})
-%{id: 1}
+
iex> object_from_activity(%{object: %{id: 1}})
+%{id: 1}
@@ -1341,7 +1341,7 @@

object_preload_activity(object, verb \\ :cr Examples

-
> object_preload_activity(%Post{}, :like)
+
> object_preload_activity(%Post{}, :like)
 # Object with preloaded activity
@@ -1370,7 +1370,7 @@

object_preload_create_activity(object)

Examples -
> object_preload_create_activity(%Post{})
+
> object_preload_create_activity(%Post{})
 # Object with preloaded creation activity
@@ -1421,7 +1421,7 @@

order_cursor_fields(arg1, sort_order)

Examples -
> order_cursor_fields(:num_likes, :asc)
+
> order_cursor_fields(:num_likes, :asc)
 # returns cursor fields for ordering by number of likes in ascending order
@@ -1450,7 +1450,7 @@

order_pagination_opts(sort_by, sort_order)< Examples

-
> order_pagination_opts(:num_likes, :desc)
+
> order_pagination_opts(:num_likes, :desc)
 # returns pagination options for ordering by number of likes in descending order
@@ -1527,9 +1527,9 @@

query(filters \\ [], opts_or_current_user \ Examples

-
iex> query(filters)
+
iex> query(filters)
 
-iex> query([my: :feed], [current_user: nil])
+
iex> query([my: :feed], [current_user: nil])
@@ -1585,7 +1585,7 @@

query_object_preload_activity(q, verb \\ :c Examples

-
> query_object_preload_activity(query, :like, :post_id, [])
+
> query_object_preload_activity(query, :like, :post_id, [])
 # Query with preloaded activities
@@ -1616,7 +1616,7 @@

query_object_preload_create_activity(q, opt Examples

-
> query_object_preload_create_activity(query, [])
+
> query_object_preload_create_activity(query, [])
 # Query with preloaded creation activities
@@ -1647,7 +1647,7 @@

query_order(query, sort_by, sort_order, wit Examples

-
> query_order(query, :num_replies, :asc)
+
> query_order(query, :num_replies, :asc)
 # returns the query ordered by number of replies in ascending order
@@ -1678,10 +1678,10 @@

read(query, opts \\ [])

Examples -
iex> read(query)
+
iex> read(query)
 # returns an activity based on the provided query
 
-iex> read(object_id)
+iex> read(object_id)
 # returns an activity for the provided object ID (usually a create activity)
@@ -1712,9 +1712,9 @@

read_query(query, opts \\ [])

Examples -
> read_query(query, opts)
+
> read_query(query, opts)
 
-> read_query(object_id, opts)
+
> read_query(object_id, opts)
@@ -1812,7 +1812,7 @@

verb_display(verb)

Examples -
iex> verb_display("create")
+
iex> verb_display("create")
@@ -1840,7 +1840,7 @@

verb_id(verb)

Examples -
iex> verb_id(:create)
+
iex> verb_id(:create)
@@ -1870,7 +1870,7 @@

verb_maybe_modify(verb, activity \\ nil) Examples

-
iex> verb_maybe_modify("Create", %{object: %{post_content: %{id: 1}}})
+
iex> verb_maybe_modify("Create", %{object: %{post_content: %{id: 1}}})
 "Write"
@@ -1899,7 +1899,7 @@

verb_name(slug)

Examples -
iex> verb_name(:create)
+
iex> verb_name(:create)
 "Create"
diff --git a/Bonfire.Social.Acts.Activity.UnderObject.html b/Bonfire.Social.Acts.Activity.UnderObject.html index 116c0b0807..656a820e24 100644 --- a/Bonfire.Social.Acts.Activity.UnderObject.html +++ b/Bonfire.Social.Acts.Activity.UnderObject.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Activity.UnderObject — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Activity.UnderObject — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Activity.UnderObject - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Activity.html b/Bonfire.Social.Acts.Activity.html index 924e2cab54..f29914048d 100644 --- a/Bonfire.Social.Acts.Activity.html +++ b/Bonfire.Social.Acts.Activity.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Activity — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Activity — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Activity - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.AntiSpam.html b/Bonfire.Social.Acts.AntiSpam.html index 57f76facbd..91f635ebd7 100644 --- a/Bonfire.Social.Acts.AntiSpam.html +++ b/Bonfire.Social.Acts.AntiSpam.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.AntiSpam — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.AntiSpam — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.AntiSpam - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Federate.html b/Bonfire.Social.Acts.Federate.html index 5c4c1135a9..5878d9943c 100644 --- a/Bonfire.Social.Acts.Federate.html +++ b/Bonfire.Social.Acts.Federate.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Federate — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Federate — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Federate - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Feeds.html b/Bonfire.Social.Acts.Feeds.html index 4a8c2390db..402c7a851d 100644 --- a/Bonfire.Social.Acts.Feeds.html +++ b/Bonfire.Social.Acts.Feeds.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Feeds — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Feeds — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Feeds - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.LivePush.html b/Bonfire.Social.Acts.LivePush.html index 350a47d813..36dfe49227 100644 --- a/Bonfire.Social.Acts.LivePush.html +++ b/Bonfire.Social.Acts.LivePush.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.LivePush — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.LivePush — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.LivePush - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Objects.Delete.html b/Bonfire.Social.Acts.Objects.Delete.html index b1db6778a8..3b7234724d 100644 --- a/Bonfire.Social.Acts.Objects.Delete.html +++ b/Bonfire.Social.Acts.Objects.Delete.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Objects.Delete — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Objects.Delete — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Objects.Delete - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.PostContents.html b/Bonfire.Social.Acts.PostContents.html index 0dcb37d022..73c0248f39 100644 --- a/Bonfire.Social.Acts.PostContents.html +++ b/Bonfire.Social.Acts.PostContents.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.PostContents — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.PostContents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.PostContents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Sensitivity.html b/Bonfire.Social.Acts.Sensitivity.html index 7d2bd1145e..fc96bc817e 100644 --- a/Bonfire.Social.Acts.Sensitivity.html +++ b/Bonfire.Social.Acts.Sensitivity.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Sensitivity — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Sensitivity — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Sensitivity - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Acts.Threaded.html b/Bonfire.Social.Acts.Threaded.html index 00f918a43e..97cf3dcb9e 100644 --- a/Bonfire.Social.Acts.Threaded.html +++ b/Bonfire.Social.Acts.Threaded.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Acts.Threaded — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Acts.Threaded — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Acts.Threaded - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Answers.html b/Bonfire.Social.Answers.html index 666498373b..8372054609 100644 --- a/Bonfire.Social.Answers.html +++ b/Bonfire.Social.Answers.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Answers — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Answers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Answers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Bookmarks.LiveHandler.html b/Bonfire.Social.Bookmarks.LiveHandler.html index 4582c345b4..a8552656ab 100644 --- a/Bonfire.Social.Bookmarks.LiveHandler.html +++ b/Bonfire.Social.Bookmarks.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Bookmarks.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Bookmarks.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Bookmarks.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Bookmarks.html b/Bonfire.Social.Bookmarks.html index eb79254df2..1a43d626ed 100644 --- a/Bonfire.Social.Bookmarks.html +++ b/Bonfire.Social.Bookmarks.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Bookmarks — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Bookmarks — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Bookmarks - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -333,8 +333,8 @@

bookmark(bookmarker, bookmarked, opts \\ [] Examples

-
iex> Bonfire.Social.Bookmarks.bookmark(user, object)
-{:ok, %Bonfire.Data.Social.Bookmark{}}
+
iex> Bonfire.Social.Bookmarks.bookmark(user, object)
+{:ok, %Bonfire.Data.Social.Bookmark{}}
@@ -362,7 +362,7 @@

bookmarked?(user, object)

Examples -
iex> Bonfire.Social.Bookmarks.bookmarked?(user, object)
+
iex> Bonfire.Social.Bookmarks.bookmarked?(user, object)
 true
@@ -393,8 +393,8 @@

by_bookmarked(object, opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.by_bookmarked(object)
-[%Bonfire.Data.Social.Bookmark{}, ...]
+
iex> Bonfire.Social.Bookmarks.by_bookmarked(object)
+[%Bonfire.Data.Social.Bookmark{}, ...]
@@ -424,8 +424,8 @@

by_bookmarker(subject, opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.by_bookmarker(user)
-[%Bonfire.Data.Social.Bookmark{}, ...]
+
iex> Bonfire.Social.Bookmarks.by_bookmarker(user)
+[%Bonfire.Data.Social.Bookmark{}, ...]
@@ -457,13 +457,13 @@

count(filters \\ [], opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.count([subject: user_id], [])
+
iex> Bonfire.Social.Bookmarks.count([subject: user_id], [])
 5
 
-iex> Bonfire.Social.Bookmarks.count(user, object)
+iex> Bonfire.Social.Bookmarks.count(user, object)
 1
 
-iex> Bonfire.Social.Bookmarks.count(object, [])
+iex> Bonfire.Social.Bookmarks.count(object, [])
 10
@@ -494,8 +494,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.get(user, object)
-{:ok, %Bonfire.Data.Social.Bookmark{}}
+
iex> Bonfire.Social.Bookmarks.get(user, object)
+{:ok, %Bonfire.Data.Social.Bookmark{}}
@@ -549,8 +549,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.list_by(user_id, current_user: me)
-[%Bonfire.Data.Social.Bookmark{}, ...]
+
iex> Bonfire.Social.Bookmarks.list_by(user_id, current_user: me)
+[%Bonfire.Data.Social.Bookmark{}, ...]
@@ -578,8 +578,8 @@

list_my(opts)

Examples -
iex> Bonfire.Social.Bookmarks.list_my(current_user: me)
-[%Bonfire.Data.Social.Bookmark{}, ...]
+
iex> Bonfire.Social.Bookmarks.list_my(current_user: me)
+[%Bonfire.Data.Social.Bookmark{}, ...]
@@ -609,8 +609,8 @@

list_of(object, opts \\ [])

Examples -
iex> Bonfire.Social.Bookmarks.list_of(object_id)
-[%Bonfire.Data.Social.Bookmark{}, ...]
+
iex> Bonfire.Social.Bookmarks.list_of(object_id)
+[%Bonfire.Data.Social.Bookmark{}, ...]
@@ -706,7 +706,7 @@

unbookmark(bookmarker, object, opts \\ [])< Examples

-
iex> Bonfire.Social.Bookmarks.unbookmark(user, object)
+
iex> Bonfire.Social.Bookmarks.unbookmark(user, object)
 :ok
diff --git a/Bonfire.Social.Boosts.LiveHandler.html b/Bonfire.Social.Boosts.LiveHandler.html index 58db2df058..38cc6333c7 100644 --- a/Bonfire.Social.Boosts.LiveHandler.html +++ b/Bonfire.Social.Boosts.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Boosts.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Boosts.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Boosts.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Boosts.html b/Bonfire.Social.Boosts.html index 862487b25a..a3d39bb67e 100644 --- a/Bonfire.Social.Boosts.html +++ b/Bonfire.Social.Boosts.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Boosts — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Boosts — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Boosts - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -369,8 +369,8 @@

ap_publish_activity(subject, arg2, boost) Examples

-
iex> Bonfire.Social.Boosts.ap_publish_activity(subject, :create, boost)
-{:ok, _activity}
+
iex> Bonfire.Social.Boosts.ap_publish_activity(subject, :create, boost)
+{:ok, _activity}
@@ -398,8 +398,8 @@

ap_receive_activity(creator, activity, obje Examples

-
iex> Bonfire.Social.Boosts.ap_receive_activity(creator, activity, object)
-{:ok, _boost}
+
iex> Bonfire.Social.Boosts.ap_receive_activity(creator, activity, object)
+{:ok, _boost}
@@ -429,8 +429,8 @@

boost(booster, boosted, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.boost(user, object)
-{:ok, %Bonfire.Data.Social.Boost{}}
+
iex> Bonfire.Social.Boosts.boost(user, object)
+{:ok, %Bonfire.Data.Social.Boost{}}
@@ -458,7 +458,7 @@

boosted?(user, object)

Examples -
iex> Bonfire.Social.Boosts.boosted?(user, object)
+
iex> Bonfire.Social.Boosts.boosted?(user, object)
 true
@@ -491,13 +491,13 @@

count(filters \\ [], opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.count([subject: user_id], [])
+
iex> Bonfire.Social.Boosts.count([subject: user_id], [])
 5 # user made 5 boosts, across all objects
 
-iex> Bonfire.Social.Boosts.count(user, object)
+iex> Bonfire.Social.Boosts.count(user, object)
 3 # user boosted object 3 times
 
-iex> Bonfire.Social.Boosts.count(object, [])
+iex> Bonfire.Social.Boosts.count(object, [])
 10 # object was boosted 5 times, across all users
@@ -526,7 +526,7 @@

date_last_boosted(user, object)

Examples -
iex> Bonfire.Social.Boosts.date_last_boosted(user, object)
+
iex> Bonfire.Social.Boosts.date_last_boosted(user, object)
 ~U[2023-07-29 12:34:56Z]
@@ -579,8 +579,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.get(subject, object)
-{:ok, %Bonfire.Data.Social.Boost{}}
+
iex> Bonfire.Social.Boosts.get(subject, object)
+{:ok, %Bonfire.Data.Social.Boost{}}
@@ -634,8 +634,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.list_by(user_id)
-[%Bonfire.Data.Social.Boost{}, ...]
+
iex> Bonfire.Social.Boosts.list_by(user_id)
+[%Bonfire.Data.Social.Boost{}, ...]
@@ -663,8 +663,8 @@

list_my(opts)

Examples -
iex> Bonfire.Social.Boosts.list_my(current_user: me)
-[%Bonfire.Data.Social.Boost{}, ...]
+
iex> Bonfire.Social.Boosts.list_my(current_user: me)
+[%Bonfire.Data.Social.Boost{}, ...]
@@ -694,8 +694,8 @@

list_of(id, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.list_of(object_id)
-[%Bonfire.Data.Social.Boost{}, ...]
+
iex> Bonfire.Social.Boosts.list_of(object_id)
+[%Bonfire.Data.Social.Boost{}, ...]
@@ -725,8 +725,8 @@

list_paginated(filters, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.list_paginated([subject: user_id], [limit: 10])
-%{edges: [%Bonfire.Data.Social.Boost{}, ...], page_info: %{...}}
+
iex> Bonfire.Social.Boosts.list_paginated([subject: user_id], [limit: 10])
+%{edges: [%Bonfire.Data.Social.Boost{}, ...], page_info: %{...}}
@@ -846,8 +846,8 @@

unboost(booster, boosted, opts \\ [])

Examples -
iex> Bonfire.Social.Boosts.unboost(user, object)
-{:ok, _}
+
iex> Bonfire.Social.Boosts.unboost(user, object)
+{:ok, _}
diff --git a/Bonfire.Social.Edges.html b/Bonfire.Social.Edges.html index 893fa503e0..4f120c1df9 100644 --- a/Bonfire.Social.Edges.html +++ b/Bonfire.Social.Edges.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Edges — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Edges — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Edges - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -415,8 +415,8 @@

changeset(schema, subject, verb, object, op Examples

-
iex> changeset(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
-%Ecto.Changeset{}
+
iex> changeset(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
+%Ecto.Changeset{}
@@ -438,7 +438,7 @@

changeset_base(schema, subject, object, opt
-

Prepares a basic schema, with the schema type as top-level and an Egde assoc

iex> changeset_base(Like, %User{id: 1}, %Post{id: 2}, [])

%Ecto.Changeset{}

iex> changeset_base(Follow, %User{id: 1}, %User{id: 2}, [])

%Ecto.Changeset{}

iex> changeset_base({Request, Follow}, %User{id: 1}, %User{id: 2}, [])

%Ecto.Changeset{}
+

Prepares a basic schema, with the schema type as top-level and an Egde assoc

iex> changeset_base(Like, %User{id: 1}, %Post{id: 2}, [])

%Ecto.Changeset{}

iex> changeset_base(Follow, %User{id: 1}, %User{id: 2}, [])

%Ecto.Changeset{}

iex> changeset_base({Request, Follow}, %User{id: 1}, %User{id: 2}, [])

%Ecto.Changeset{}

@@ -466,8 +466,8 @@

changeset_base_with_creator(schema, subject Examples

-
iex> changeset_base_with_creator(MySchema, %User{id: 1}, %Post{id: 2}, [])
-%Ecto.Changeset{}
+
iex> changeset_base_with_creator(MySchema, %User{id: 1}, %Post{id: 2}, [])
+%Ecto.Changeset{}
@@ -517,8 +517,8 @@

changeset_without_caretaker(schema, subject Examples

-
iex> changeset_without_caretaker(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
-%Ecto.Changeset{}
+
iex> changeset_without_caretaker(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
+%Ecto.Changeset{}
@@ -548,7 +548,7 @@

count(type, filters_or_object, opts \\ [])< Examples

-
> count(:like, %Post{id: 2}, [])
+
> count(:like, %Post{id: 2}, [])
 42
@@ -577,7 +577,7 @@

count_for_subject(type, subject, object, op Examples

-
> count_for_subject(:like, %User{id: 1}, %Post{id: 2}, [])
+
> count_for_subject(:like, %User{id: 1}, %Post{id: 2}, [])
 42
@@ -606,7 +606,7 @@

delete_by_both(me, schema, object)

Examples -
iex> delete_by_both(%User{id: 1}, MySchema, %User{id: 2})
+
iex> delete_by_both(%User{id: 1}, MySchema, %User{id: 2})
 :ok
@@ -635,7 +635,7 @@

delete_by_object(user)

Examples -
iex> delete_by_object(%User{id: 1})
+
iex> delete_by_object(%User{id: 1})
 :ok
@@ -664,7 +664,7 @@

delete_by_subject(user)

Examples -
iex> delete_by_subject(%User{id: 1})
+
iex> delete_by_subject(%User{id: 1})
 :ok
@@ -715,7 +715,7 @@

exists?(schema_or_context, subject, object, Examples

-
> exists?(MySchema, %User{id: 1}, %Post{id: 2}, [])
+
> exists?(MySchema, %User{id: 1}, %Post{id: 2}, [])
 true
@@ -768,9 +768,9 @@

get(schema_or_context, subject, object, opt Examples

-
> get(MySchema, %User{id: 1}, %Post{id: 2})
+
> get(MySchema, %User{id: 1}, %Post{id: 2})
 
-> get(MySchema, [%{subject: %User{id: 1}}], [])
+
> get(MySchema, [%{subject: %User{id: 1}}], [])
@@ -826,8 +826,8 @@

insert(changeset, subject \\ nil, object \\ Examples

-
iex> insert(%Changeset{}, %User{id: 1}, %Post{id: 2})
-{:ok, %Edge{}}
+
iex> insert(%Changeset{}, %User{id: 1}, %Post{id: 2})
+{:ok, %Edge{}}
@@ -855,8 +855,8 @@

insert(schema, subject, verb, object, optio Examples

-
> insert(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
-{:ok, %Edge{}}
+
> insert(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])
+{:ok, %Edge{}}
@@ -884,7 +884,7 @@

last(schema_or_context, subject, object, op Examples

-
iex> last(MySchema, %User{id: 1}, %Post{id: 2}, [])
+
iex> last(MySchema, %User{id: 1}, %Post{id: 2}, [])
@@ -912,7 +912,7 @@

last_date(type, subject, object, opts)

Examples -
> last_date(:like, %User{id: 1}, %Post{id: 2}, [])
+
> last_date(:like, %User{id: 1}, %Post{id: 2}, [])
 ~N[2023-07-25 12:34:56]
diff --git a/Bonfire.Social.Fake.html b/Bonfire.Social.Fake.html index 916ae187c2..7548851c38 100644 --- a/Bonfire.Social.Fake.html +++ b/Bonfire.Social.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.FeedActivities.html b/Bonfire.Social.FeedActivities.html index 5093ec8502..149b27f383 100644 --- a/Bonfire.Social.FeedActivities.html +++ b/Bonfire.Social.FeedActivities.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.FeedActivities — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.FeedActivities — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.FeedActivities - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -518,8 +518,8 @@

cast(changeset, feed_ids)

Examples -
> cast(changeset, feed_ids)
-%Ecto.Changeset{}
+
> cast(changeset, feed_ids)
+%Ecto.Changeset{}
@@ -547,8 +547,8 @@

cast(changeset, creator, opts)

Examples -
> cast(changeset, creator, opts)
-%Ecto.Changeset{}
+
> cast(changeset, creator, opts)
+%Ecto.Changeset{}
@@ -564,7 +564,7 @@

cast(changeset, creator, opts)

count(filters \\ [], opts \\ [])

- + View Source @@ -580,7 +580,7 @@

count(filters \\ [], opts \\ [])

Examples -
iex> count(filters, current_user: me)
+
iex> count(filters, current_user: me)
 10
@@ -597,7 +597,7 @@

count(filters \\ [], opts \\ [])

count_subjects(filters \\ [], opts \\ [])

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

count_subjects(filters \\ [], opts \\ []) Examples

-
iex> count_subjects(filters, opts)
+
iex> count_subjects(filters, opts)
 3
@@ -626,7 +626,7 @@

count_subjects(filters \\ [], opts \\ [])

count_total()

- + View Source @@ -648,7 +648,7 @@

count_total()

delete(filters)

- + View Source @@ -664,9 +664,9 @@

delete(filters)

Examples -
iex> filters = [object_id: "123"]
-iex> Bonfire.Social.FeedActivities.delete(filters)
-{5, nil}
+
iex> filters = [object_id: "123"]
+iex> Bonfire.Social.FeedActivities.delete(filters)
+{5, nil}
@@ -678,7 +678,7 @@

delete(filters)

delete(objects, by_field)

- + View Source @@ -694,8 +694,8 @@

delete(objects, by_field)

Examples -
iex> Bonfire.Social.FeedActivities.delete("123", :object_id)
-{1, nil}
+
iex> Bonfire.Social.FeedActivities.delete("123", :object_id)
+{1, nil}
@@ -709,7 +709,7 @@

delete(objects, by_field)

exclude_object_types(extras \\ [])

- + View Source @@ -733,7 +733,7 @@

exclude_object_types(extras \\ [])

feed(feed, opts \\ [])

- + View Source @@ -749,11 +749,11 @@

feed(feed, opts \\ [])

Examples -
iex> Bonfire.Social.FeedActivities.feed("feed123", [])
-%{edges: [%{activity: %{}}], page_info: %{}}
+
iex> Bonfire.Social.FeedActivities.feed("feed123", [])
+%{edges: [%{activity: %{}}], page_info: %{}}
 
-iex> Bonfire.Social.FeedActivities.feed(:explore, [])
-%{edges: [%{activity: %{}}], page_info: %{}}
+
iex> Bonfire.Social.FeedActivities.feed(:explore, []) +%{edges: [%{activity: %{}}], page_info: %{}}
@@ -767,7 +767,7 @@

feed(feed, opts \\ [])

feed_contains?(feed_name, object, opts \\ [])

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

feed_contains?(feed_name, object, opts \\ [

feed_contains_single?(feed_name, filters, opts)

- + View Source @@ -827,16 +827,16 @@

feed_ids_and_opts(feed_name, opts)

Examples -
> feed_ids_and_opts(feed_name, opts)
-{feed_ids, opts}
+
> feed_ids_and_opts(feed_name, opts)
+{feed_ids, opts}
 
-> feed_ids_and_opts({feed_name, feed_id}, opts)
+> feed_ids_and_opts({feed_name, feed_id}, opts)
 
-iex> feed_ids_and_opts(:my, [current_user: me])
-{["feed_id1", "feed_id2"], [exclude_verbs: [:flag, :boost, :follow]]}
+iex> feed_ids_and_opts(:my, [current_user: me])
+{["feed_id1", "feed_id2"], [exclude_verbs: [:flag, :boost, :follow]]}
 
-iex> feed_ids_and_opts({:notifications, "feed_id3"}, [current_user: me])
-{"feed_id3", [skip_boundary_check: :admins, include_flags: true, exclude_verbs: false, skip_dedup: true, preload: [:notifications]]}
+
iex> feed_ids_and_opts({:notifications, "feed_id3"}, [current_user: me]) +{"feed_id3", [skip_boundary_check: :admins, include_flags: true, exclude_verbs: false, skip_dedup: true, preload: [:notifications]]}
@@ -864,8 +864,8 @@

feed_many_paginated(query, opts)

Examples -
> feed_many_paginated(query, opts)
-%{edges: edges, page_info: page_info}
+
> feed_many_paginated(query, opts)
+%{edges: edges, page_info: page_info}
@@ -877,7 +877,7 @@

feed_many_paginated(query, opts)

feed_name(name, current_user_or_socket)

- + View Source @@ -919,11 +919,11 @@

feed_paginated(filters \\ [], opts \\ []) Examples

-
iex> feed_paginated([], [])
-%{edges: [%{activity: %{}}], page_info: %{}}
+
iex> feed_paginated([], [])
+%{edges: [%{activity: %{}}], page_info: %{}}
 
-iex> query = Ecto.Query.from(f in FeedPublish)
-iex> Bonfire.Social.FeedActivities.feed_paginated([], base_query: query)
+
iex> query = Ecto.Query.from(f in FeedPublish) +iex> Bonfire.Social.FeedActivities.feed_paginated([], base_query: query)
@@ -937,7 +937,7 @@

feed_paginated(filters \\ [], opts \\ [])

feed_with_object(feed_name, object, opts \\ [])

- + View Source @@ -975,14 +975,14 @@

feeds_for_activity(id)

Examples -
iex> feeds_for_activity(%{id: id})
-[feed_id1, feed_id2]
+
iex> feeds_for_activity(%{id: id})
+[feed_id1, feed_id2]
 
-iex> feeds_for_activity(id)
-[feed_id1, feed_id2]
+iex> feeds_for_activity(id)
+[feed_id1, feed_id2]
 
-iex> feeds_for_activity(activity)
-[]
+
iex> feeds_for_activity(activity) +[]
@@ -994,7 +994,7 @@

feeds_for_activity(id)

filters_from_opts(opts)

- + View Source @@ -1016,7 +1016,7 @@

filters_from_opts(opts)

get_feed_ids(options)

- + View Source @@ -1032,9 +1032,9 @@

get_feed_ids(options)

Examples -
iex> options = [outbox: [%{id: "author123"}], inbox: [%{id: "mention987"}], notifications: [%{id: "reply654"}], feeds: ["feed456"]]
-iex> Bonfire.Social.FeedActivities.get_feed_ids(options)
-["inbox_feed_id_for_user123", "feed456"]
+
iex> options = [outbox: [%{id: "author123"}], inbox: [%{id: "mention987"}], notifications: [%{id: "reply654"}], feeds: ["feed456"]]
+iex> Bonfire.Social.FeedActivities.get_feed_ids(options)
+["inbox_feed_id_for_user123", "feed456"]
@@ -1046,7 +1046,7 @@

get_feed_ids(options)

get_feed_publishes(options)

- + View Source @@ -1062,9 +1062,9 @@

get_feed_publishes(options)

Examples -
iex> options = [feeds: ["feed123", "feed456"]]
-iex> Bonfire.Social.FeedActivities.get_feed_publishes(options)
-[%{feed_id: "feed123"}, %{feed_id: "feed456"}]
+
iex> options = [feeds: ["feed123", "feed456"]]
+iex> Bonfire.Social.FeedActivities.get_feed_publishes(options)
+[%{feed_id: "feed123"}, %{feed_id: "feed456"}]
@@ -1076,7 +1076,7 @@

get_feed_publishes(options)

mark_all_seen(feed_id, opts)

- + View Source @@ -1092,8 +1092,8 @@

mark_all_seen(feed_id, opts)

Examples -
iex> mark_all_seen(feed_id, current_user: me)
-{:ok, number_of_marked_items}
+
iex> mark_all_seen(feed_id, current_user: me)
+{:ok, number_of_marked_items}
@@ -1105,7 +1105,7 @@

mark_all_seen(feed_id, opts)

maybe_feed_publish(subject, verb_or_activity, object, feeds, opts)

- + View Source @@ -1121,13 +1121,13 @@

maybe_feed_publish(subject, verb_or_activit Examples

-
iex> subject = %{id: "user123"}
+
iex> subject = %{id: "user123"}
 iex> verb = :create
-iex> object = %{id: "post456"}
-iex> feeds = ["feed789"]
-iex> opts = []
-iex> Bonfire.Social.FeedActivities.maybe_feed_publish(subject, verb, object, feeds, opts)
-{:ok, %Bonfire.Data.Social.Activity{}}
+
iex> object = %{id: "post456"} +iex> feeds = ["feed789"] +iex> opts = [] +iex> Bonfire.Social.FeedActivities.maybe_feed_publish(subject, verb, object, feeds, opts) +{:ok, %Bonfire.Data.Social.Activity{}}
@@ -1157,11 +1157,11 @@

my_feed(opts, home_feed_ids \\ nil)

Examples -
iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: "user123"}])
-%{edges: [%{activity: %{}}], page_info: %{}}
+
iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: "user123"}])
+%{edges: [%{activity: %{}}], page_info: %{}}
 
-iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: "user123"}], ["feed_id1", "feed_id2"])
-%{edges: [%{activity: %{}}], page_info: %{}}
+
iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: "user123"}], ["feed_id1", "feed_id2"]) +%{edges: [%{activity: %{}}], page_info: %{}}
@@ -1175,7 +1175,7 @@

my_feed(opts, home_feed_ids \\ nil)

publish(subject, verb_or_activity, object, opts \\ [])

- + View Source @@ -1192,11 +1192,11 @@

publish(subject, verb_or_activity, object, Examples

-
iex> subject = %{id: "user123"}
+
iex> subject = %{id: "user123"}
 iex> verb = :create
-iex> object = %{id: "post456"}
-iex> Bonfire.Social.FeedActivities.publish(subject, verb, object, [])
-{:ok, %Bonfire.Data.Social.Activity{}}
+
iex> object = %{id: "post456"} +iex> Bonfire.Social.FeedActivities.publish(subject, verb, object, []) +{:ok, %Bonfire.Data.Social.Activity{}}
@@ -1208,7 +1208,7 @@

publish(subject, verb_or_activity, object,

put_feed_publishes(changeset, options)

- + View Source @@ -1224,10 +1224,10 @@

put_feed_publishes(changeset, options)

Examples -
iex> changeset = %Ecto.Changeset{}
-iex> options = [feeds: ["feed123", "feed456"]]
-iex> Bonfire.Social.FeedActivities.put_feed_publishes(changeset, options)
-%Ecto.Changeset{}
+
iex> changeset = %Ecto.Changeset{}
+iex> options = [feeds: ["feed123", "feed456"]]
+iex> Bonfire.Social.FeedActivities.put_feed_publishes(changeset, options)
+%Ecto.Changeset{}
@@ -1245,7 +1245,7 @@

put_feed_publishes(changeset, options)

query(filters \\ [], opts \\ [], query \\ default_query())

- + View Source @@ -1269,7 +1269,7 @@

query(filters \\ [], opts \\ [], query \\ d

query_extras_boundarised(query \\ nil, opts)

- + View Source @@ -1315,7 +1315,7 @@

query_module()

query_object_extras_boundarised(query \\ nil, opts)

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

skip_verbs_default()

the_object(object)

- + View Source @@ -1419,9 +1419,9 @@

to_feed_options(opts)

Examples -
> assigns = %{exclude_verbs: [:flag, :boost]}
-> to_feed_options(assigns)
-[exclude_verbs: [:flag, :boost, :follow]]
+
> assigns = %{exclude_verbs: [:flag, :boost]}
+> to_feed_options(assigns)
+[exclude_verbs: [:flag, :boost, :follow]]
@@ -1433,7 +1433,7 @@

to_feed_options(opts)

unseen_count(feed_id, opts)

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

unseen_count(feed_id, opts)

Examples -
iex> unseen_count(feed_id, current_user: me)
+
iex> unseen_count(feed_id, current_user: me)
 5
diff --git a/Bonfire.Social.Feeds.LiveHandler.html b/Bonfire.Social.Feeds.LiveHandler.html index f3cb07c890..edc897facc 100644 --- a/Bonfire.Social.Feeds.LiveHandler.html +++ b/Bonfire.Social.Feeds.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Feeds.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Feeds.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Feeds.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Feeds.html b/Bonfire.Social.Feeds.html index 5eb846c22f..c3daf1bb9c 100644 --- a/Bonfire.Social.Feeds.html +++ b/Bonfire.Social.Feeds.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Feeds — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Feeds — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Feeds - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -231,7 +231,7 @@

+ +
schema_module() @@ -371,7 +379,7 @@

feed_name()

- + View Source @@ -411,7 +419,7 @@

admin_notifications(admin)

- + View Source @@ -433,7 +441,7 @@

admin_notifications(admin)

admins_notifications()

- + View Source @@ -455,7 +463,7 @@

admins_notifications()

admins_notifications(admins)

- + View Source @@ -477,14 +485,14 @@

For an admin:

-
> Bonfire.Social.Feeds.admin_notifications(admin)
+
> Bonfire.Social.Feeds.admin_notifications(admin)
 # Notifications feed ID for the admin

For a list of admins:

-
> Bonfire.Social.Feeds.admins_notifications([admin1, admin2])
+
> Bonfire.Social.Feeds.admins_notifications([admin1, admin2])
 # List of notifications feed IDs for the admins
@@ -497,7 +505,7 @@

feed_id(type, object)

- + View Source @@ -519,14 +527,14 @@

For a character:

-
> Bonfire.Social.Feeds.feed_id(:notifications, character)
+
> Bonfire.Social.Feeds.feed_id(:notifications, character)
 # Feed ID for notifications of the character

For a binary feed name:

-
> Bonfire.Social.Feeds.feed_id("notifications", subject)
+
> Bonfire.Social.Feeds.feed_id("notifications", subject)
 # Feed ID for notifications
@@ -539,7 +547,7 @@

feed_id!(feed_name, for_subject)

- + View Source @@ -561,14 +569,14 @@

For a valid feed:

-
> Bonfire.Social.Feeds.feed_id!(:notifications, subject)
+
> Bonfire.Social.Feeds.feed_id!(:notifications, subject)
 # Feed ID for notifications

For an invalid feed:

-
> Bonfire.Social.Feeds.feed_id!(:invalid, subject)
+
> Bonfire.Social.Feeds.feed_id!(:invalid, subject)
 ** (RuntimeError) Expected feed name and user or character, got :invalid
@@ -581,7 +589,7 @@

feed_ids(feed_name, for_subjects)

- + View Source @@ -603,15 +611,15 @@

For a list of subjects:

-
> Bonfire.Social.Feeds.feed_ids(:notifications, [subject1, subject2])
+
> Bonfire.Social.Feeds.feed_ids(:notifications, [subject1, subject2])
 # List of notification feed IDs for the subjects

For a single subject:

-
> Bonfire.Social.Feeds.feed_ids(:notifications, subject)
-[feed_id]
+
> Bonfire.Social.Feeds.feed_ids(:notifications, subject)
+[feed_id]
@@ -623,7 +631,7 @@

Link to this function -

feed_ids_to_publish(me, boundary, assigns, reply_and_or_mentions_notifications_feeds \\ nil)

+

feed_ids_to_publish(me, boundary, assigns, notify_feeds \\ nil)

@@ -647,14 +655,14 @@

When called with the "admins" boundary:

-
iex> Bonfire.Social.Feeds.feed_ids_to_publish(nil, "admins", nil)
+
iex> Bonfire.Social.Feeds.feed_ids_to_publish(nil, "admins", nil)
 # List of admin feed IDS

When called with a different boundary and some optional feeds:

-
> Bonfire.Social.Feeds.feed_ids_to_publish(me, "public", %{reply_to: true}, [some_feed_id])
+
> Bonfire.Social.Feeds.feed_ids_to_publish(me, "public", %{reply_to: true}, [some_feed_id])
 # List of feed IDs for the provided boundary
@@ -667,7 +675,7 @@

inbox_of_obj_creator(object)

- + View Source @@ -689,7 +697,7 @@

For an object:

-
> Bonfire.Social.Feeds.inbox_of_obj_creator(object)
+
> Bonfire.Social.Feeds.inbox_of_obj_creator(object)
 # Inbox feed ID of the object's creator
@@ -702,7 +710,7 @@

maybe_create_feed(type, for_subject)

- + View Source @@ -724,15 +732,15 @@

For a new feed:

-
> Bonfire.Social.Feeds.maybe_create_feed(:notifications, subject)
-{:ok, feed_id}

+
> Bonfire.Social.Feeds.maybe_create_feed(:notifications, subject)
+{:ok, feed_id}

For an existing feed:

-
> Bonfire.Social.Feeds.maybe_create_feed(:notifications, existing_subject)
-{:ok, existing_feed_id}
+
> Bonfire.Social.Feeds.maybe_create_feed(:notifications, existing_subject)
+{:ok, existing_feed_id}
@@ -746,7 +754,7 @@

maybe_creator_notification(subject, object_creator, opts \\ [])

- + View Source @@ -768,15 +776,15 @@

When creator is different:

-
> Bonfire.Social.Feeds.maybe_creator_notification(subject, other_creator)
-[{:notifications, other_creator}]

+
> Bonfire.Social.Feeds.maybe_creator_notification(subject, other_creator)
+[{:notifications, other_creator}]

When creator is the same:

-
> Bonfire.Social.Feeds.maybe_creator_notification(subject, subject)
-[]
+
> Bonfire.Social.Feeds.maybe_creator_notification(subject, subject)
+[]
@@ -788,7 +796,7 @@

maybe_custom_feeds(preset_and_custom_boundary)

- + View Source @@ -810,8 +818,8 @@

With custom feeds specified:

-
iex> Bonfire.Social.Feeds.maybe_custom_feeds(to_feeds: [custom_feed_id])
-[custom_feed_id]
+
iex> Bonfire.Social.Feeds.maybe_custom_feeds(to_feeds: [custom_feed_id])
+[custom_feed_id]
@@ -845,14 +853,14 @@

When the boundary is "public":

-
> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, "public")
+
> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, "public")
 # Feed ID of the outbox

When the boundary is "mentions" or "admins":

-
> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, "mentions")
+
> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, "mentions")
 nil
@@ -865,7 +873,7 @@

my_feed_id(type, other)

- + View Source @@ -887,7 +895,7 @@

For a user:

-
> Bonfire.Social.Feeds.my_feed_id(:notifications, user)
+
> Bonfire.Social.Feeds.my_feed_id(:notifications, user)
 # Feed ID for notifications of the user
@@ -924,14 +932,14 @@

With socket options and extra feeds:

-
> Bonfire.Social.Feeds.my_home_feed_ids(socket_or_opts, [extra_feed_id])
+
> Bonfire.Social.Feeds.my_home_feed_ids(socket_or_opts, [extra_feed_id])
 # List of home feed IDs including extra feeds

Without socket options:

-
> Bonfire.Social.Feeds.my_home_feed_ids(_, [extra_feed_id])
+
> Bonfire.Social.Feeds.my_home_feed_ids(_, [extra_feed_id])
 # List of home feed IDs including extra feeds
@@ -946,7 +954,7 @@

named_feed_id(name, opts \\ [])

- + View Source @@ -968,14 +976,14 @@

For an existing named feed:

-
iex> Bonfire.Social.Feeds.named_feed_id(:notifications, [])
+
iex> Bonfire.Social.Feeds.named_feed_id(:notifications, [])
 # Feed ID for notifications

For a binary name:

-
iex> Bonfire.Social.Feeds.named_feed_id("notifications", [])
+
iex> Bonfire.Social.Feeds.named_feed_id("notifications", [])
 # Feed ID for notifications
@@ -1012,15 +1020,39 @@

When there are mentions and a reply to creator:

-
> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, "public", ["mention1"], "creator_id")
+
> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, "public", ["mention1"], "creator_id")
 # List of notification feed IDs

When no mentions and no reply to creator:

-
> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, "local", [], nil)
+
> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, "local", [], nil)
 # List of notification feed IDs for local boundary
+ + +
+ + + +
+ + + Link to this function + +

reply_and_or_mentions_to_notify(me, boundary, mentions, reply_to_creator, to_circles \\ [])

+ + + + View Source + + + +
+ +
+ +
@@ -1054,7 +1086,7 @@

schema_module()

target_feeds(changeset, creator, opts)

- + View Source @@ -1076,14 +1108,14 @@

When given a changeset:

-
> Bonfire.Social.Feeds.target_feeds(changeset, creator, opts)
+
> Bonfire.Social.Feeds.target_feeds(changeset, creator, opts)
 # List of target feed IDs based on the changeset

When given an object:

-
> Bonfire.Social.Feeds.target_feeds(object, creator, opts)
+
> Bonfire.Social.Feeds.target_feeds(object, creator, opts)
 # List of target feed IDs based on the object
diff --git a/Bonfire.Social.Flags.LiveHandler.html b/Bonfire.Social.Flags.LiveHandler.html index 08bb9b39d9..d4c793739a 100644 --- a/Bonfire.Social.Flags.LiveHandler.html +++ b/Bonfire.Social.Flags.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Flags.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Flags.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Social.Flags.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Flags.html b/Bonfire.Social.Flags.html index c004c025f5..3993850cc7 100644 --- a/Bonfire.Social.Flags.html +++ b/Bonfire.Social.Flags.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Flags — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Flags — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Flags - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -411,10 +411,10 @@

ap_publish_activity(subject, verb, flag) Examples

-
iex> subject = %Bonfire.Data.Identity.User{id: "user123"}
-iex> flag = %Bonfire.Data.Social.Flag{}
-iex> Bonfire.Social.Flags.ap_publish_activity(subject, :flag, flag)
-{:ok, %ActivityPub.Object{}}
+
iex> subject = %Bonfire.Data.Identity.User{id: "user123"}
+iex> flag = %Bonfire.Data.Social.Flag{}
+iex> Bonfire.Social.Flags.ap_publish_activity(subject, :flag, flag)
+{:ok, %ActivityPub.Object{}}
@@ -454,11 +454,11 @@

ap_receive_activity(creator, activity, obje Examples

-
iex> creator = %Bonfire.Data.Identity.User{id: "user123"}
-iex> activity = %{data: %{"type" => "Flag"}}
-iex> objects = [%{pointer_id: "post456"}, %{pointer_id: "post789"}]
-iex> Bonfire.Social.Flags.ap_receive_activity(creator, activity, objects)
-{:ok, [%Bonfire.Data.Social.Flag{}, %Bonfire.Data.Social.Flag{}]}
+
iex> creator = %Bonfire.Data.Identity.User{id: "user123"}
+iex> activity = %{data: %{"type" => "Flag"}}
+iex> objects = [%{pointer_id: "post456"}, %{pointer_id: "post789"}]
+iex> Bonfire.Social.Flags.ap_receive_activity(creator, activity, objects)
+{:ok, [%Bonfire.Data.Social.Flag{}, %Bonfire.Data.Social.Flag{}]}
@@ -498,9 +498,9 @@

by_flagged(object)

Examples

-
iex> object = %Bonfire.Data.Social.Post{id: "post456"}
-iex> Bonfire.Social.Flags.by_flagged(object)
-[%Bonfire.Data.Social.Flag{}, ...]
+
iex> object = %Bonfire.Data.Social.Post{id: "post456"}
+iex> Bonfire.Social.Flags.by_flagged(object)
+[%Bonfire.Data.Social.Flag{}, ...]
@@ -540,9 +540,9 @@

by_flagger(subject)

Examples -
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
-iex> Bonfire.Social.Flags.by_flagger(flagger)
-[%Bonfire.Data.Social.Flag{}, ...]
+
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
+iex> Bonfire.Social.Flags.by_flagger(flagger)
+[%Bonfire.Data.Social.Flag{}, ...]
@@ -606,10 +606,10 @@

flag(flagger, flagged, opts \\ [])

Examples -
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
-iex> flagged = %Bonfire.Data.Social.Post{id: "post456"}
-iex> Bonfire.Social.Flags.flag(flagger, flagged)
-{:ok, %Bonfire.Data.Social.Flag{}}
+
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
+iex> flagged = %Bonfire.Data.Social.Post{id: "post456"}
+iex> Bonfire.Social.Flags.flag(flagger, flagged)
+{:ok, %Bonfire.Data.Social.Flag{}}
@@ -649,9 +649,9 @@

flagged?(user, object)

Examples -
iex> user = %Bonfire.Data.Identity.User{id: "user123"}
-iex> object = %Bonfire.Data.Social.Post{id: "post456"}
-iex> Bonfire.Social.Flags.flagged?(user, object)
+
iex> user = %Bonfire.Data.Identity.User{id: "user123"}
+iex> object = %Bonfire.Data.Social.Post{id: "post456"}
+iex> Bonfire.Social.Flags.flagged?(user, object)
 false
@@ -694,8 +694,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Flags.get(subject, object)
-{:ok, %Bonfire.Data.Social.Flag{}}
+
iex> Bonfire.Social.Flags.get(subject, object)
+{:ok, %Bonfire.Data.Social.Flag{}}
@@ -753,8 +753,8 @@

instance_moderators()

Examples -
iex> Bonfire.Social.Flags.instance_moderators()
-[%Bonfire.Data.Identity.User{}, ...]
+
iex> Bonfire.Social.Flags.instance_moderators()
+[%Bonfire.Data.Identity.User{}, ...]
@@ -794,8 +794,8 @@

list(opts)

Examples -
iex> Bonfire.Social.Flags.list(scope: :instance)
-%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
+
iex> Bonfire.Social.Flags.list(scope: :instance)
+%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
@@ -837,8 +837,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Social.Flags.list_by("user123")
-%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
+
iex> Bonfire.Social.Flags.list_by("user123")
+%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
@@ -878,8 +878,8 @@

list_my(opts)

Examples -
iex> Bonfire.Social.Flags.list_my(current_user: %Bonfire.Data.Identity.User{id: "user123"})
-%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
+
iex> Bonfire.Social.Flags.list_my(current_user: %Bonfire.Data.Identity.User{id: "user123"})
+%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
@@ -921,8 +921,8 @@

list_of(object, opts \\ [])

Examples -
iex> Bonfire.Social.Flags.list_of("post456")
-%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
+
iex> Bonfire.Social.Flags.list_of("post456")
+%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}
@@ -984,8 +984,8 @@

list_preloaded(opts)

Examples -
iex> Bonfire.Social.Flags.list_preloaded(scope: :instance)
-%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{object: %{created: %{creator: %{}}}}, ...]}
+
iex> Bonfire.Social.Flags.list_preloaded(scope: :instance)
+%{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{object: %{created: %{creator: %{}}}}, ...]}
@@ -1019,8 +1019,8 @@

moderators(object)

Examples -
iex> object = %Bonfire.Data.Social.Post{id: "post456"}
-iex> Bonfire.Social.Flags.moderators(object)
+
iex> object = %Bonfire.Data.Social.Post{id: "post456"}
+iex> Bonfire.Social.Flags.moderators(object)
@@ -1126,9 +1126,9 @@

unflag(flagger, flagged)

Examples -
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
-iex> flagged = %Bonfire.Data.Social.Post{id: "post456"}
-iex> Bonfire.Social.Flags.unflag(flagger, flagged)
+
iex> flagger = %Bonfire.Data.Identity.User{id: "user123"}
+iex> flagged = %Bonfire.Data.Social.Post{id: "post456"}
+iex> Bonfire.Social.Flags.unflag(flagger, flagged)
 :ok
diff --git a/Bonfire.Social.Graph.Aliases.LiveHandler.html b/Bonfire.Social.Graph.Aliases.LiveHandler.html index d0e0ffc44f..26864b96b8 100644 --- a/Bonfire.Social.Graph.Aliases.LiveHandler.html +++ b/Bonfire.Social.Graph.Aliases.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Aliases.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Aliases.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Aliases.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Graph.Aliases.html b/Bonfire.Social.Graph.Aliases.html index e435d4e76f..5e8015fc31 100644 --- a/Bonfire.Social.Graph.Aliases.html +++ b/Bonfire.Social.Graph.Aliases.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Aliases — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Aliases — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Aliases - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -403,8 +403,8 @@

add(user, target, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.add(user, target)
-{:ok, %Alias{}}
+
iex> Bonfire.Social.Graph.Aliases.add(user, target)
+{:ok, %Alias{}}
@@ -434,8 +434,8 @@

all_by_object(object, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.all_by_object(object)
-[%Alias{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.all_by_object(object)
+[%Alias{}, ...]
@@ -465,8 +465,8 @@

all_by_subject(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.all_by_subject(user)
-[%Alias{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.all_by_subject(user)
+[%Alias{}, ...]
@@ -496,8 +496,8 @@

all_objects_by_subject(user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Aliases.all_objects_by_subject(user)
-[%Object{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.all_objects_by_subject(user)
+[%Object{}, ...]
@@ -527,8 +527,8 @@

all_subjects_by_object(object, opts \\ [])< Examples

-
iex> Bonfire.Social.Graph.Aliases.all_subjects_by_object(object)
-[%Subject{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.all_subjects_by_object(object)
+[%Subject{}, ...]
@@ -556,10 +556,10 @@

also_known_as?(local_ap_id, target)

Examples -
iex> Bonfire.Social.Graph.Aliases.also_known_as?("http://example.com/user", target)
+
iex> Bonfire.Social.Graph.Aliases.also_known_as?("http://example.com/user", target)
 true
 
-iex> Bonfire.Social.Graph.Aliases.also_known_as?(%User{}, target)
+iex> Bonfire.Social.Graph.Aliases.also_known_as?(%User{}, target)
 true
@@ -588,7 +588,7 @@

ap_publish_activity(subject, arg2, target)< Examples

-
iex> Bonfire.Social.Graph.Aliases.ap_publish_activity(subject, :move, target)
+
iex> Bonfire.Social.Graph.Aliases.ap_publish_activity(subject, :move, target)
@@ -616,8 +616,8 @@

ap_receive_activity(subject, activity, orig Examples

-
iex> Bonfire.Social.Graph.Aliases.ap_receive_activity(subject, activity, origin_object)
-{:ok, :moved}
+
iex> Bonfire.Social.Graph.Aliases.ap_receive_activity(subject, activity, origin_object)
+{:ok, :moved}
@@ -645,7 +645,7 @@

exists?(subject, target)

Examples -
iex> Bonfire.Social.Graph.Aliases.exists?(subject, target)
+
iex> Bonfire.Social.Graph.Aliases.exists?(subject, target)
 true
@@ -698,8 +698,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.get(subject, object)
-{:ok, %Alias{}}
+
iex> Bonfire.Social.Graph.Aliases.get(subject, object)
+{:ok, %Alias{}}
@@ -753,8 +753,8 @@

list_aliased(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.list_aliased(user)
-[%AliasedEntity{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.list_aliased(user)
+[%AliasedEntity{}, ...]
@@ -784,8 +784,8 @@

list_aliases(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Aliases.list_aliases(user)
-[%Alias{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.list_aliases(user)
+[%Alias{}, ...]
@@ -815,8 +815,8 @@

list_my_aliased(current_user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Aliases.list_my_aliased(current_user)
-[%AliasedEntity{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.list_my_aliased(current_user)
+[%AliasedEntity{}, ...]
@@ -846,8 +846,8 @@

list_my_aliases(current_user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Aliases.list_my_aliases(current_user)
-[%Alias{}, ...]
+
iex> Bonfire.Social.Graph.Aliases.list_my_aliases(current_user)
+[%Alias{}, ...]
@@ -875,8 +875,8 @@

move(subject, target)

Examples -
iex> Bonfire.Social.Graph.Aliases.move(subject, target)
-{:ok, :moved}
+
iex> Bonfire.Social.Graph.Aliases.move(subject, target)
+{:ok, :moved}
@@ -948,7 +948,7 @@

remove(user, target)

Examples -
iex> Bonfire.Social.Graph.Aliases.remove(user, target)
+
iex> Bonfire.Social.Graph.Aliases.remove(user, target)
diff --git a/Bonfire.Social.Graph.Fake.html b/Bonfire.Social.Graph.Fake.html index e23ebc30d7..2ec9a36c32 100644 --- a/Bonfire.Social.Graph.Fake.html +++ b/Bonfire.Social.Graph.Fake.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Fake — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Fake — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Fake - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Graph.Follows.LiveHandler.html b/Bonfire.Social.Graph.Follows.LiveHandler.html index 55ddba5151..eae7d07fe2 100644 --- a/Bonfire.Social.Graph.Follows.LiveHandler.html +++ b/Bonfire.Social.Graph.Follows.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Follows.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Follows.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Follows.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Graph.Follows.html b/Bonfire.Social.Graph.Follows.html index 5a7f3c21ac..566749c72d 100644 --- a/Bonfire.Social.Graph.Follows.html +++ b/Bonfire.Social.Graph.Follows.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Follows — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Follows — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Follows - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -445,8 +445,8 @@

accept(request, opts)

Examples -
iex> Bonfire.Social.Graph.Follows.accept(request, current_user: acceptor)
-{:ok, %Follow{}}
+
iex> Bonfire.Social.Graph.Follows.accept(request, current_user: acceptor)
+{:ok, %Follow{}}
@@ -486,8 +486,8 @@

accept_from(subject, opts)

Examples -
iex> Bonfire.Social.Graph.Follows.accept_from(requester, current_user: acceptor)
-{:ok, %Follow{}}
+
iex> Bonfire.Social.Graph.Follows.accept_from(requester, current_user: acceptor)
+{:ok, %Follow{}}
@@ -529,8 +529,8 @@

all_by_object(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.all_by_object(user)
-[%Follow{}, ...]
+
iex> Bonfire.Social.Graph.Follows.all_by_object(user)
+[%Follow{}, ...]
@@ -572,8 +572,8 @@

all_by_subject(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.all_by_subject(user)
-[%Follow{}, ...]
+
iex> Bonfire.Social.Graph.Follows.all_by_subject(user)
+[%Follow{}, ...]
@@ -615,11 +615,11 @@

all_followed_outboxes(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user)
-["outbox_id_1", ...]
+
iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user)
+["outbox_id_1", ...]
 
-iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user, include_followed_categories: true)
-["outbox_id_1", "category_outbox_id_1", ...]
+
iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user, include_followed_categories: true) +["outbox_id_1", "category_outbox_id_1", ...]
@@ -661,8 +661,8 @@

all_objects_by_subject(user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Follows.all_objects_by_subject(user)
-[%FollowedObject{}, ...]
+
iex> Bonfire.Social.Graph.Follows.all_objects_by_subject(user)
+[%FollowedObject{}, ...]
@@ -704,8 +704,8 @@

all_subjects_by_object(user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Follows.all_subjects_by_object(user)
-[%FollowerSubject{}, ...]
+
iex> Bonfire.Social.Graph.Follows.all_subjects_by_object(user)
+[%FollowerSubject{}, ...]
@@ -745,8 +745,8 @@

ap_publish_activity(subject, arg2, object)< Examples

-
iex> Bonfire.Social.Graph.Follows.ap_publish_activity(user, :delete, follow)
-{:ok, %ActivityPub.Activity{}}
+
iex> Bonfire.Social.Graph.Follows.ap_publish_activity(user, :delete, follow)
+{:ok, %ActivityPub.Activity{}}
@@ -786,8 +786,8 @@

ap_receive_activity(follower, activity, obj Examples

-
iex> Bonfire.Social.Graph.Follows.ap_receive_activity(follower, activity, object)
-{:ok, %Follow{}}
+
iex> Bonfire.Social.Graph.Follows.ap_receive_activity(follower, activity, object)
+{:ok, %Follow{}}
@@ -852,11 +852,11 @@

follow(user, object, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.follow(me, user2)
-{:ok, %Follow{}}
+
iex> Bonfire.Social.Graph.Follows.follow(me, user2)
+{:ok, %Follow{}}
 
-iex> Bonfire.Social.Graph.Follows.follow(me, user3)
-{:ok, %Request{}}
+
iex> Bonfire.Social.Graph.Follows.follow(me, user3) +{:ok, %Request{}}
@@ -896,7 +896,7 @@

following?(subject, object)

Examples -
iex> Bonfire.Social.Graph.Follows.following?(user, profile)
+
iex> Bonfire.Social.Graph.Follows.following?(user, profile)
 true
@@ -939,8 +939,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.get(user, profile)
-{:ok, %Follow{}}
+
iex> Bonfire.Social.Graph.Follows.get(user, profile)
+{:ok, %Follow{}}
@@ -1004,8 +1004,8 @@

ignore(request, opts)

Examples -
iex> Bonfire.Social.Graph.Follows.ignore(request, current_user: user)
-{:ok, ignored_request}
+
iex> Bonfire.Social.Graph.Follows.ignore(request, current_user: user)
+{:ok, ignored_request}
@@ -1047,8 +1047,8 @@

list_followed(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.list_followed(user)
-[%Object{}, ...]
+
iex> Bonfire.Social.Graph.Follows.list_followed(user)
+[%Object{}, ...]
@@ -1090,8 +1090,8 @@

list_followers(user, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.list_followers(user)
-[%User{}, ...]
+
iex> Bonfire.Social.Graph.Follows.list_followers(user)
+[%User{}, ...]
@@ -1133,8 +1133,8 @@

list_my_followed(current_user, opts \\ [])< Examples

-
iex> Bonfire.Social.Graph.Follows.list_my_followed(current_user)
-[%Object{}, ...]
+
iex> Bonfire.Social.Graph.Follows.list_my_followed(current_user)
+[%Object{}, ...]
@@ -1176,8 +1176,8 @@

list_my_followers(current_user, opts \\ []) Examples

-
iex> Bonfire.Social.Graph.Follows.list_my_followers(current_user)
-[%User{}, ...]
+
iex> Bonfire.Social.Graph.Follows.list_my_followers(current_user)
+[%User{}, ...]
@@ -1217,10 +1217,10 @@

query(filters, opts)

Examples -
iex> Bonfire.Social.Graph.Follows.query([my: :object], current_user: user)
+
iex> Bonfire.Social.Graph.Follows.query([my: :object], current_user: user)
 # following
 
-iex> Bonfire.Social.Graph.Follows.query([my: :followers], current_user: user)
+iex> Bonfire.Social.Graph.Follows.query([my: :followers], current_user: user)
 # followers
@@ -1283,7 +1283,7 @@

requested?(subject, object)

Examples -
iex> Bonfire.Social.Graph.Follows.requested?(user, profile)
+
iex> Bonfire.Social.Graph.Follows.requested?(user, profile)
 true
@@ -1348,8 +1348,8 @@

unfollow(user, object, opts \\ [])

Examples -
iex> Bonfire.Social.Graph.Follows.unfollow(me, user2)
-{:ok, deleted_follow}
+
iex> Bonfire.Social.Graph.Follows.unfollow(me, user2)
+{:ok, deleted_follow}
diff --git a/Bonfire.Social.Graph.Import.html b/Bonfire.Social.Graph.Import.html index fb613f404a..40b6f5955e 100644 --- a/Bonfire.Social.Graph.Import.html +++ b/Bonfire.Social.Graph.Import.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Import — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Import — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Import - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -153,7 +153,7 @@

-

Perform the queued job based on the operation and user.

+

Perform the queued job based on the operation and scope.

-

Perform an import operation for the user.

+

Perform an import operation for the scope.

@@ -201,7 +201,7 @@

Link to this function -

import_from_csv_file(arg1, user, path)

+

import_from_csv_file(arg1, scope, path)

@@ -219,7 +219,7 @@

import_from_csv_file(arg1, user, path)

Examples -
iex> import_from_csv_file(:follows, user, "path/to/file.csv")
+
iex> import_from_csv_file(:follows, scope, "path/to/file.csv")
@@ -231,7 +231,7 @@

import_from_csv_file(arg1, user, path)

perform(map)

- + View Source @@ -241,13 +241,16 @@

perform(map)

-

Perform the queued job based on the operation and user.

+

Perform the queued job based on the operation and scope.

Examples

-
iex> perform(%{args: %{"op" => "follows_import", "user_id" => "user1", "identifier" => "id1"}})
+
iex> perform(%{args: %{"op" => "follows_import", "user_id" => "user1", "identifier" => "id1"}})
+:ok
+
+iex> perform(%{args: %{"op" => "blocks_import", "user_id" => "instance_wide", "identifier" => "id1"}})
 :ok
@@ -258,9 +261,9 @@

perform(map)

Link to this function -

perform(op, user, identifier)

+

perform(op, identifier, scope)

- + View Source @@ -270,20 +273,13 @@

perform(op, user, identifier)

-
- -
@spec perform(atom(), Bonfire.Data.Identity.User.t(), list()) ::
-  :ok | list() | {:error, any()}
- -
- -

Perform an import operation for the user.

+

Perform an import operation for the scope.

Examples

-
iex> perform("follows_import", user, "identifier")
+
iex> perform("follows_import", scope, "identifier")
diff --git a/Bonfire.Social.Graph.Integration.html b/Bonfire.Social.Graph.Integration.html index 149fe8358f..5d2313d699 100644 --- a/Bonfire.Social.Graph.Integration.html +++ b/Bonfire.Social.Graph.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Graph.html b/Bonfire.Social.Graph.html index 5de0466990..5bd97c7702 100644 --- a/Bonfire.Social.Graph.html +++ b/Bonfire.Social.Graph.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Graph - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -364,7 +364,7 @@

graph_add(subject, object, type)

Examples -
iex> Bonfire.Social.Graph.graph_add("subject_id", "object_id", "type")
+
iex> Bonfire.Social.Graph.graph_add("subject_id", "object_id", "type")
 :ok
@@ -393,7 +393,7 @@

graph_clear()

Examples -
iex> Bonfire.Social.Graph.graph_clear()
+
iex> Bonfire.Social.Graph.graph_clear()
 :ok
@@ -444,8 +444,8 @@

graph_distance(subject, object)

Examples -
iex> Bonfire.Social.Graph.graph_distance("subject_id", "object_id")
-{:ok, length}
+
iex> Bonfire.Social.Graph.graph_distance("subject_id", "object_id")
+{:ok, length}
@@ -473,8 +473,8 @@

graph_distances(subject)

Examples -
iex> Bonfire.Social.Graph.graph_distances("subject_id")
-[{id, length}]
+
iex> Bonfire.Social.Graph.graph_distances("subject_id")
+[{id, length}]
@@ -504,8 +504,8 @@

graph_query(graph_conn \\ graph_conn(), que Examples

-
iex> Bonfire.Social.Graph.graph_query("MATCH (n) RETURN n")
-{:ok, result}
+
iex> Bonfire.Social.Graph.graph_query("MATCH (n) RETURN n")
+{:ok, result}
@@ -533,7 +533,7 @@

graph_remove(subject, object, type)

Examples -
iex> Bonfire.Social.Graph.graph_remove("subject_id", "object_id", "type")
+
iex> Bonfire.Social.Graph.graph_remove("subject_id", "object_id", "type")
 :ok
diff --git a/Bonfire.Social.Likes.LiveHandler.html b/Bonfire.Social.Likes.LiveHandler.html index 610851146a..6063448862 100644 --- a/Bonfire.Social.Likes.LiveHandler.html +++ b/Bonfire.Social.Likes.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Likes.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Likes.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Likes.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Likes.html b/Bonfire.Social.Likes.html index c1392fd0ec..d5e8a421ca 100644 --- a/Bonfire.Social.Likes.html +++ b/Bonfire.Social.Likes.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Likes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Likes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Likes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -394,8 +394,8 @@

ap_publish_activity(subject, arg2, like) Examples

-
iex> Bonfire.Social.Likes.ap_publish_activity(%User{id: "user123"}, :create, %Like{})
-{:ok, %ActivityPub.Object{}}
+
iex> Bonfire.Social.Likes.ap_publish_activity(%User{id: "user123"}, :create, %Like{})
+{:ok, %ActivityPub.Object{}}
@@ -429,10 +429,10 @@

ap_receive_activity(liker, activity, object Examples

-
iex> activity = %{data: %{"type" => "Like"}}
-iex> object = %ActivityPub.Object{}
-iex> Bonfire.Social.Likes.ap_receive_activity(%User{id: "user123"}, activity, object)
-{:ok, %Like{}}
+
iex> activity = %{data: %{"type" => "Like"}}
+iex> object = %ActivityPub.Object{}
+iex> Bonfire.Social.Likes.ap_receive_activity(%User{id: "user123"}, activity, object)
+{:ok, %Like{}}
@@ -468,8 +468,8 @@

by_liked(object, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.by_liked(%Post{id: "post456"})
-[%Like{}, ...]
+
iex> Bonfire.Social.Likes.by_liked(%Post{id: "post456"})
+[%Like{}, ...]
@@ -505,8 +505,8 @@

by_liker(subject, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.by_liker(%User{id: "user123"})
-[%Like{}, ...]
+
iex> Bonfire.Social.Likes.by_liker(%User{id: "user123"})
+[%Like{}, ...]
@@ -544,10 +544,10 @@

count(filters \\ [], opts \\ [])

Examples -
iex> Bonfire.Social.Likes.count([object: %Post{id: "post456"}])
+
iex> Bonfire.Social.Likes.count([object: %Post{id: "post456"}])
 5
 
-iex> Bonfire.Social.Likes.count(%User{id: "user123"}, %Post{id: "post456"})
+iex> Bonfire.Social.Likes.count(%User{id: "user123"}, %Post{id: "post456"})
 1
@@ -630,8 +630,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.get(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, %Like{}}
+
iex> Bonfire.Social.Likes.get(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, %Like{}}
@@ -713,8 +713,8 @@

like(liker, object, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.like(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, %Like{}}
+
iex> Bonfire.Social.Likes.like(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, %Like{}}
@@ -748,7 +748,7 @@

liked?(user, object)

Examples -
iex> Bonfire.Social.Likes.liked?(%User{id: "user123"}, %Post{id: "post456"})
+
iex> Bonfire.Social.Likes.liked?(%User{id: "user123"}, %Post{id: "post456"})
 true
@@ -785,8 +785,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.list_by(%User{id: "user123"})
-%{edges: [%Like{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Likes.list_by(%User{id: "user123"})
+%{edges: [%Like{}, ...], page_info: %{}}
@@ -820,8 +820,8 @@

list_my(opts)

Examples -
iex> Bonfire.Social.Likes.list_my(current_user: %User{id: "user123"})
-%{edges: [%Like{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Likes.list_my(current_user: %User{id: "user123"})
+%{edges: [%Like{}, ...], page_info: %{}}
@@ -857,8 +857,8 @@

list_of(object, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.list_of(%Post{id: "post456"})
-%{edges: [%Like{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Likes.list_of(%Post{id: "post456"})
+%{edges: [%Like{}, ...], page_info: %{}}
@@ -914,10 +914,10 @@

query(filters, opts)

Examples -
iex> filters = [subject: %User{id: "user123"}]
-iex> opts = [limit: 10]
-iex> Bonfire.Social.Likes.query(filters, opts)
-#Ecto.Query<...>
+
iex> filters = [subject: %User{id: "user123"}]
+iex> opts = [limit: 10]
+iex> Bonfire.Social.Likes.query(filters, opts)
+#Ecto.Query<...>
@@ -997,8 +997,8 @@

unlike(liker, object, opts \\ [])

Examples -
iex> Bonfire.Social.Likes.unlike(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, nil}
+
iex> Bonfire.Social.Likes.unlike(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, nil}
diff --git a/Bonfire.UI.Social.LivePush.html b/Bonfire.Social.LivePush.html similarity index 85% rename from Bonfire.UI.Social.LivePush.html rename to Bonfire.Social.LivePush.html index d73a2686fd..eb3038c690 100644 --- a/Bonfire.UI.Social.LivePush.html +++ b/Bonfire.Social.LivePush.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.LivePush — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.LivePush — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -126,19 +126,19 @@

- + View Source - Bonfire.UI.Social.LivePush - (Bonfire v0.9.10-classic-beta.156) + Bonfire.Social.LivePush + (Bonfire v0.9.10-classic-beta.160)

-

Handles pushing activities (via PubSub) to active feeds and notifications

+

Handles pushing activities (via PubSub and/or email) to active feeds and notifications

@@ -165,7 +165,7 @@

@@ -173,7 +173,7 @@

@@ -207,7 +207,7 @@

@@ -217,7 +217,7 @@

@@ -247,7 +247,7 @@

hide_activity(feed_id, activity_id)

- + View Source @@ -267,9 +267,9 @@

hide_activity(feed_id, activity_id)

Link to this function -

notify(activity, feed_ids)

+

notify(activity, opts)

- + View Source @@ -289,9 +289,9 @@

notify(activity, feed_ids)

Link to this function -

notify(subject, verb, object, feed_ids)

+

notify(subject, verb, object, opts)

- + View Source @@ -313,7 +313,7 @@

notify(subject, verb, object, feed_ids)

notify_of_message(subject, verb, object, users)

- + View Source @@ -335,7 +335,7 @@

notify_of_message(subject, verb, object, us

notify_users(subject, verb, object, users)

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

notify_users(subject, verb, object, users)<

prepare_activity(activity, opts \\ [])

- + View Source @@ -381,9 +381,9 @@

prepare_activity(activity, opts \\ [])

Link to this function -

push_activity(feed_ids, activity, opts \\ [])

+

push_activity(to_feeds, activity, opts \\ [])

- + View Source @@ -403,9 +403,9 @@

push_activity(feed_ids, activity, opts \\ [ Link to this function -

push_activity_object(feed_ids, parent_object, object, opts)

+

push_activity_object(to_notify, parent_object, object, opts)

- + View Source diff --git a/Bonfire.Social.Objects.LiveHandler.html b/Bonfire.Social.Objects.LiveHandler.html index 428e531434..0fa285ad99 100644 --- a/Bonfire.Social.Objects.LiveHandler.html +++ b/Bonfire.Social.Objects.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Objects.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Objects.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire

@@ -132,7 +132,7 @@

Bonfire.Social.Objects.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Objects.html b/Bonfire.Social.Objects.html index 61e3803b3b..0c3f82db3c 100644 --- a/Bonfire.Social.Objects.html +++ b/Bonfire.Social.Objects.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Objects — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Objects — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire

@@ -132,7 +132,7 @@

Bonfire.Social.Objects - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -522,7 +522,7 @@

ap_maybe_delete(creator, object)

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

ap_maybe_delete(creator, object)

ap_receive_activity(creator, activity, object)

- + View Source @@ -570,7 +570,7 @@

ap_receive_activity(creator, activity, obje

as_permitted_for(q, opts \\ [], verbs \\ [:see, :read])

- + View Source @@ -592,7 +592,7 @@

as_permitted_for(q, opts \\ [], verbs \\ [:

care_closures(ids)

- + View Source @@ -614,7 +614,7 @@

care_closures(ids)

Examples -
iex> care_closures(["id1", "id2"])
+
iex> care_closures(["id1", "id2"])
@@ -626,7 +626,7 @@

care_closures(ids)

care_taken(ids)

- + View Source @@ -648,8 +648,8 @@

care_taken(ids)

Examples -
iex> care_taken(["caretaker1", "caretaker2"])
-[%Object{}, %Object{}]
+
iex> care_taken(["caretaker1", "caretaker2"])
+[%Object{}, %Object{}]
@@ -677,8 +677,8 @@

cast(changeset, attrs, creator, opts)

Examples -
iex> cast(changeset, %{}, user, [])
-%Ecto.Changeset{}
+
iex> cast(changeset, %{}, user, [])
+%Ecto.Changeset{}
@@ -728,8 +728,8 @@

cast_basic(changeset, attrs, creator, opts) Examples

-
iex> cast_basic(changeset, %{}, user, [])
-%Ecto.Changeset{}
+
iex> cast_basic(changeset, %{}, user, [])
+%Ecto.Changeset{}
@@ -823,8 +823,8 @@

cast_mini(changeset, attrs, creator, opts)< Examples

-
iex> cast_mini(changeset, %{}, user, [])
-%Ecto.Changeset{}
+
iex> cast_mini(changeset, %{}, user, [])
+%Ecto.Changeset{}
@@ -852,8 +852,8 @@

cast_publish(changeset, attrs, creator, opt Examples

-
iex> cast_publish(changeset, %{}, user, [])
-%Ecto.Changeset{}
+
iex> cast_publish(changeset, %{}, user, [])
+%Ecto.Changeset{}
@@ -865,7 +865,7 @@

cast_publish(changeset, attrs, creator, opt

cast_sensitivity(changeset, sensitive?)

- + View Source @@ -881,8 +881,8 @@

cast_sensitivity(changeset, sensitive?)

Examples -
iex> cast_sensitivity(%Changeset{}, true)
-%Changeset{}
+
iex> cast_sensitivity(%Changeset{}, true)
+%Changeset{}
@@ -896,7 +896,7 @@

cast_sensitivity(changeset, sensitive?)

changeset_named(object \\ %{}, attrs)

- + View Source @@ -918,7 +918,7 @@

changeset_named(object \\ %{}, attrs)

delete(object, opts)

- + View Source @@ -934,8 +934,8 @@

delete(object, opts)

Examples -
iex> delete(%Object{}, current_user: me)
-{:ok, %Object{}}
+
iex> delete(%Object{}, current_user: me)
+{:ok, %Object{}}
@@ -947,7 +947,7 @@

delete(object, opts)

delete_apply_error(error, args)

- + View Source @@ -969,7 +969,7 @@

delete_apply_error(error, args)

delete_caretaken(main)

- + View Source @@ -991,8 +991,8 @@

delete_caretaken(main)

Examples -
iex> delete_caretaken(%Object{id: "main_id"})
-{:ok, [%Object{}, %Object{}]}
+
iex> delete_caretaken(%Object{id: "main_id"})
+{:ok, [%Object{}, %Object{}]}
@@ -1006,7 +1006,7 @@

delete_caretaken(main)

do_delete(objects, opts \\ [])

- + View Source @@ -1050,7 +1050,7 @@

federation_module()

filter(atom, user, query)

- + View Source @@ -1090,8 +1090,8 @@

list_paginated(filters, opts \\ [])

Examples -
iex> list_paginated([type: :post], [])
-%Page{}
+
iex> list_paginated([type: :post], [])
+%Page{}
@@ -1105,7 +1105,7 @@

list_paginated(filters, opts \\ [])

list_query(type_or_query \\ nil, opts)

- + View Source @@ -1129,7 +1129,7 @@

list_query(type_or_query \\ nil, opts)

maybe_generic_delete(type, object, options \\ [])

- + View Source @@ -1151,8 +1151,8 @@

maybe_generic_delete(type, object, options Examples

-
iex> maybe_generic_delete(MyApp.SomeType, %MyApp.SomeType{}, [])
-{:ok, %MyApp.SomeType{}}
+
iex> maybe_generic_delete(MyApp.SomeType, %MyApp.SomeType{}, [])
+{:ok, %MyApp.SomeType{}}
@@ -1202,8 +1202,8 @@

object_creator(object)

Examples -
iex> object_creator(%Object{})
-%User{}
+
iex> object_creator(%Object{})
+%User{}
@@ -1215,7 +1215,7 @@

object_creator(object)

permalink(object)

- + View Source @@ -1231,7 +1231,7 @@

permalink(object)

Examples -
iex> permalink(%{canonical_uri: "https://example.com/object/123"})
+
iex> permalink(%{canonical_uri: "https://example.com/object/123"})
 "https://example.com/object/123"
@@ -1260,8 +1260,8 @@

preload_creator(object)

Examples -
iex> preload_creator(%Object{})
-%Object{}
+
iex> preload_creator(%Object{})
+%Object{}
@@ -1289,8 +1289,8 @@

preload_reply_creator(object)

Examples -
iex> preload_reply_creator(%Object{})
-%Object{replied: %{reply_to: ...}}
+
iex> preload_reply_creator(%Object{})
+%Object{replied: %{reply_to: ...}}
@@ -1306,7 +1306,7 @@

preload_reply_creator(object)

publish(creator, verb, thing, opts_or_attrs \\ nil, for_module \\ __MODULE__)

- + View Source @@ -1322,8 +1322,8 @@

publish(creator, verb, thing, opts_or_attrs Examples

-
iex> publish(%User{}, :create, %Object{}, [], __MODULE__)
-{:ok, %Activity{}}
+
iex> publish(%User{}, :create, %Object{}, [], __MODULE__)
+{:ok, %Activity{}}
@@ -1337,7 +1337,7 @@

publish(creator, verb, thing, opts_or_attrs

query_base(type \\ nil)

- + View Source @@ -1378,8 +1378,8 @@

read(object_id, opts)

Examples -
iex> read("123", [])
-{:ok, %{id: "123", activity: %{}}}
+
iex> read("123", [])
+{:ok, %{id: "123", activity: %{}}}
@@ -1395,7 +1395,7 @@

read(object_id, opts)

reset_preset_boundary(creator, thing, previous_preset, opts_or_attrs \\ [], for_module \\ nil)

- + View Source @@ -1411,8 +1411,8 @@

reset_preset_boundary(creator, thing, previ Examples

-
iex> reset_preset_boundary(%User{}, %Object{}, "public", [], __MODULE__)
-{:ok, %Boundary{}}
+
iex> reset_preset_boundary(%User{}, %Object{}, "public", [], __MODULE__)
+{:ok, %Boundary{}}
@@ -1428,7 +1428,7 @@

reset_preset_boundary(creator, thing, previ

run_epic(type, options \\ [], on \\ :object)

- + View Source @@ -1450,8 +1450,8 @@

run_epic(type, options \\ [], on \\ :object Examples

-
iex> run_epic(:delete, [object: %Object{}])
-{:ok, %Object{}}
+
iex> run_epic(:delete, [object: %Object{}])
+{:ok, %Object{}}
@@ -1467,7 +1467,7 @@

run_epic(type, options \\ [], on \\ :object

set_boundaries(creator, thing, opts_or_attrs \\ [], for_module \\ __MODULE__)

- + View Source @@ -1483,8 +1483,8 @@

set_boundaries(creator, thing, opts_or_attr Examples

-
iex> set_boundaries(%User{}, %Object{}, [], __MODULE__)
-[boundary: "public", to_circles: [], to_feeds: []]
+
iex> set_boundaries(%User{}, %Object{}, [], __MODULE__)
+[boundary: "public", to_circles: [], to_feeds: []]
@@ -1496,7 +1496,7 @@

set_boundaries(creator, thing, opts_or_attr

set_name(id, name, opts)

- + View Source @@ -1512,8 +1512,8 @@

set_name(id, name, opts)

Examples -
iex> set_name("123", "New Name", [])
-{:ok, %Object{id: "123", named: %{name: "New Name"}}}
+
iex> set_name("123", "New Name", [])
+{:ok, %Object{id: "123", named: %{name: "New Name"}}}
@@ -1525,7 +1525,7 @@

set_name(id, name, opts)

set_sensitivity(pointer, arg2)

- + View Source @@ -1541,8 +1541,8 @@

set_sensitivity(pointer, arg2)

Examples -
iex> set_sensitivity(%Object{sensitive: %{}}, true)
-{:ok, %Object{}}
+
iex> set_sensitivity(%Object{sensitive: %{}}, true)
+{:ok, %Object{}}
diff --git a/Bonfire.Social.Pins.LiveHandler.html b/Bonfire.Social.Pins.LiveHandler.html index 985b8bffc6..16843efce1 100644 --- a/Bonfire.Social.Pins.LiveHandler.html +++ b/Bonfire.Social.Pins.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Pins.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Pins.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Pins.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Pins.html b/Bonfire.Social.Pins.html index 5347dea773..54261be1db 100644 --- a/Bonfire.Social.Pins.html +++ b/Bonfire.Social.Pins.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Pins — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Pins — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Pins - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -367,8 +367,8 @@

ap_publish_activity(subject, verb, pin)

Examples -
iex> Bonfire.Social.Pins.ap_publish_activity(%User{id: "user123"}, :create, %Pin{})
-{:ok, %ActivityPub.Object{}}
+
iex> Bonfire.Social.Pins.ap_publish_activity(%User{id: "user123"}, :create, %Pin{})
+{:ok, %ActivityPub.Object{}}
@@ -404,8 +404,8 @@

by_pinned(object, opts \\ [])

Examples -
iex> Bonfire.Social.Pins.by_pinned(%Post{id: "post456"})
-[%Pin{}, ...]
+
iex> Bonfire.Social.Pins.by_pinned(%Post{id: "post456"})
+[%Pin{}, ...]
@@ -441,8 +441,8 @@

by_pinner(subject, opts \\ [])

Examples -
iex> Bonfire.Social.Pins.by_pinner(%User{id: "user123"})
-[%Pin{}, ...]
+
iex> Bonfire.Social.Pins.by_pinner(%User{id: "user123"})
+[%Pin{}, ...]
@@ -500,8 +500,8 @@

get(subject, object, opts \\ [])

Examples -
iex> Bonfire.Social.Pins.get(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, %Pin{}}
+
iex> Bonfire.Social.Pins.get(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, %Pin{}}
@@ -561,8 +561,8 @@

list_by(by_user, opts \\ [])

Examples -
iex> Bonfire.Social.Pins.list_by(%User{id: "user123"})
-%{edges: [%Pin{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Pins.list_by(%User{id: "user123"})
+%{edges: [%Pin{}, ...], page_info: %{}}
@@ -596,8 +596,8 @@

list_instance_pins(opts)

Examples -
iex> Bonfire.Social.Pins.list_instance_pins(limit: 10)
-%{edges: [%Pin{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Pins.list_instance_pins(limit: 10)
+%{edges: [%Pin{}, ...], page_info: %{}}
@@ -631,8 +631,8 @@

list_my(opts)

Examples -
iex> Bonfire.Social.Pins.list_my(current_user: %User{id: "user123"})
-%{edges: [%Pin{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Pins.list_my(current_user: %User{id: "user123"})
+%{edges: [%Pin{}, ...], page_info: %{}}
@@ -668,8 +668,8 @@

list_of(object, opts \\ [])

Examples -
iex> Bonfire.Social.Pins.list_of(%Post{id: "post456"})
-%{edges: [%Pin{}, ...], page_info: %{}}
+
iex> Bonfire.Social.Pins.list_of(%Post{id: "post456"})
+%{edges: [%Pin{}, ...], page_info: %{}}
@@ -707,11 +707,11 @@

pin(pinner, object, scope \\ nil, opts \\ [ Examples

-
iex> Bonfire.Social.Pins.pin(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, %Pin{}}
+
iex> Bonfire.Social.Pins.pin(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, %Pin{}}
 
-iex> Bonfire.Social.Pins.pin(%User{id: "user123"}, %Post{id: "post456"}, :instance)
-{:ok, %Pin{}}
+
iex> Bonfire.Social.Pins.pin(%User{id: "user123"}, %Post{id: "post456"}, :instance) +{:ok, %Pin{}}
@@ -745,10 +745,10 @@

pinned?(scope, object)

Examples -
iex> Bonfire.Social.Pins.pinned?(:instance, %Post{id: "post123"})
+
iex> Bonfire.Social.Pins.pinned?(:instance, %Post{id: "post123"})
 true
 
-iex> Bonfire.Social.Pins.pinned?(%User{id: "user123"}, %Post{id: "post456"})
+iex> Bonfire.Social.Pins.pinned?(%User{id: "user123"}, %Post{id: "post456"})
 false
@@ -827,11 +827,11 @@

rank_pin(pin, scope, position)

Examples -
iex> Bonfire.Social.Pins.rank_pin("pin123", :instance, 1)
-{:ok, %Bonfire.Data.Assort.Ranked{}}
+
iex> Bonfire.Social.Pins.rank_pin("pin123", :instance, 1)
+{:ok, %Bonfire.Data.Assort.Ranked{}}
 
-iex> Bonfire.Social.Pins.rank_pin("pin123", %User{id: "user456"}, 2)
-{:ok, %Bonfire.Data.Assort.Ranked{}}
+
iex> Bonfire.Social.Pins.rank_pin("pin123", %User{id: "user456"}, 2) +{:ok, %Bonfire.Data.Assort.Ranked{}}
@@ -889,11 +889,11 @@

unpin(user, object, scope \\ nil)

Examples -
iex> Bonfire.Social.Pins.unpin(%User{id: "user123"}, %Post{id: "post456"})
-{:ok, nil}
+
iex> Bonfire.Social.Pins.unpin(%User{id: "user123"}, %Post{id: "post456"})
+{:ok, nil}
 
-iex> Bonfire.Social.Pins.unpin(%User{id: "user123"}, %Post{id: "post456"}, :instance)
-{:ok, nil}
+
iex> Bonfire.Social.Pins.unpin(%User{id: "user123"}, %Post{id: "post456"}, :instance) +{:ok, nil}
diff --git a/Bonfire.Social.PostContents.html b/Bonfire.Social.PostContents.html index 3afc2efdbb..b7770186d9 100644 --- a/Bonfire.Social.PostContents.html +++ b/Bonfire.Social.PostContents.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.PostContents — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.PostContents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.PostContents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -401,7 +401,7 @@

all_text_content(attrs)

ap_receive_activity(creator, activity_data, object)

- + View Source @@ -425,7 +425,7 @@

ap_receive_activity(creator, activity_data,

ap_receive_attrs_prepare(creator, activity_data, post_data, direct_recipients \\ [])

- + View Source @@ -463,8 +463,8 @@

base_query()

Examples -
iex> Bonfire.Social.PostContents.base_query()
-#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent>
+
iex> Bonfire.Social.PostContents.base_query()
+#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent>
@@ -492,13 +492,13 @@

cast(changeset, attrs, creator, boundary, o Examples

-
iex> attrs = %{name: "Test Post", html_body: "Content"}
-iex> creator = %Bonfire.Data.Identity.User{id: "01FXYZ123ABC"}
+
iex> attrs = %{name: "Test Post", html_body: "Content"}
+iex> creator = %Bonfire.Data.Identity.User{id: "01FXYZ123ABC"}
 iex> boundary = "public"
-iex> opts = []
-iex> changeset = %Ecto.Changeset{}
-iex> Bonfire.Social.PostContents.cast(changeset, attrs, creator, boundary, opts)
-#Ecto.Changeset<...>
+
iex> opts = [] +iex> changeset = %Ecto.Changeset{} +iex> Bonfire.Social.PostContents.cast(changeset, attrs, creator, boundary, opts) +#Ecto.Changeset<...>
@@ -528,9 +528,9 @@

changeset(cs \\ %PostContent{}, attrs)

Examples -
iex> attrs = %{name: "Test Post", html_body: "Content"}
-iex> Bonfire.Social.PostContents.changeset(%Bonfire.Data.Social.PostContent{}, attrs)
-#Ecto.Changeset<...>
+
iex> attrs = %{name: "Test Post", html_body: "Content"}
+iex> Bonfire.Social.PostContents.changeset(%Bonfire.Data.Social.PostContent{}, attrs)
+#Ecto.Changeset<...>
@@ -542,7 +542,7 @@

changeset(cs \\ %PostContent{}, attrs)

diff(previous_version, current_version)

- + View Source @@ -564,7 +564,7 @@

diff(previous_version, current_version)

edit(current_user, id, attrs)

- + View Source @@ -586,7 +586,7 @@

edit(current_user, id, attrs)

editor_output_content_type(user)

- + View Source @@ -648,8 +648,8 @@

get(id, opts \\ [])

Examples -
iex> Bonfire.Social.PostContents.get("01FXYZ123ABC")
-%Bonfire.Data.Social.PostContent{id: "01FXYZ123ABC", ...}
+
iex> Bonfire.Social.PostContents.get("01FXYZ123ABC")
+%Bonfire.Data.Social.PostContent{id: "01FXYZ123ABC", ...}
@@ -661,7 +661,7 @@

get(id, opts \\ [])

get_versions(post_content)

- + View Source @@ -683,7 +683,7 @@

get_versions(post_content)

get_versions_diffed(post_content)

- + View Source @@ -705,7 +705,7 @@

get_versions_diffed(post_content)

indexing_object_format(obj)

- + View Source @@ -795,7 +795,7 @@

merge_with_body_or_nil(attrs, map)

no_known_output(error, args)

- + View Source @@ -835,8 +835,8 @@

one(filters, opts \\ [])

Examples -
iex> Bonfire.Social.PostContents.one(%{name: "Test Post"})
-%Bonfire.Data.Social.PostContent{name: "Test Post", ...}
+
iex> Bonfire.Social.PostContents.one(%{name: "Test Post"})
+%Bonfire.Data.Social.PostContent{name: "Test Post", ...}
@@ -888,8 +888,8 @@

query(filters, opts \\ [])

Examples -
iex> Bonfire.Social.PostContents.query(%{name: "Test Post"})
-#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent, where: p0.name == ^"Test Post">
+
iex> Bonfire.Social.PostContents.query(%{name: "Test Post"})
+#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent, where: p0.name == ^"Test Post">
@@ -901,7 +901,7 @@

query(filters, opts \\ [])

query_base()

- + View Source @@ -939,8 +939,8 @@

search_query(text, opts)

Examples -
iex> Bonfire.Social.PostContents.search_query("test", %{})
-#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent, ...>
+
iex> Bonfire.Social.PostContents.search_query("test", %{})
+#Ecto.Query<from p0 in Bonfire.Data.Social.PostContent, ...>
diff --git a/Bonfire.Social.Requests.html b/Bonfire.Social.Requests.html index b68cb566e1..5785a77a0f 100644 --- a/Bonfire.Social.Requests.html +++ b/Bonfire.Social.Requests.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Requests — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Requests — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Requests - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -425,8 +425,8 @@

accept(request, opts)

Examples -
iex> accept(request, opts)
-{:ok, request}
+
iex> accept(request, opts)
+{:ok, request}
@@ -456,8 +456,8 @@

all_by_object(user, type, opts \\ [])

Examples -
iex> all_by_object(user, type, opts)
-[{:ok, request}]
+
iex> all_by_object(user, type, opts)
+[{:ok, request}]
@@ -487,8 +487,8 @@

all_by_subject(user, type, opts \\ [])

Examples -
iex> all_by_subject(user, type, opts)
-[{:ok, request}]
+
iex> all_by_subject(user, type, opts)
+[{:ok, request}]
@@ -518,8 +518,8 @@

all_objects_by_subject(user, type, opts \\ Examples

-
iex> all_objects_by_subject(user, type, opts)
-[object]
+
iex> all_objects_by_subject(user, type, opts)
+[object]
@@ -549,8 +549,8 @@

all_requested_outboxes(user, type, opts \\ Examples

-
iex> all_requested_outboxes(user, type, opts)
-[outbox_id]
+
iex> all_requested_outboxes(user, type, opts)
+[outbox_id]
@@ -580,8 +580,8 @@

all_subjects_by_object(user, type, opts \\ Examples

-
iex> all_subjects_by_object(user, type, opts)
-[subject]
+
iex> all_subjects_by_object(user, type, opts)
+[subject]
@@ -633,7 +633,7 @@

exists?(subject, type, object, opts \\ [])< Examples

-
iex> exists?(subject, Follow, object, opts)
+
iex> exists?(subject, Follow, object, opts)
 true
@@ -664,8 +664,8 @@

get(filters, opts \\ [])

Examples -
iex> get(filters, opts)
-{:ok, request}
+
iex> get(filters, opts)
+{:ok, request}
@@ -695,8 +695,8 @@

get(subject, type, object, opts \\ [])

Examples -
iex> get(subject, Follow, object, opts)
-{:ok, request}
+
iex> get(subject, Follow, object, opts)
+{:ok, request}
@@ -748,8 +748,8 @@

ignore(request, opts)

Examples -
iex> ignore(request, opts)
-{:ok, request}
+
iex> ignore(request, opts)
+{:ok, request}
@@ -777,8 +777,8 @@

list_my_requested(opts)

Examples -
iex> list_my_requested(opts)
-[{:ok, request}]
+
iex> list_my_requested(opts)
+[{:ok, request}]
@@ -806,8 +806,8 @@

list_my_requesters(opts)

Examples -
iex> list_my_requesters(opts)
-[{:ok, requester}]
+
iex> list_my_requesters(opts)
+[{:ok, requester}]
@@ -837,8 +837,8 @@

list_requested(user, opts \\ [])

Examples -
iex> list_requested(user, opts)
-[{:ok, request}]
+
iex> list_requested(user, opts)
+[{:ok, request}]
@@ -868,8 +868,8 @@

list_requesters(user, opts \\ [])

Examples -
iex> list_requesters(user, opts)
-[{:ok, requester}]
+
iex> list_requesters(user, opts)
+[{:ok, requester}]
@@ -921,8 +921,8 @@

query(filters, type \\ nil, opts)

Examples -
iex> query(filters, type, opts)
-{:ok, query}
+
iex> query(filters, type, opts)
+{:ok, query}
@@ -974,8 +974,8 @@

request(user, type, object, opts \\ [])

Examples -
iex> request(subject, Follow, object)
-{:ok, request}
+
iex> request(subject, Follow, object)
+{:ok, request}
@@ -1005,8 +1005,8 @@

requested(request, opts \\ [])

Examples -
iex> requested(request, current_user: me)
-{:ok, request}
+
iex> requested(request, current_user: me)
+{:ok, request}
@@ -1034,7 +1034,7 @@

requested?(subject, type, object)

Examples -
iex> requested?(subject, type, object)
+
iex> requested?(subject, type, object)
 true
diff --git a/Bonfire.Social.Seen.html b/Bonfire.Social.Seen.html index a78d6f9834..4acc00c75b 100644 --- a/Bonfire.Social.Seen.html +++ b/Bonfire.Social.Seen.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Seen — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Seen — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Seen - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -281,10 +281,10 @@

get(subject, object, opts \\ [])

Examples -
iex> subject = %User{id: "user123"}
-iex> object = %Post{id: "post456"}
-iex> Bonfire.Social.Seen.get(subject, object)
-{:ok, %Seen{}}
+
iex> subject = %User{id: "user123"}
+iex> object = %Post{id: "post456"}
+iex> Bonfire.Social.Seen.get(subject, object)
+{:ok, %Seen{}}
@@ -342,13 +342,13 @@

mark_seen(subject, object)

Examples -
iex> user = %User{id: "user123"}
-iex> object = %Post{id: "post456"}
-iex> Bonfire.Social.Seen.mark_seen(user, object)
-{:ok, %Seen{}}
+
iex> user = %User{id: "user123"}
+iex> object = %Post{id: "post456"}
+iex> Bonfire.Social.Seen.mark_seen(user, object)
+{:ok, %Seen{}}
 
-iex> Bonfire.Social.Seen.mark_seen(user, "456")
-{:ok, %Seen{}}
+
iex> Bonfire.Social.Seen.mark_seen(user, "456") +{:ok, %Seen{}}
@@ -418,10 +418,10 @@

query(filters, opts)

Examples -
iex> filters = [subject: %User{id: "123"}]
-iex> opts = [limit: 10]
-iex> Bonfire.Social.Seen.query(filters, opts)
-#Ecto.Query<...>
+
iex> filters = [subject: %User{id: "123"}]
+iex> opts = [limit: 10]
+iex> Bonfire.Social.Seen.query(filters, opts)
+#Ecto.Query<...>
@@ -499,9 +499,9 @@

seen?(user, object)

Examples -
iex> user = %User{id: "user123"}
-iex> object = %Post{id: "post456"}
-iex> Bonfire.Social.Seen.seen?(user, object)
+
iex> user = %User{id: "user123"}
+iex> object = %Post{id: "post456"}
+iex> Bonfire.Social.Seen.seen?(user, object)
 true
diff --git a/Bonfire.Social.Tags.html b/Bonfire.Social.Tags.html index 549dabe520..911de274a3 100644 --- a/Bonfire.Social.Tags.html +++ b/Bonfire.Social.Tags.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Tags — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Tags — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Tags - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -251,7 +251,7 @@

auto_boost(categories_auto_boost, object) Examples

-
iex> auto_boost([%Bonfire.Classify.Category{id: "123"}], %Post{id: "456"})
+
iex> auto_boost([%Bonfire.Classify.Category{id: "123"}], %Post{id: "456"})
 :ok
@@ -302,7 +302,7 @@

maybe_auto_boost(creator, category_or_categ Examples

-
iex> maybe_auto_boost(%User{}, [%Bonfire.Classify.Category{id: "123"}], %Post{id: "456"})
+
iex> maybe_auto_boost(%User{}, [%Bonfire.Classify.Category{id: "123"}], %Post{id: "456"})
 :ok
@@ -331,8 +331,8 @@

maybe_boostable_categories(creator, categor Examples

-
iex> maybe_boostable_categories(%User{}, [%Bonfire.Classify.Category{id: "123"}])
-[%Bonfire.Classify.Category{id: "123", tree: nil}]
+
iex> maybe_boostable_categories(%User{}, [%Bonfire.Classify.Category{id: "123"}])
+[%Bonfire.Classify.Category{id: "123", tree: nil}]
@@ -360,8 +360,8 @@

maybe_cast(changeset, attrs, creator, opts) Examples

-
iex> maybe_cast(%Ecto.Changeset{}, %{tags: ["tag1", "tag2"]}, %User{}, [])
-%Ecto.Changeset{}
+
iex> maybe_cast(%Ecto.Changeset{}, %{tags: ["tag1", "tag2"]}, %User{}, [])
+%Ecto.Changeset{}
@@ -389,8 +389,8 @@

maybe_process(creator, text, opts)

Examples -
iex> maybe_process(%User{}, "Hello @user #hashtag https://example.com", [])
-{:ok, %{text: "Hello @user #hashtag https://example.com", mentions: [], hashtags: [], urls: []}}
+
iex> maybe_process(%User{}, "Hello @user #hashtag https://example.com", [])
+{:ok, %{text: "Hello @user #hashtag https://example.com", mentions: [], hashtags: [], urls: []}}
diff --git a/Bonfire.Social.Threads.LiveHandler.html b/Bonfire.Social.Threads.LiveHandler.html index 7956936170..676bfe655a 100644 --- a/Bonfire.Social.Threads.LiveHandler.html +++ b/Bonfire.Social.Threads.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Threads.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Threads.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Threads.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Social.Threads.html b/Bonfire.Social.Threads.html index f533a3dd28..4a1700568c 100644 --- a/Bonfire.Social.Threads.html +++ b/Bonfire.Social.Threads.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Threads — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Threads — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social.Threads - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -435,7 +435,7 @@

ap_prepare(object_or_thread_or_reply_to_id, Examples

-
iex> ap_prepare("thread_123")
+
iex> ap_prepare("thread_123")
 "https://example.com/ap/objects/thread_123"
@@ -472,8 +472,8 @@

arrange_replies(replies, opts \\ [])

Examples -
iex> arrange_replies([%{id: "1"}, %{id: "2", path: ["1"]}])
-%{"1" => %{id: "1", children: %{"2" => %{id: "2", path: ["1"]}}}}
+
iex> arrange_replies([%{id: "1"}, %{id: "2", path: ["1"]}])
+%{"1" => %{id: "1", children: %{"2" => %{id: "2", path: ["1"]}}}}
@@ -509,8 +509,8 @@

arrange_replies_tree(replies, opts \\ []) Examples

-
iex> arrange_replies_tree([%{id: "1"}, %{id: "2", reply_to_id: "1"}])
-%{"1" => %{id: "1", direct_replies: [%{id: "2", reply_to_id: "1"}]}}
+
iex> arrange_replies_tree([%{id: "1"}, %{id: "2", reply_to_id: "1"}])
+%{"1" => %{id: "1", direct_replies: [%{id: "2", reply_to_id: "1"}]}}
@@ -566,8 +566,8 @@

cast(changeset, attrs, user, preset_or_cust Examples

-
iex> cast(changeset, %{reply_to_id: "123"}, user, nil)
-%Ecto.Changeset{}
+
iex> cast(changeset, %{reply_to_id: "123"}, user, nil)
+%Ecto.Changeset{}
@@ -627,7 +627,7 @@

count_participants(thread_id, opts \\ []) Examples

-
iex> count_participants("thread_123")
+
iex> count_participants("thread_123")
 5
@@ -662,8 +662,8 @@

create_parent_replied(changeset, replied, r Examples

-
iex> create_parent_replied(changeset, %Replied{}, %{id: "789", thread_id: "456"})
-%Ecto.Changeset{}
+
iex> create_parent_replied(changeset, %Replied{}, %{id: "789", thread_id: "456"})
+%Ecto.Changeset{}
@@ -725,8 +725,8 @@

find_reply_to(attrs, user)

Examples -
iex> find_reply_to(%{reply_to_id: "123"}, user)
-{:ok, %{id: "123", ...}}
+
iex> find_reply_to(%{reply_to_id: "123"}, user)
+{:ok, %{id: "123", ...}}
@@ -760,8 +760,8 @@

find_thread(attrs, user)

Examples -
iex> find_thread(%{thread_id: "456"}, user)
-{:ok, %{id: "456", ...}}
+
iex> find_thread(%{thread_id: "456"}, user)
+{:ok, %{id: "456", ...}}
@@ -795,8 +795,8 @@

init_parent_replied(replied_attrs)

Examples -
iex> init_parent_replied(%{id: "789", thread_id: "456"})
-{:ok, %Replied{}}
+
iex> init_parent_replied(%{id: "789", thread_id: "456"})
+{:ok, %Replied{}}
@@ -834,8 +834,8 @@

list_participants(activity_or_object, threa Examples

-
iex> list_participants(activity, "thread_123", limit: 10)
-[%{id: "user1", ...}, %{id: "user2", ...}]
+
iex> list_participants(activity, "thread_123", limit: 10)
+[%{id: "user1", ...}, %{id: "user2", ...}]
@@ -871,8 +871,8 @@

list_replies(thread, opts \\ [])

Examples -
iex> list_replies("thread_123", limit: 10)
-%{edges: [%{id: "reply1", ...}, %{id: "reply2", ...}]}
+
iex> list_replies("thread_123", limit: 10)
+%{edges: [%{id: "reply1", ...}, %{id: "reply2", ...}]}
@@ -906,8 +906,8 @@

mark_all_seen(filters, opts)

Examples -
iex> mark_all_seen([thread_id: "123"], current_user: user)
-{:ok, [%{id: "reply1"}, %{id: "reply2"}]}
+
iex> mark_all_seen([thread_id: "123"], current_user: user)
+{:ok, [%{id: "reply1"}, %{id: "reply2"}]}
@@ -985,8 +985,8 @@

query(filter, opts)

Examples -
iex> query([thread_id: "123"], preload: [:posts])
-%Ecto.Query{}
+
iex> query([thread_id: "123"], preload: [:posts])
+%Ecto.Query{}
@@ -1070,8 +1070,8 @@

read(object_id, opts)

Examples -
iex> read("123", current_user: me)
-{:ok, %{id: "123", ...}}
+
iex> read("123", current_user: me)
+{:ok, %{id: "123", ...}}
@@ -1127,7 +1127,7 @@

unseen_count(filters, opts)

Examples -
iex> unseen_count([thread_id: "123"], current_user: user)
+
iex> unseen_count([thread_id: "123"], current_user: user)
 5
@@ -1168,8 +1168,8 @@

unseen_query(filters, opts)

Examples -
iex> unseen_query([thread_id: "123"], current_user: user)
-{:ok, %Ecto.Query{}}
+
iex> unseen_query([thread_id: "123"], current_user: user)
+{:ok, %Ecto.Query{}}
diff --git a/Bonfire.Social.html b/Bonfire.Social.html index 504f5e101a..82019fa803 100644 --- a/Bonfire.Social.html +++ b/Bonfire.Social.html @@ -5,16 +5,16 @@ - + - Bonfire.Social — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Social - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -332,10 +332,10 @@

federate_outgoing?(subject \\ nil)

Examples -
iex> Bonfire.Social.federate_outgoing?()
+
iex> Bonfire.Social.federate_outgoing?()
 true
 
-iex> Bonfire.Social.federate_outgoing?(user)
+iex> Bonfire.Social.federate_outgoing?(user)
 false
@@ -372,10 +372,10 @@

federating?(subject \\ nil)

Examples -
iex> Bonfire.Social.federating?()
+
iex> Bonfire.Social.federating?()
 true
 
-iex> Bonfire.Social.federating?(user)
+iex> Bonfire.Social.federating?(user)
 true
@@ -412,10 +412,10 @@

is_local?(thing, opts \\ [])

Examples -
iex> Bonfire.Social.is_local?(local_user)
+
iex> Bonfire.Social.is_local?(local_user)
 true
 
-iex> Bonfire.Social.is_local?(remote_user)
+iex> Bonfire.Social.is_local?(remote_user)
 false
@@ -475,12 +475,12 @@

many(query, paginate?, opts \\ [])

Examples -
iex> query = from(u in User, where: u.age > 18)
-iex> Bonfire.Social.many(query, false, return: :query)
-#Ecto.Query<...>
+
iex> query = from(u in User, where: u.age > 18)
+iex> Bonfire.Social.many(query, false, return: :query)
+#Ecto.Query<...>
 
-iex> Bonfire.Social.many(query, true, after: "1")
-%{entries: [%User{}, ...], page_info: %{...}}
+
iex> Bonfire.Social.many(query, true, after: "1") +%{entries: [%User{}, ...], page_info: %{...}}
@@ -519,10 +519,10 @@

maybe_federate(subject, verb, object, activ Examples

-
iex> subject = %User{id: 1}
-iex> object = %Post{id: 2, content: "Hello, world!"}
-iex> Bonfire.Social.maybe_federate(subject, :create, object)
-{:ok, %ActivityPub.Object{}}
+
iex> subject = %User{id: 1}
+iex> object = %Post{id: 2, content: "Hello, world!"}
+iex> Bonfire.Social.maybe_federate(subject, :create, object)
+{:ok, %ActivityPub.Object{}}
@@ -559,10 +559,10 @@

maybe_federate_and_gift_wrap_activity(subje Examples

-
iex> subject = %User{id: 1}
-iex> object = %Post{id: 2, content: "Hello, world!"}
-iex> {:ok, wrapped_object} = Bonfire.Social.maybe_federate_and_gift_wrap_activity(subject, object)
-iex> Map.has_key?(wrapped_object, :activity)
+
iex> subject = %User{id: 1}
+iex> object = %Post{id: 2, content: "Hello, world!"}
+iex> {:ok, wrapped_object} = Bonfire.Social.maybe_federate_and_gift_wrap_activity(subject, object)
+iex> Map.has_key?(wrapped_object, :activity)
 true
@@ -591,7 +591,7 @@

repo()

Examples -
iex> Bonfire.Social.repo()
+
iex> Bonfire.Social.repo()
 Bonfire.Common.Repo
diff --git a/Bonfire.SocialGraph.html b/Bonfire.SocialGraph.html index 0d7cd1c021..ec029b9779 100644 --- a/Bonfire.SocialGraph.html +++ b/Bonfire.SocialGraph.html @@ -5,16 +5,16 @@ - + - Bonfire.Social.Graph — Bonfire v0.9.10-classic-beta.156 + Bonfire.Social.Graph — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.Tag.Acts.Tag.html b/Bonfire.Tag.Acts.Tag.html index e963fe713d..c7d9b0d570 100644 --- a/Bonfire.Tag.Acts.Tag.html +++ b/Bonfire.Tag.Acts.Tag.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Acts.Tag — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Acts.Tag — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Acts.Tag - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Autocomplete.html b/Bonfire.Tag.Autocomplete.html index d79fc6aa87..ce3ac5e7db 100644 --- a/Bonfire.Tag.Autocomplete.html +++ b/Bonfire.Tag.Autocomplete.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Autocomplete — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Autocomplete — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Autocomplete - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.GraphQL.TagResolver.html b/Bonfire.Tag.GraphQL.TagResolver.html index 59f7c49935..0998f71a1b 100644 --- a/Bonfire.Tag.GraphQL.TagResolver.html +++ b/Bonfire.Tag.GraphQL.TagResolver.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.GraphQL.TagResolver — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.GraphQL.TagResolver — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.GraphQL.TagResolver - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Hashtag.html b/Bonfire.Tag.Hashtag.html index 9b8de8d750..09520b7a10 100644 --- a/Bonfire.Tag.Hashtag.html +++ b/Bonfire.Tag.Hashtag.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Hashtag — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Hashtag — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Hashtag - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.LiveHandler.html b/Bonfire.Tag.LiveHandler.html index 0733501a7c..43ba3cc67b 100644 --- a/Bonfire.Tag.LiveHandler.html +++ b/Bonfire.Tag.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Queries.html b/Bonfire.Tag.Queries.html index 9d3e08f042..6e3c26e62f 100644 --- a/Bonfire.Tag.Queries.html +++ b/Bonfire.Tag.Queries.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Queries — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Simulate.html b/Bonfire.Tag.Simulate.html index d83a9a13cd..55b48052c9 100644 --- a/Bonfire.Tag.Simulate.html +++ b/Bonfire.Tag.Simulate.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Simulate — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Simulate — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Simulate - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Tagged.html b/Bonfire.Tag.Tagged.html index cf2a52806d..9bee14817a 100644 --- a/Bonfire.Tag.Tagged.html +++ b/Bonfire.Tag.Tagged.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Tagged — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Tagged — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.Tagged - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.TextContent.Formatter.html b/Bonfire.Tag.TextContent.Formatter.html index 93ad197c1f..79058b8197 100644 --- a/Bonfire.Tag.TextContent.Formatter.html +++ b/Bonfire.Tag.TextContent.Formatter.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.TextContent.Formatter — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.TextContent.Formatter — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag.TextContent.Formatter - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -151,14 +151,6 @@

Functions

- -
linkify(text, options \\ []) @@ -206,28 +198,6 @@

Functions

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

escape_mention_handler(mention, buffer, _, _)

- - - - View Source - - - -
- -
- - -
-
@@ -239,7 +209,7 @@

escape_mention_handler(mention, buffer, _,

linkify(text, options \\ [])

- + View Source @@ -270,7 +240,7 @@

linkify(text, options \\ [])

nothing_handler(text, opts, acc)

- + View Source @@ -292,7 +262,7 @@

nothing_handler(text, opts, acc)

tag_handler(tag_text, buffer, opts, acc)

- + View Source @@ -314,7 +284,7 @@

tag_handler(tag_text, buffer, opts, acc)

url_handler(url, opts, acc)

- + View Source diff --git a/Bonfire.Tag.TextContent.Process.html b/Bonfire.Tag.TextContent.Process.html index 0d153826b5..e679c6d602 100644 --- a/Bonfire.Tag.TextContent.Process.html +++ b/Bonfire.Tag.TextContent.Process.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.TextContent.Process — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.TextContent.Process — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Tag.TextContent.Process - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.Web.Routes.html b/Bonfire.Tag.Web.Routes.html index 224dd81ff8..411f140f08 100644 --- a/Bonfire.Tag.Web.Routes.html +++ b/Bonfire.Tag.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Tag.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Tag.html b/Bonfire.Tag.html index fa2f74ff28..3ada3f5253 100644 --- a/Bonfire.Tag.html +++ b/Bonfire.Tag.html @@ -5,16 +5,16 @@ - + - Bonfire.Tag — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tag — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Tag - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -176,7 +176,7 @@

+
+ + +
+ +
+ + +
+
get(id, opts \\ []) @@ -218,6 +234,22 @@

+ + + +
get_or_create_hashtag(name) @@ -423,14 +455,16 @@

+ +
Link to this function -

cast(changeset, attrs, creator, opts)

+

cast(changeset, attrs, creator, opts \\ [])

- + View Source @@ -487,6 +521,50 @@

find(id, types \\ nil)

+
+
+
+ + + +
+ + +
+
+
+ + + +
+ +
@@ -533,6 +611,50 @@

get_hashtag(name)

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

get_hashtags_from_changeset(changeset)

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

get_mentions_from_changeset(arg1)

+ + + + View Source + + + +
+ +
+ +
@@ -566,7 +688,7 @@

get_or_create_hashtag(name)

indexing_object_format(object)

- + View Source @@ -588,7 +710,7 @@

indexing_object_format(object)

indexing_object_format_name(object)

- + View Source @@ -787,7 +909,7 @@

maybe_lookup_tag(id_or_username_or_url, pre

maybe_put_tree_parent(changeset, category, creator)

- + View Source @@ -813,7 +935,7 @@

maybe_put_tree_parent(changeset, category,

maybe_tag(user, thing, tags \\ nil, boost_category_mentions? \\ true)

- + View Source @@ -950,7 +1072,7 @@

search_hashtag_query(text, opts)

tag_ids(tags)

- + View Source @@ -974,7 +1096,7 @@

tag_ids(tags)

tag_something(user, thing, tags, boost_or_label_category_tags? \\ true)

- + View Source @@ -996,7 +1118,7 @@

tag_something(user, thing, tags, boost_or_l

tag_things_changeset(tag, things)

- + View Source @@ -1018,7 +1140,7 @@

tag_things_changeset(tag, things)

thing_tags_changeset(thing, tags)

- + View Source diff --git a/Bonfire.Tags.Acts.AutoBoost.html b/Bonfire.Tags.Acts.AutoBoost.html index c6c34d19ac..27d1a6cd3f 100644 --- a/Bonfire.Tags.Acts.AutoBoost.html +++ b/Bonfire.Tags.Acts.AutoBoost.html @@ -5,16 +5,16 @@ - + - Bonfire.Tags.Acts.AutoBoost — Bonfire v0.9.10-classic-beta.156 + Bonfire.Tags.Acts.AutoBoost — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire

@@ -132,7 +132,7 @@

Bonfire.Tags.Acts.AutoBoost - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Telemetry.Metrics.html b/Bonfire.Telemetry.Metrics.html index bd9f912578..efff7c1abe 100644 --- a/Bonfire.Telemetry.Metrics.html +++ b/Bonfire.Telemetry.Metrics.html @@ -5,16 +5,16 @@ - + - Bonfire.Telemetry.Metrics — Bonfire v0.9.10-classic-beta.156 + Bonfire.Telemetry.Metrics — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Telemetry.Metrics - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Telemetry.Storage.html b/Bonfire.Telemetry.Storage.html index 619cf0da65..70643c49fe 100644 --- a/Bonfire.Telemetry.Storage.html +++ b/Bonfire.Telemetry.Storage.html @@ -5,16 +5,16 @@ - + - Bonfire.Telemetry.Storage — Bonfire v0.9.10-classic-beta.156 + Bonfire.Telemetry.Storage — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Telemetry.Storage - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Telemetry.SystemMonitor.html b/Bonfire.Telemetry.SystemMonitor.html index 6d28bb5a39..930ce8ca08 100644 --- a/Bonfire.Telemetry.SystemMonitor.html +++ b/Bonfire.Telemetry.SystemMonitor.html @@ -5,16 +5,16 @@ - + - Bonfire.Telemetry.SystemMonitor — Bonfire v0.9.10-classic-beta.156 + Bonfire.Telemetry.SystemMonitor — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Telemetry.SystemMonitor - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Telemetry.html b/Bonfire.Telemetry.html index 49f90fd3a2..cdd94e5ffb 100644 --- a/Bonfire.Telemetry.html +++ b/Bonfire.Telemetry.html @@ -5,16 +5,16 @@ - + - Bonfire.Telemetry — Bonfire v0.9.10-classic-beta.156 + Bonfire.Telemetry — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Telemetry - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Testing.InsecurePW.html b/Bonfire.Testing.InsecurePW.html index 5be46e38f5..de776a0307 100644 --- a/Bonfire.Testing.InsecurePW.html +++ b/Bonfire.Testing.InsecurePW.html @@ -5,16 +5,16 @@ - + - Bonfire.Testing.InsecurePW — Bonfire v0.9.10-classic-beta.156 + Bonfire.Testing.InsecurePW — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Testing.InsecurePW - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Testing.html b/Bonfire.Testing.html index e8188bf82c..e395c81970 100644 --- a/Bonfire.Testing.html +++ b/Bonfire.Testing.html @@ -5,16 +5,16 @@ - + - Bonfire.Testing — Bonfire v0.9.10-classic-beta.156 + Bonfire.Testing — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Testing - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.ComponentID.html b/Bonfire.UI.Common.ComponentID.html index 1ef3032fd7..1789fa6381 100644 --- a/Bonfire.UI.Common.ComponentID.html +++ b/Bonfire.UI.Common.ComponentID.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.ComponentID — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.ComponentID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.ComponentID - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.Endpoint.LiveReload.html b/Bonfire.UI.Common.Endpoint.LiveReload.html index da05509ff4..a5e82e5942 100644 --- a/Bonfire.UI.Common.Endpoint.LiveReload.html +++ b/Bonfire.UI.Common.Endpoint.LiveReload.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Endpoint.LiveReload — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Endpoint.LiveReload — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Endpoint.LiveReload - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.EndpointTemplate.html b/Bonfire.UI.Common.EndpointTemplate.html index dbdcfd8e36..5ef6b3a009 100644 --- a/Bonfire.UI.Common.EndpointTemplate.html +++ b/Bonfire.UI.Common.EndpointTemplate.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.EndpointTemplate — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.EndpointTemplate — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.EndpointTemplate - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.ErrorHandling.html b/Bonfire.UI.Common.ErrorHandling.html index 8ee3e8cb26..3bba090e0c 100644 --- a/Bonfire.UI.Common.ErrorHandling.html +++ b/Bonfire.UI.Common.ErrorHandling.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.ErrorHandling — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.ErrorHandling — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.ErrorHandling - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.ErrorHelpers.html b/Bonfire.UI.Common.ErrorHelpers.html index f0091bba2d..934e643f1c 100644 --- a/Bonfire.UI.Common.ErrorHelpers.html +++ b/Bonfire.UI.Common.ErrorHelpers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.ErrorHelpers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.ErrorHelpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -126,13 +126,13 @@

- + View Source Bonfire.UI.Common.ErrorHelpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -197,7 +197,7 @@

error_tag(form, field)

- + View Source @@ -207,7 +207,7 @@

error_tag(form, field)

-

Generates tag for inlined form input errors.

TODO: use Surface.Components.Form.ErrorTag instead

+

Generates tag for inlined form input errors.

TODO: use Surface.Components.Form.ErrorTag instead

@@ -219,7 +219,7 @@

error_tag(form, field)

translate_error(arg)

- + View Source diff --git a/Bonfire.UI.Common.ErrorReportingPlug.html b/Bonfire.UI.Common.ErrorReportingPlug.html index 432a90107f..56179e1aeb 100644 --- a/Bonfire.UI.Common.ErrorReportingPlug.html +++ b/Bonfire.UI.Common.ErrorReportingPlug.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.ErrorReportingPlug — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.ErrorReportingPlug — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.UI.Common.ErrorReportingPlug - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LiveHandlers.html b/Bonfire.UI.Common.LiveHandlers.html index 98947b5f92..6973ac4ba9 100644 --- a/Bonfire.UI.Common.LiveHandlers.html +++ b/Bonfire.UI.Common.LiveHandlers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LiveHandlers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LiveHandlers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LiveHandlers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html b/Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html index ed4e0a63b5..1237e643ab 100644 --- a/Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html +++ b/Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs.AllowTestSandbox — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs.AllowTestSandbox — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs.AllowTestSandbox - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.Csrf.html b/Bonfire.UI.Common.LivePlugs.Csrf.html index f5290c2e07..89cbbc7e75 100644 --- a/Bonfire.UI.Common.LivePlugs.Csrf.html +++ b/Bonfire.UI.Common.LivePlugs.Csrf.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs.Csrf — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs.Csrf — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs.Csrf - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.Helpers.html b/Bonfire.UI.Common.LivePlugs.Helpers.html index bae8f1402d..d67b8b2aaa 100644 --- a/Bonfire.UI.Common.LivePlugs.Helpers.html +++ b/Bonfire.UI.Common.LivePlugs.Helpers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs.Helpers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs.Helpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs.Helpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.Locale.html b/Bonfire.UI.Common.LivePlugs.Locale.html index e11ca59139..8e3fb67abe 100644 --- a/Bonfire.UI.Common.LivePlugs.Locale.html +++ b/Bonfire.UI.Common.LivePlugs.Locale.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs.Locale — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs.Locale — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs.Locale - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.StaticChanged.html b/Bonfire.UI.Common.LivePlugs.StaticChanged.html index b7e66b5f44..cd2b821fad 100644 --- a/Bonfire.UI.Common.LivePlugs.StaticChanged.html +++ b/Bonfire.UI.Common.LivePlugs.StaticChanged.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs.StaticChanged — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs.StaticChanged — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs.StaticChanged - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.LivePlugs.html b/Bonfire.UI.Common.LivePlugs.html index 1e0a0c1c2c..549c45fa1d 100644 --- a/Bonfire.UI.Common.LivePlugs.html +++ b/Bonfire.UI.Common.LivePlugs.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.LivePlugs — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.LivePlugs — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.LivePlugs - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.MaybeStaticGeneratorPlug.html b/Bonfire.UI.Common.MaybeStaticGeneratorPlug.html index 7517ec1d6a..0de2001c32 100644 --- a/Bonfire.UI.Common.MaybeStaticGeneratorPlug.html +++ b/Bonfire.UI.Common.MaybeStaticGeneratorPlug.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.MaybeStaticGeneratorPlug — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.MaybeStaticGeneratorPlug — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.MaybeStaticGeneratorPlug - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -179,6 +179,14 @@

+ + @@ -245,6 +253,28 @@

init(opts)

maybe_make_request_path_static(conn, _)

+ + + View Source + + + + + +
+ + +
+ +
+ + @@ -132,7 +132,7 @@

Bonfire.UI.Common.Modularity.DeclareHelpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.MultiTenancyPlug.html b/Bonfire.UI.Common.MultiTenancyPlug.html index 498127245e..b881f3c726 100644 --- a/Bonfire.UI.Common.MultiTenancyPlug.html +++ b/Bonfire.UI.Common.MultiTenancyPlug.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.MultiTenancyPlug — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.MultiTenancyPlug — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.MultiTenancyPlug - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.MultiselectLive.LiveHandler.html b/Bonfire.UI.Common.MultiselectLive.LiveHandler.html index 158b367ee5..f20bcd5622 100644 --- a/Bonfire.UI.Common.MultiselectLive.LiveHandler.html +++ b/Bonfire.UI.Common.MultiselectLive.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.MultiselectLive.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.MultiselectLive.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.MultiselectLive.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.NavModule.html b/Bonfire.UI.Common.NavModule.html index 7505116f9f..484901757f 100644 --- a/Bonfire.UI.Common.NavModule.html +++ b/Bonfire.UI.Common.NavModule.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.NavModule — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.NavModule — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.NavModule behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.Notifications.html b/Bonfire.UI.Common.Notifications.html index 8e54c0c180..7a62554426 100644 --- a/Bonfire.UI.Common.Notifications.html +++ b/Bonfire.UI.Common.Notifications.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Notifications — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Notifications — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Notifications - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -177,7 +177,15 @@

+ +
+ @@ -237,7 +245,7 @@

assign_notification(attrs, socket)

- + View Source @@ -294,20 +302,42 @@

handle_info(attrs, socket)

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

notify_broadcast(to_ids, data)

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

notify_feeds(feed_ids, title, message, url \\ nil, icon \\ nil)

+

notify_broadcast(to_ids, title, message, url \\ nil, icon \\ nil)

- + View Source @@ -331,7 +361,7 @@

notify_feeds(feed_ids, title, message, url

notify_me(title, message, icon, socket \\ nil)

- + View Source @@ -357,7 +387,7 @@

notify_me(title, message, icon, socket \\ n

receive_flash(attrs, pid \\ self(), context \\ nil)

- + View Source @@ -381,7 +411,7 @@

receive_flash(attrs, pid \\ self(), context

receive_notification(attrs, socket \\ nil)

- + View Source diff --git a/Bonfire.UI.Common.PlugProtect.html b/Bonfire.UI.Common.PlugProtect.html index ecd3bae7c0..7b9dd8478c 100644 --- a/Bonfire.UI.Common.PlugProtect.html +++ b/Bonfire.UI.Common.PlugProtect.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.PlugProtect — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.PlugProtect — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.UI.Common.PlugProtect - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.Plugs.ActivityPub.html b/Bonfire.UI.Common.Plugs.ActivityPub.html index db930cf0d2..e32899e42e 100644 --- a/Bonfire.UI.Common.Plugs.ActivityPub.html +++ b/Bonfire.UI.Common.Plugs.ActivityPub.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Plugs.ActivityPub — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Plugs.ActivityPub — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Plugs.ActivityPub - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.Presence.html b/Bonfire.UI.Common.Presence.html index 317db6f7c8..d7c6a85b5c 100644 --- a/Bonfire.UI.Common.Presence.html +++ b/Bonfire.UI.Common.Presence.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Presence — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Presence — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Presence - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.PreviewContentLive.html b/Bonfire.UI.Common.PreviewContentLive.html index d829f08f51..9e5c98045f 100644 --- a/Bonfire.UI.Common.PreviewContentLive.html +++ b/Bonfire.UI.Common.PreviewContentLive.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.PreviewContentLive — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.PreviewContentLive — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.PreviewContentLive - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.ReusableModalLive.html b/Bonfire.UI.Common.ReusableModalLive.html index eb69ac6ad6..13168778b0 100644 --- a/Bonfire.UI.Common.ReusableModalLive.html +++ b/Bonfire.UI.Common.ReusableModalLive.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.ReusableModalLive — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.ReusableModalLive — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.ReusableModalLive - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -144,7 +144,7 @@

Properties

-
  • id :string, required: true - The id of the live component (required by LiveView for stateful components).

  • source_inspector_attrs :map, default: %{}

  • title_text :string, default: nil - The title of the modal. Only used if no title slot is passed.

  • image_preview :boolean, default: false - If the modal is a preview of an image, set this to true.

  • title_class :css_class, default: nil - The classes of the title of the modal

  • modal_class :css_class, default: "" - The classes of the modal.

  • wrapper_class :css_class, default: nil - The classes of the modal wrapper.

  • action_btns_wrapper_class :css_class, default: nil - The classes around the action/submit button(s) on the modal

  • cancel_btn_class :css_class, default: nil - The classes of the close/cancel button on the modal. Only used if no close_btn slot is passed.

  • cancel_label :string, default: nil

  • show :boolean, default: false - Force modal to be open

  • form_opts :map, default: %{}

  • no_actions :boolean, default: false - Optional prop to hide the actions at the bottom of the modal

  • no_header :boolean, default: false - Optional prop to hide the header at the top of the modal

  • no_backdrop :boolean, default: false

  • opts :keyword, default: [] - Additional attributes to add onto the modal wrapper

  • autocomplete :list, default: []

+
  • id :string, required: true - The id of the live component (required by LiveView for stateful components).

  • source_inspector_attrs :map, default: %{}

  • title_text :string, default: nil - The title of the modal. Only used if no title slot is passed.

  • image_preview :boolean, default: false - If the modal is a preview of an image, set this to true.

  • title_class :css_class, default: nil - The classes of the title of the modal

  • modal_class :css_class, default: "" - The classes of the modal.

  • wrapper_class :css_class, default: nil - The classes of the modal wrapper.

  • action_btns_wrapper_class :css_class, default: nil - The classes around the action/submit button(s) on the modal

  • cancel_btn_class :css_class, default: nil - The classes of the close/cancel button on the modal. Only used if no close_btn slot is passed.

  • cancel_label :string, default: nil

  • show :boolean, default: false - Force modal to be open

  • form_opts :map, default: %{}

  • no_actions :boolean, default: false - Optional prop to hide the actions at the bottom of the modal

  • no_header :boolean, default: false - Optional prop to hide the header at the top of the modal

  • no_backdrop :boolean, default: false

  • modal_assigns :any, default: [] - Additional assigns to pass on to the optional modal sub-component

  • opts :keyword, default: [] - Additional attributes to add onto the modal wrapper

  • autocomplete :list, default: []

@@ -185,6 +185,14 @@

+
+ + +
+
mount(socket) @@ -205,6 +213,14 @@

+ +
sigil_p(route, extra) @@ -245,7 +261,7 @@

default_assigns()

- + View Source @@ -278,6 +294,28 @@

handle_event(event, attrs, socket)

Callback implementation for Phoenix.LiveComponent.handle_event/3.

+
+

+
@@ -322,6 +360,32 @@

render(assigns)

Callback implementation for Phoenix.LiveComponent.render/1.

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

set(assigns, reusable_modal_id \\ nil, opts \\ [])

+ + + + View Source + + + +
+ +
+ +
diff --git a/Bonfire.UI.Common.Routes.html b/Bonfire.UI.Common.Routes.html index 9046b60322..e5744cefaf 100644 --- a/Bonfire.UI.Common.Routes.html +++ b/Bonfire.UI.Common.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -273,7 +273,7 @@

early_hints_shared()

gon_js_config()

- + View Source diff --git a/Bonfire.UI.Common.SEO.html b/Bonfire.UI.Common.SEO.html index 122d61c941..375b344ef2 100644 --- a/Bonfire.UI.Common.SEO.html +++ b/Bonfire.UI.Common.SEO.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.SEO — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.SEO — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.SEO - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.SEOImage.html b/Bonfire.UI.Common.SEOImage.html index 11ffba7572..5d40de9d78 100644 --- a/Bonfire.UI.Common.SEOImage.html +++ b/Bonfire.UI.Common.SEOImage.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.SEOImage — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.SEOImage — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.SEOImage - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.SettingsModule.html b/Bonfire.UI.Common.SettingsModule.html index 100f6f389f..c61a7f5c62 100644 --- a/Bonfire.UI.Common.SettingsModule.html +++ b/Bonfire.UI.Common.SettingsModule.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.SettingsModule — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.SettingsModule — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.SettingsModule behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.SmartInput.LiveHandler.html b/Bonfire.UI.Common.SmartInput.LiveHandler.html index 42ac7381bc..cc46732897 100644 --- a/Bonfire.UI.Common.SmartInput.LiveHandler.html +++ b/Bonfire.UI.Common.SmartInput.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.SmartInput.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.SmartInput.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.SmartInput.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.SmartInputModule.html b/Bonfire.UI.Common.SmartInputModule.html index c0eb2a4fae..6c64133a3a 100644 --- a/Bonfire.UI.Common.SmartInputModule.html +++ b/Bonfire.UI.Common.SmartInputModule.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.SmartInputModule — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.SmartInputModule — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,16 +132,16 @@

Bonfire.UI.Common.SmartInputModule behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

Find a smart input module via the object type(s) it can create, or vice versa. Backed by a global cache of known smart input modules.

To add a module to this list, you should declare @behaviour Bonfire.UI.Common.SmartInputModule in it and define a smart_input_module/0 function which returns a list of object types that it can create.

Example:

@behaviour Bonfire.UI.Common.SmartInputModule
-def smart_input_module, do: [:page, Bonfire.Pages.Page]

You can then open the smart input composer / object creator using that declared type, for example:

<Bonfire.UI.Common.SmartInputButtonLive
-  create_object_type={:page}
-  prompt={l("New page")}
+def smart_input_module, do: [:page, Bonfire.Pages.Page]

You can then open the smart input composer / object creator using that declared type, for example:

<Bonfire.UI.Common.SmartInputButtonLive
+  create_object_type={:page}
+  prompt={l("New page")}
   icon="mdi:pencil"
 />
diff --git a/Bonfire.UI.Common.StaticGenerator.html b/Bonfire.UI.Common.StaticGenerator.html index 2f97fdd86f..ecafbd18e5 100644 --- a/Bonfire.UI.Common.StaticGenerator.html +++ b/Bonfire.UI.Common.StaticGenerator.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.StaticGenerator — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.StaticGenerator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.StaticGenerator - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.StaticGeneratorPlug.html b/Bonfire.UI.Common.StaticGeneratorPlug.html index a18ad417c6..8fd90e7c8e 100644 --- a/Bonfire.UI.Common.StaticGeneratorPlug.html +++ b/Bonfire.UI.Common.StaticGeneratorPlug.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.StaticGeneratorPlug — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.StaticGeneratorPlug — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.StaticGeneratorPlug - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.Testing.Helpers.html b/Bonfire.UI.Common.Testing.Helpers.html index c0db6dc1df..3d2c4cefd1 100644 --- a/Bonfire.UI.Common.Testing.Helpers.html +++ b/Bonfire.UI.Common.Testing.Helpers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.Testing.Helpers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.Testing.Helpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.Testing.Helpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.WidgetModule.html b/Bonfire.UI.Common.WidgetModule.html index 615546c2d6..e3fbc79a21 100644 --- a/Bonfire.UI.Common.WidgetModule.html +++ b/Bonfire.UI.Common.WidgetModule.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common.WidgetModule — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common.WidgetModule — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common.WidgetModule behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Common.html b/Bonfire.UI.Common.html index 279bcf8dda..d63992ed93 100644 --- a/Bonfire.UI.Common.html +++ b/Bonfire.UI.Common.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Common — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Common — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Common - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -230,6 +230,14 @@

+
+ + +
+
assigns_clean(tuple) @@ -312,6 +320,22 @@

+ + + +
copy_go(arg1) @@ -348,6 +372,14 @@

+ +
go_query(url) @@ -500,6 +532,14 @@

+ +
opts_for_update_many_async(arg, opts) @@ -709,7 +749,7 @@

assign_error(socket, msg, pid \\ self())

- + View Source @@ -735,7 +775,7 @@

assign_error(socket, msg, pid \\ self())

assign_flash(socket_or_conn, type, message, assigns \\ %{}, pid \\ self())

- + View Source @@ -856,6 +896,28 @@

assign_global(socket, key, value)

+
+

+
+ + + +
+ +
@@ -977,7 +1039,7 @@

assigns_subscribe(socket, assign_names)

batch_update_many_async(assigns_sockets, many_opts, opts)

- + View Source @@ -999,7 +1061,7 @@

batch_update_many_async(assigns_sockets, ma

batch_update_many_async(current_user, assigns_sockets, many_opts, opts)

- + View Source @@ -1023,7 +1085,7 @@

batch_update_many_async(current_user, assig

can?(subject, verbs, object, opts \\ [])

- + View Source @@ -1078,6 +1140,50 @@

cast_self(socket, assigns_to_broadcast)

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

component_data(module)

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

component_props(module)

+ + + + View Source + + + +
+ +
+ +
@@ -1089,7 +1195,7 @@

cast_self(socket, assigns_to_broadcast)

copy_go(arg1)

- + View Source @@ -1170,6 +1276,28 @@

declared_extension()

Callback implementation for Bonfire.Common.ExtensionModule.declared_extension/0.

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

filename_for_module_template(module)

+ + + + View Source + + + +
+ +
+ +
@@ -1181,7 +1309,7 @@

declared_extension()

go_query(url)

- + View Source @@ -1204,7 +1332,7 @@

go_query(url)

hero_icons_list()

- + View Source @@ -1230,7 +1358,7 @@

hero_icons_list()

live_aliases(aliases, path, live_view, action \\ nil, opts \\ [])

- + View Source @@ -1302,7 +1430,7 @@

live_render_with_conn(conn, live_view)

live_upload_files(module \\ nil, upload_field \\ :files, current_user, metadata, socket)

- + View Source @@ -1390,7 +1518,7 @@

maybe_assign(socket, key, value)

maybe_assign_context(socket, ret)

- + View Source @@ -1436,7 +1564,7 @@

maybe_component(module, context \\ [])

maybe_consume_uploaded_entries(socket, key, fun)

- + View Source @@ -1458,7 +1586,7 @@

maybe_consume_uploaded_entries(socket, key,

maybe_consume_uploaded_entry(socket, key, fun)

- + View Source @@ -1480,7 +1608,7 @@

maybe_consume_uploaded_entry(socket, key, f

maybe_cute_gif()

- + View Source @@ -1524,7 +1652,7 @@

maybe_last_sentry_event_id()

maybe_push_event(socket, name, data)

- + View Source @@ -1570,7 +1698,7 @@

maybe_send_update(component, id, assigns, o

maybe_stream_insert(socket, name, items, opts)

- + View Source @@ -1582,6 +1710,28 @@

maybe_stream_insert(socket, name, items, op

Inserts one or many items in an existing stream. See Phoenix.LiveView.stream_insert/4 for opts.

+

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

module_default_assigns(module)

+ + + + View Source + + + +
+ +
+ +
@@ -1593,7 +1743,7 @@

maybe_stream_insert(socket, name, items, op

opts_for_update_many_async(arg, opts)

- + View Source @@ -1619,7 +1769,7 @@

opts_for_update_many_async(arg, opts)

patch_to(socket_or_conn, to \\ nil, opts \\ [])

- + View Source @@ -1641,7 +1791,7 @@

patch_to(socket_or_conn, to \\ nil, opts \\

path_fallback(socket_or_conn, opts)

- + View Source @@ -1711,7 +1861,7 @@

redirect_to(socket_or_conn, to \\ nil, opts

redirect_to_previous_go(conn, params, default, current_path)

- + View Source @@ -1855,7 +2005,7 @@

send_self_global(socket \\ nil, assigns)

set_go_after(conn, path \\ nil)

- + View Source @@ -1877,7 +2027,7 @@

set_go_after(conn, path \\ nil)

socket_connected?(socket)

- + View Source @@ -1893,19 +2043,19 @@

socket_connected?(socket)

Examples -
iex> socket_connected?(%{socket_connected?: true})
+
iex> socket_connected?(%{socket_connected?: true})
 true
 
-iex> socket_connected?(%{socket_connected?: false})
+iex> socket_connected?(%{socket_connected?: false})
 false
 
-iex> socket_connected?(%{__context__: %{socket_connected?: true}})
+iex> socket_connected?(%{__context__: %{socket_connected?: true}})
 true
 
-iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: 1})
+iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: 1})
 true
 
-iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: nil})
+iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: nil})
 false
@@ -1966,7 +2116,7 @@

templated_or_remote_markdown(content, data

the_object(assigns)

- + View Source @@ -2077,7 +2227,7 @@

undead_update(socket, fun)

update_many_async(assigns_sockets, opts)

- + View Source @@ -2099,7 +2249,7 @@

update_many_async(assigns_sockets, opts)

update_many_async(current_user, assigns_sockets, opts)

- + View Source diff --git a/Bonfire.UI.Coordination.FeedLive.GraphQL.html b/Bonfire.UI.Coordination.FeedLive.GraphQL.html index aa38fbfebb..ce131eeb95 100644 --- a/Bonfire.UI.Coordination.FeedLive.GraphQL.html +++ b/Bonfire.UI.Coordination.FeedLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.FeedLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.FeedLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.FeedLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.ProcessLive.GraphQL.html b/Bonfire.UI.Coordination.ProcessLive.GraphQL.html index 0fca1f88bc..73b9de90f2 100644 --- a/Bonfire.UI.Coordination.ProcessLive.GraphQL.html +++ b/Bonfire.UI.Coordination.ProcessLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.ProcessLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.ProcessLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.ProcessLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.ProcessesLive.GraphQL.html b/Bonfire.UI.Coordination.ProcessesLive.GraphQL.html index 33b35d1b08..2540c63f9c 100644 --- a/Bonfire.UI.Coordination.ProcessesLive.GraphQL.html +++ b/Bonfire.UI.Coordination.ProcessesLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.ProcessesLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.ProcessesLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.ProcessesLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.Routes.html b/Bonfire.UI.Coordination.Routes.html index 93bbd78479..a2c9a6da87 100644 --- a/Bonfire.UI.Coordination.Routes.html +++ b/Bonfire.UI.Coordination.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.TaskLive.GraphQL.html b/Bonfire.UI.Coordination.TaskLive.GraphQL.html index f85abf58f6..2cabb14a0b 100644 --- a/Bonfire.UI.Coordination.TaskLive.GraphQL.html +++ b/Bonfire.UI.Coordination.TaskLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.TaskLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.TaskLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.TaskLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.TasksLive.GraphQL.html b/Bonfire.UI.Coordination.TasksLive.GraphQL.html index 68b73fc97d..5c916116e3 100644 --- a/Bonfire.UI.Coordination.TasksLive.GraphQL.html +++ b/Bonfire.UI.Coordination.TasksLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.TasksLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.TasksLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.TasksLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.TodoLive.GraphQL.html b/Bonfire.UI.Coordination.TodoLive.GraphQL.html index 93a27e6829..f9527c8caf 100644 --- a/Bonfire.UI.Coordination.TodoLive.GraphQL.html +++ b/Bonfire.UI.Coordination.TodoLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination.TodoLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination.TodoLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination.TodoLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Coordination.html b/Bonfire.UI.Coordination.html index 7fa93854f1..d9afde53b7 100644 --- a/Bonfire.UI.Coordination.html +++ b/Bonfire.UI.Coordination.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Coordination — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Coordination — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Coordination - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Groups.LiveHandler.html b/Bonfire.UI.Groups.LiveHandler.html index 1da98440fa..53b3eec79d 100644 --- a/Bonfire.UI.Groups.LiveHandler.html +++ b/Bonfire.UI.Groups.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Groups.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Groups.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Groups.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Groups.Routes.html b/Bonfire.UI.Groups.Routes.html index 6f03d458c0..e7ba69a54f 100644 --- a/Bonfire.UI.Groups.Routes.html +++ b/Bonfire.UI.Groups.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Groups.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Groups.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Groups.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Groups.RuntimeConfig.html b/Bonfire.UI.Groups.RuntimeConfig.html index 3092cf30f7..b40b3dd825 100644 --- a/Bonfire.UI.Groups.RuntimeConfig.html +++ b/Bonfire.UI.Groups.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Groups.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Groups.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Groups.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Groups.html b/Bonfire.UI.Groups.html index 892eee2df9..d1ee82d328 100644 --- a/Bonfire.UI.Groups.html +++ b/Bonfire.UI.Groups.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Groups — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Groups — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Groups - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Kanban.BoardLive.GraphQL.html b/Bonfire.UI.Kanban.BoardLive.GraphQL.html index e31a3dce4b..2b3178d1a5 100644 --- a/Bonfire.UI.Kanban.BoardLive.GraphQL.html +++ b/Bonfire.UI.Kanban.BoardLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Kanban.BoardLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Kanban.BoardLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Kanban.BoardLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Kanban.HomeLive.GraphQL.html b/Bonfire.UI.Kanban.HomeLive.GraphQL.html index 0012efdee7..c8143bce69 100644 --- a/Bonfire.UI.Kanban.HomeLive.GraphQL.html +++ b/Bonfire.UI.Kanban.HomeLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Kanban.HomeLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Kanban.HomeLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Kanban.HomeLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Kanban.Routes.html b/Bonfire.UI.Kanban.Routes.html index 08ccc0a514..5e63d9ba0b 100644 --- a/Bonfire.UI.Kanban.Routes.html +++ b/Bonfire.UI.Kanban.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Kanban.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Kanban.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Kanban.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Kanban.html b/Bonfire.UI.Kanban.html index 22cea8bab5..bfd8706237 100644 --- a/Bonfire.UI.Kanban.html +++ b/Bonfire.UI.Kanban.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Kanban — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Kanban — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Kanban - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.AccountRequired.html b/Bonfire.UI.Me.LivePlugs.AccountRequired.html index 3de08b29a2..a4ebaf54d4 100644 --- a/Bonfire.UI.Me.LivePlugs.AccountRequired.html +++ b/Bonfire.UI.Me.LivePlugs.AccountRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.AccountRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.AccountRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.AccountRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.AdminRequired.html b/Bonfire.UI.Me.LivePlugs.AdminRequired.html index 9cc3b3bde2..87a563136a 100644 --- a/Bonfire.UI.Me.LivePlugs.AdminRequired.html +++ b/Bonfire.UI.Me.LivePlugs.AdminRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.AdminRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.AdminRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.AdminRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html b/Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html index 39167c2997..07e717ce10 100644 --- a/Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html +++ b/Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.LoadCurrentAccount — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.LoadCurrentAccount — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.LoadCurrentAccount - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html b/Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html index f8c4ccde62..7d46249ddb 100644 --- a/Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html +++ b/Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html b/Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html index c3df074091..fb56201bc1 100644 --- a/Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html +++ b/Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.LoadCurrentUser — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.LoadCurrentUser — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.LoadCurrentUser - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html b/Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html index 0bd940d2ef..0a14bc98b4 100644 --- a/Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html +++ b/Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.LivePlugs.UserRequired.html b/Bonfire.UI.Me.LivePlugs.UserRequired.html index 2b0edc598a..a42b7e1766 100644 --- a/Bonfire.UI.Me.LivePlugs.UserRequired.html +++ b/Bonfire.UI.Me.LivePlugs.UserRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.LivePlugs.UserRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.LivePlugs.UserRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.LivePlugs.UserRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.AccountRequired.html b/Bonfire.UI.Me.Plugs.AccountRequired.html index badd8122ac..6423be7933 100644 --- a/Bonfire.UI.Me.Plugs.AccountRequired.html +++ b/Bonfire.UI.Me.Plugs.AccountRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.AccountRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.AccountRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.AccountRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.AdminRequired.html b/Bonfire.UI.Me.Plugs.AdminRequired.html index 6b09b57bc0..a89b612671 100644 --- a/Bonfire.UI.Me.Plugs.AdminRequired.html +++ b/Bonfire.UI.Me.Plugs.AdminRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.AdminRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.AdminRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.AdminRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.GuestOnly.html b/Bonfire.UI.Me.Plugs.GuestOnly.html index effab6bbcf..ce07099fc7 100644 --- a/Bonfire.UI.Me.Plugs.GuestOnly.html +++ b/Bonfire.UI.Me.Plugs.GuestOnly.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.GuestOnly — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.GuestOnly — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.GuestOnly - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.LoadCurrentAccount.html b/Bonfire.UI.Me.Plugs.LoadCurrentAccount.html index e6dee03ac6..2f45fbb4ff 100644 --- a/Bonfire.UI.Me.Plugs.LoadCurrentAccount.html +++ b/Bonfire.UI.Me.Plugs.LoadCurrentAccount.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.LoadCurrentAccount — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.LoadCurrentAccount — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.LoadCurrentAccount - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html b/Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html index 413d16cc4e..82e0681c05 100644 --- a/Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html +++ b/Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.LoadCurrentUser.html b/Bonfire.UI.Me.Plugs.LoadCurrentUser.html index 5e1df37769..efc93927ca 100644 --- a/Bonfire.UI.Me.Plugs.LoadCurrentUser.html +++ b/Bonfire.UI.Me.Plugs.LoadCurrentUser.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.LoadCurrentUser — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.LoadCurrentUser — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.LoadCurrentUser - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Plugs.UserRequired.html b/Bonfire.UI.Me.Plugs.UserRequired.html index 82e3ed246a..be51690542 100644 --- a/Bonfire.UI.Me.Plugs.UserRequired.html +++ b/Bonfire.UI.Me.Plugs.UserRequired.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Plugs.UserRequired — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Plugs.UserRequired — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Plugs.UserRequired - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.Routes.html b/Bonfire.UI.Me.Routes.html index d410a1d4cc..e349c53e11 100644 --- a/Bonfire.UI.Me.Routes.html +++ b/Bonfire.UI.Me.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.RuntimeConfig.html b/Bonfire.UI.Me.RuntimeConfig.html index 6315ef6100..8d5cdde30a 100644 --- a/Bonfire.UI.Me.RuntimeConfig.html +++ b/Bonfire.UI.Me.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Me.html b/Bonfire.UI.Me.html index b828a71fdf..b4b23d3296 100644 --- a/Bonfire.UI.Me.html +++ b/Bonfire.UI.Me.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Me — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Me — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Me - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Messages.Routes.html b/Bonfire.UI.Messages.Routes.html index d0feaa4676..e7b711c40e 100644 --- a/Bonfire.UI.Messages.Routes.html +++ b/Bonfire.UI.Messages.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Messages.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Messages.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Messages.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Messages.RuntimeConfig.html b/Bonfire.UI.Messages.RuntimeConfig.html index a27faa9b22..43222a8fd0 100644 --- a/Bonfire.UI.Messages.RuntimeConfig.html +++ b/Bonfire.UI.Messages.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Messages.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Messages.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Messages.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Messages.html b/Bonfire.UI.Messages.html index 24136989ed..e3b2668ed3 100644 --- a/Bonfire.UI.Messages.html +++ b/Bonfire.UI.Messages.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Messages — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Messages — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Moderation.RuntimeConfig.html b/Bonfire.UI.Moderation.RuntimeConfig.html index bdbab4209f..d064f32836 100644 --- a/Bonfire.UI.Moderation.RuntimeConfig.html +++ b/Bonfire.UI.Moderation.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Moderation.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Moderation.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Moderation.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Moderation.html b/Bonfire.UI.Moderation.html index 05a3686a14..5722b908bf 100644 --- a/Bonfire.UI.Moderation.html +++ b/Bonfire.UI.Moderation.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Moderation — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Moderation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Posts.Routes.html b/Bonfire.UI.Posts.Routes.html index 53a7312b07..fba459d9de 100644 --- a/Bonfire.UI.Posts.Routes.html +++ b/Bonfire.UI.Posts.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Posts.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Posts.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Posts.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Posts.RuntimeConfig.html b/Bonfire.UI.Posts.RuntimeConfig.html index fae0491b93..3c88d52188 100644 --- a/Bonfire.UI.Posts.RuntimeConfig.html +++ b/Bonfire.UI.Posts.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Posts.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Posts.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Posts.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Posts.html b/Bonfire.UI.Posts.html index 1b54d74516..1301dc1fa1 100644 --- a/Bonfire.UI.Posts.html +++ b/Bonfire.UI.Posts.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Posts — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Posts — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Reactions.Routes.html b/Bonfire.UI.Reactions.Routes.html index 2daee9a178..3c45eb18cd 100644 --- a/Bonfire.UI.Reactions.Routes.html +++ b/Bonfire.UI.Reactions.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reactions.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reactions.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reactions.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reactions.RuntimeConfig.html b/Bonfire.UI.Reactions.RuntimeConfig.html index 581319fc43..6a1b896911 100644 --- a/Bonfire.UI.Reactions.RuntimeConfig.html +++ b/Bonfire.UI.Reactions.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reactions.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reactions.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reactions.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reactions.html b/Bonfire.UI.Reactions.html index 7f9906da4a..a0559fa666 100644 --- a/Bonfire.UI.Reactions.html +++ b/Bonfire.UI.Reactions.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reactions — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reactions — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Reflow.Integration.html b/Bonfire.UI.Reflow.Integration.html index f71e6a06d0..aa967ae12a 100644 --- a/Bonfire.UI.Reflow.Integration.html +++ b/Bonfire.UI.Reflow.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.InventoryLive.GraphQL.html b/Bonfire.UI.Reflow.InventoryLive.GraphQL.html index 15b27b4c85..445c4e2c5b 100644 --- a/Bonfire.UI.Reflow.InventoryLive.GraphQL.html +++ b/Bonfire.UI.Reflow.InventoryLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.InventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.InventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.InventoryLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.MaterialsLive.GraphQL.html b/Bonfire.UI.Reflow.MaterialsLive.GraphQL.html index c34ad54763..e65a1bebf7 100644 --- a/Bonfire.UI.Reflow.MaterialsLive.GraphQL.html +++ b/Bonfire.UI.Reflow.MaterialsLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.MaterialsLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.MaterialsLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.MaterialsLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.ProcessLive.GraphQL.html b/Bonfire.UI.Reflow.ProcessLive.GraphQL.html index dcacd0cd45..f0f537701c 100644 --- a/Bonfire.UI.Reflow.ProcessLive.GraphQL.html +++ b/Bonfire.UI.Reflow.ProcessLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.ProcessLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.ProcessLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.ProcessLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.ProcessesLive.GraphQL.html b/Bonfire.UI.Reflow.ProcessesLive.GraphQL.html index 2e85f86740..6719cba97d 100644 --- a/Bonfire.UI.Reflow.ProcessesLive.GraphQL.html +++ b/Bonfire.UI.Reflow.ProcessesLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.ProcessesLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.ProcessesLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.ProcessesLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html b/Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html index 4a001a66c0..8b7f8e7dce 100644 --- a/Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html +++ b/Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.ResourceLive.GraphQL.html b/Bonfire.UI.Reflow.ResourceLive.GraphQL.html index 61957c4789..f02743b0dd 100644 --- a/Bonfire.UI.Reflow.ResourceLive.GraphQL.html +++ b/Bonfire.UI.Reflow.ResourceLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.ResourceLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.ResourceLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.ResourceLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.Routes.html b/Bonfire.UI.Reflow.Routes.html index 1826850e5d..71fd410b8d 100644 --- a/Bonfire.UI.Reflow.Routes.html +++ b/Bonfire.UI.Reflow.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Reflow.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Reflow.html b/Bonfire.UI.Reflow.html index 5e82a47d39..66035b4aca 100644 --- a/Bonfire.UI.Reflow.html +++ b/Bonfire.UI.Reflow.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Reflow — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Reflow — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Social.Benchmark.html b/Bonfire.UI.Social.Benchmark.html index 7c131af761..6b9940f112 100644 --- a/Bonfire.UI.Social.Benchmark.html +++ b/Bonfire.UI.Social.Benchmark.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.Benchmark — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.Benchmark — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Social.Benchmark - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Social.Graph.RuntimeConfig.html b/Bonfire.UI.Social.Graph.RuntimeConfig.html index 5e40f4f9c2..0e40e7086c 100644 --- a/Bonfire.UI.Social.Graph.RuntimeConfig.html +++ b/Bonfire.UI.Social.Graph.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.Graph.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.Graph.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Social.Graph.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Social.Integration.html b/Bonfire.UI.Social.Integration.html index e74c2673ee..82d865624b 100644 --- a/Bonfire.UI.Social.Integration.html +++ b/Bonfire.UI.Social.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Social.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Social.Routes.html b/Bonfire.UI.Social.Routes.html index a6f06a5cfa..444d9a7752 100644 --- a/Bonfire.UI.Social.Routes.html +++ b/Bonfire.UI.Social.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Social.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Social.RuntimeConfig.html b/Bonfire.UI.Social.RuntimeConfig.html index c1f540dfcc..53aebc4441 100644 --- a/Bonfire.UI.Social.RuntimeConfig.html +++ b/Bonfire.UI.Social.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Social.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Social.html b/Bonfire.UI.Social.html index 7309bda807..7cb5e9d0c5 100644 --- a/Bonfire.UI.Social.html +++ b/Bonfire.UI.Social.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.SocialGraph.html b/Bonfire.UI.SocialGraph.html index fb7cace0c3..cefdc136cb 100644 --- a/Bonfire.UI.SocialGraph.html +++ b/Bonfire.UI.SocialGraph.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Social.Graph — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Social.Graph — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.UI.Topics.LiveHandler.html b/Bonfire.UI.Topics.LiveHandler.html index 654f54a38e..e61943d026 100644 --- a/Bonfire.UI.Topics.LiveHandler.html +++ b/Bonfire.UI.Topics.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Topics.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Topics.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Topics.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Topics.Routes.html b/Bonfire.UI.Topics.Routes.html index 489371c8f2..ef53b5671d 100644 --- a/Bonfire.UI.Topics.Routes.html +++ b/Bonfire.UI.Topics.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Topics.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Topics.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Topics.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Topics.RuntimeConfig.html b/Bonfire.UI.Topics.RuntimeConfig.html index a2ea8dd24b..79d34956e4 100644 --- a/Bonfire.UI.Topics.RuntimeConfig.html +++ b/Bonfire.UI.Topics.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Topics.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Topics.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Topics.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Topics.html b/Bonfire.UI.Topics.html index 130573d22a..01f5e739c0 100644 --- a/Bonfire.UI.Topics.html +++ b/Bonfire.UI.Topics.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.Topics — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.Topics — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.Topics - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html b/Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html index 795a2c00e8..fe7ec2a934 100644 --- a/Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html +++ b/Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html b/Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html index 1b60a0f721..3d428e0f95 100644 --- a/Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html +++ b/Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.CreateResourceSpecForm.html b/Bonfire.UI.ValueFlows.CreateResourceSpecForm.html index e8a21e2e6b..d80c2080fa 100644 --- a/Bonfire.UI.ValueFlows.CreateResourceSpecForm.html +++ b/Bonfire.UI.ValueFlows.CreateResourceSpecForm.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.CreateResourceSpecForm — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.CreateResourceSpecForm — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.CreateResourceSpecForm - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.CreateUnitForm.html b/Bonfire.UI.ValueFlows.CreateUnitForm.html index 699943b617..32b5c362e0 100644 --- a/Bonfire.UI.ValueFlows.CreateUnitForm.html +++ b/Bonfire.UI.ValueFlows.CreateUnitForm.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.CreateUnitForm — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.CreateUnitForm — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.CreateUnitForm - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.CreateValueCalculationForm.html b/Bonfire.UI.ValueFlows.CreateValueCalculationForm.html index 7899422738..04eaa9c233 100644 --- a/Bonfire.UI.ValueFlows.CreateValueCalculationForm.html +++ b/Bonfire.UI.ValueFlows.CreateValueCalculationForm.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.CreateValueCalculationForm — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.CreateValueCalculationForm — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.CreateValueCalculationForm - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.Integration.html b/Bonfire.UI.ValueFlows.Integration.html index 46efa28b50..dca41af965 100644 --- a/Bonfire.UI.ValueFlows.Integration.html +++ b/Bonfire.UI.ValueFlows.Integration.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.Integration — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html b/Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html index 76d16eb9c1..b139266d7e 100644 --- a/Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html +++ b/Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.RuntimeConfig.html b/Bonfire.UI.ValueFlows.RuntimeConfig.html index e37964856e..93dbb34f42 100644 --- a/Bonfire.UI.ValueFlows.RuntimeConfig.html +++ b/Bonfire.UI.ValueFlows.RuntimeConfig.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.RuntimeConfig — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.RuntimeConfig — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.RuntimeConfig - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html b/Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html index 74f99d1fd0..a32c8fe7ca 100644 --- a/Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html +++ b/Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows.SettingsLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows.SettingsLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.UI.ValueFlows.SettingsLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.UI.Valueflows.html b/Bonfire.UI.Valueflows.html index 525b280430..5bd9f4ac11 100644 --- a/Bonfire.UI.Valueflows.html +++ b/Bonfire.UI.Valueflows.html @@ -5,16 +5,16 @@ - + - Bonfire.UI.ValueFlows — Bonfire v0.9.10-classic-beta.156 + Bonfire.UI.ValueFlows — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.Upcycle.IntentLive.GraphQL.html b/Bonfire.Upcycle.IntentLive.GraphQL.html index 87b8e9821c..d50246e10b 100644 --- a/Bonfire.Upcycle.IntentLive.GraphQL.html +++ b/Bonfire.Upcycle.IntentLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.IntentLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.IntentLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.IntentLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.MapLive.GraphQL.html b/Bonfire.Upcycle.MapLive.GraphQL.html index e5bfd73d27..978ccacf92 100644 --- a/Bonfire.Upcycle.MapLive.GraphQL.html +++ b/Bonfire.Upcycle.MapLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.MapLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.MapLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.MapLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.ResourceLive.GraphQL.html b/Bonfire.Upcycle.ResourceLive.GraphQL.html index 512dda8ef4..7349187030 100644 --- a/Bonfire.Upcycle.ResourceLive.GraphQL.html +++ b/Bonfire.Upcycle.ResourceLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.ResourceLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.ResourceLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.ResourceLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.Web.HomeLive.GraphQL.html b/Bonfire.Upcycle.Web.HomeLive.GraphQL.html index 15691d2984..b9cba36fdc 100644 --- a/Bonfire.Upcycle.Web.HomeLive.GraphQL.html +++ b/Bonfire.Upcycle.Web.HomeLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.Web.HomeLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.Web.HomeLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.Web.HomeLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.Web.InventoryLive.GraphQL.html b/Bonfire.Upcycle.Web.InventoryLive.GraphQL.html index 4d895094d7..6b6ee17861 100644 --- a/Bonfire.Upcycle.Web.InventoryLive.GraphQL.html +++ b/Bonfire.Upcycle.Web.InventoryLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.Web.InventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.Web.InventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.Web.InventoryLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.Web.Routes.html b/Bonfire.Upcycle.Web.Routes.html index 24588cd1a9..806577f31a 100644 --- a/Bonfire.Upcycle.Web.Routes.html +++ b/Bonfire.Upcycle.Web.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.Web.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.Web.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.Web.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.Web.TransfersLive.GraphQL.html b/Bonfire.Upcycle.Web.TransfersLive.GraphQL.html index d1d1cae290..6091dd14f3 100644 --- a/Bonfire.Upcycle.Web.TransfersLive.GraphQL.html +++ b/Bonfire.Upcycle.Web.TransfersLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle.Web.TransfersLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle.Web.TransfersLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle.Web.TransfersLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Upcycle.html b/Bonfire.Upcycle.html index a67f1d8c20..3995db4dce 100644 --- a/Bonfire.Upcycle.html +++ b/Bonfire.Upcycle.html @@ -5,16 +5,16 @@ - + - Bonfire.Upcycle — Bonfire v0.9.10-classic-beta.156 + Bonfire.Upcycle — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Upcycle - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Valueflows.html b/Bonfire.Valueflows.html index 56b68301be..e1dd122778 100644 --- a/Bonfire.Valueflows.html +++ b/Bonfire.Valueflows.html @@ -5,16 +5,16 @@ - + - ValueFlows — Bonfire v0.9.10-classic-beta.156 + ValueFlows — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.ValueflowsObserve.html b/Bonfire.ValueflowsObserve.html index 23fd070db1..49dd4eb572 100644 --- a/Bonfire.ValueflowsObserve.html +++ b/Bonfire.ValueflowsObserve.html @@ -5,16 +5,16 @@ - + - Bonfire.ValueFlows.Observe — Bonfire v0.9.10-classic-beta.156 + Bonfire.ValueFlows.Observe — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/Bonfire.Web.Endpoint.html b/Bonfire.Web.Endpoint.html index a5ece1e0db..ada1270cf5 100644 --- a/Bonfire.Web.Endpoint.html +++ b/Bonfire.Web.Endpoint.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.Endpoint — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.Endpoint — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Web.Endpoint - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Web.FakeRemoteEndpoint.html b/Bonfire.Web.FakeRemoteEndpoint.html index aee6f8f41b..051f0c3591 100644 --- a/Bonfire.Web.FakeRemoteEndpoint.html +++ b/Bonfire.Web.FakeRemoteEndpoint.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.FakeRemoteEndpoint — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.FakeRemoteEndpoint — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Web.FakeRemoteEndpoint - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Web.Router.CORS.html b/Bonfire.Web.Router.CORS.html index 43aae02159..23968028d3 100644 --- a/Bonfire.Web.Router.CORS.html +++ b/Bonfire.Web.Router.CORS.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.Router.CORS — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.Router.CORS — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Web.Router.CORS - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Web.Router.Reverse.html b/Bonfire.Web.Router.Reverse.html index 4cfc6ff33c..3d4beb2c34 100644 --- a/Bonfire.Web.Router.Reverse.html +++ b/Bonfire.Web.Router.Reverse.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.Router.Reverse — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.Router.Reverse — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Web.Router.Reverse - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Web.Router.Routes.html b/Bonfire.Web.Router.Routes.html index 082a98adb3..72b4d78276 100644 --- a/Bonfire.Web.Router.Routes.html +++ b/Bonfire.Web.Router.Routes.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.Router.Routes — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.Router.Routes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Bonfire.Web.Router.Routes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.Web.Router.html b/Bonfire.Web.Router.html index 22ef0bd5d0..674092835b 100644 --- a/Bonfire.Web.Router.html +++ b/Bonfire.Web.Router.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.Router — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.Router — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -126,13 +126,13 @@

- + View Source Bonfire.Web.Router - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -362,7 +362,7 @@

account_required(conn, _)

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

account_required(conn, _)

activity_json(conn, _)

- + View Source @@ -406,7 +406,7 @@

activity_json(conn, _)

activity_json_or_html(conn, _)

- + View Source @@ -428,7 +428,7 @@

activity_json_or_html(conn, _)

admin_required(conn, _)

- + View Source @@ -450,7 +450,7 @@

admin_required(conn, _)

basic(conn, _)

- + View Source @@ -472,7 +472,7 @@

basic(conn, _)

basic_html(conn, _)

- + View Source @@ -494,7 +494,7 @@

basic_html(conn, _)

basic_json(conn, _)

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

basic_json(conn, _)

browser(conn, _)

- + View Source @@ -538,7 +538,7 @@

browser(conn, _)

browser_unsafe(conn, _)

- + View Source @@ -560,7 +560,7 @@

browser_unsafe(conn, _)

call(conn, opts)

- + View Source @@ -582,7 +582,7 @@

call(conn, opts)

early_hints_authed(conn, _)

- + View Source @@ -604,7 +604,7 @@

early_hints_authed(conn, _)

guest_only(conn, _)

- + View Source @@ -626,7 +626,7 @@

guest_only(conn, _)

html_only(conn, _)

- + View Source @@ -648,7 +648,7 @@

html_only(conn, _)

init(opts)

- + View Source @@ -671,7 +671,7 @@

init(opts)

load_current_auth(conn, _)

- + View Source @@ -693,7 +693,7 @@

load_current_auth(conn, _)

require_authenticated_user(conn, _)

- + View Source @@ -715,7 +715,7 @@

require_authenticated_user(conn, _)

signed_activity_pub_fetch(conn, _)

- + View Source @@ -737,7 +737,7 @@

signed_activity_pub_fetch(conn, _)

signed_activity_pub_incoming(conn, _)

- + View Source @@ -759,7 +759,7 @@

signed_activity_pub_incoming(conn, _)

static_generator(conn, _)

- + View Source @@ -781,7 +781,7 @@

static_generator(conn, _)

throttle_plug_attacks(conn, _)

- + View Source @@ -803,7 +803,7 @@

throttle_plug_attacks(conn, _)

user_required(conn, _)

- + View Source @@ -825,7 +825,7 @@

user_required(conn, _)

webfinger(conn, _)

- + View Source @@ -847,7 +847,7 @@

webfinger(conn, _)

well_known_nodeinfo(conn, _)

- + View Source diff --git a/Bonfire.Web.ViewInventoryLive.GraphQL.html b/Bonfire.Web.ViewInventoryLive.GraphQL.html index dded4b8bd3..caa3b26859 100644 --- a/Bonfire.Web.ViewInventoryLive.GraphQL.html +++ b/Bonfire.Web.ViewInventoryLive.GraphQL.html @@ -5,16 +5,16 @@ - + - Bonfire.Web.ViewInventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.156 + Bonfire.Web.ViewInventoryLive.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Bonfire.Web.ViewInventoryLive.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Bonfire.epub b/Bonfire.epub index c2d6c35aab..dcd2051594 100644 Binary files a/Bonfire.epub and b/Bonfire.epub differ diff --git a/Bonfire.html b/Bonfire.html index 42fe70b9e2..fa3fa000b6 100644 --- a/Bonfire.html +++ b/Bonfire.html @@ -5,16 +5,16 @@ - + - Bonfire — Bonfire v0.9.10-classic-beta.156 + Bonfire — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/ConsoleHelpers.html b/ConsoleHelpers.html index 472163d32a..dbba4443fd 100644 --- a/ConsoleHelpers.html +++ b/ConsoleHelpers.html @@ -5,16 +5,16 @@ - + - ConsoleHelpers — Bonfire v0.9.10-classic-beta.156 + ConsoleHelpers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

ConsoleHelpers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/DaisyTheme.html b/DaisyTheme.html index 33d075f205..ce7f021a08 100644 --- a/DaisyTheme.html +++ b/DaisyTheme.html @@ -5,16 +5,16 @@ - + - DaisyTheme — Bonfire v0.9.10-classic-beta.156 + DaisyTheme — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

DaisyTheme - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/DummyAdapter.html b/DummyAdapter.html index 12b8a99ee8..81b0f34fba 100644 --- a/DummyAdapter.html +++ b/DummyAdapter.html @@ -5,16 +5,16 @@ - + - DummyAdapter — Bonfire v0.9.10-classic-beta.156 + DummyAdapter — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

DummyAdapter - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.AutoMigrator.html b/EctoSparkles.AutoMigrator.html index 8dce23dc14..07ac7dbfe1 100644 --- a/EctoSparkles.AutoMigrator.html +++ b/EctoSparkles.AutoMigrator.html @@ -5,16 +5,16 @@ - + - EctoSparkles.AutoMigrator — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.AutoMigrator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.AutoMigrator - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.Changesets.Errors.html b/EctoSparkles.Changesets.Errors.html index e09723cbeb..c12fcce2fb 100644 --- a/EctoSparkles.Changesets.Errors.html +++ b/EctoSparkles.Changesets.Errors.html @@ -5,16 +5,16 @@ - + - EctoSparkles.Changesets.Errors — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.Changesets.Errors — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.Changesets.Errors - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.DataMigration.Config.html b/EctoSparkles.DataMigration.Config.html index 5da1a0c741..7c8a82b329 100644 --- a/EctoSparkles.DataMigration.Config.html +++ b/EctoSparkles.DataMigration.Config.html @@ -5,16 +5,16 @@ - + - EctoSparkles.DataMigration.Config — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.DataMigration.Config — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.DataMigration.Config - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.DataMigration.Runner.html b/EctoSparkles.DataMigration.Runner.html index 4b67d7b9d8..9f6f543b21 100644 --- a/EctoSparkles.DataMigration.Runner.html +++ b/EctoSparkles.DataMigration.Runner.html @@ -5,16 +5,16 @@ - + - EctoSparkles.DataMigration.Runner — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.DataMigration.Runner — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.DataMigration.Runner - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.DataMigration.html b/EctoSparkles.DataMigration.html index 964f6fa796..7b135e4720 100644 --- a/EctoSparkles.DataMigration.html +++ b/EctoSparkles.DataMigration.html @@ -5,16 +5,16 @@ - + - EctoSparkles.DataMigration — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.DataMigration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,42 +132,42 @@

EctoSparkles.DataMigration behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

-

A behaviour implemented by our data migrations (generally backfills).

Based on A microframework for backfill migrations in Elixir's Ecto, in turn based on David Bernheisel's template for deterministic backfills.

A data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs):

defmodule MyApp.Repo.Migrations.BackfillOnboardingStep do
+

A behaviour implemented by our data migrations (generally backfills).

Based on A microframework for backfill migrations in Elixir's Ecto, in turn based on David Bernheisel's template for deterministic backfills.

A data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs):

defmodule MyApp.Repo.Migrations.BackfillOnboardingStep do
   alias EctoSparkles.DataMigration
   use DataMigration
   
   @impl DataMigration
-  def base_query do
+  def base_query do
     # NOTE: This works in cases where:
     # 1. The data can be queried with a condition that not longer applies after the migration ran, so you can repeatedly query the data and update the data until the query result is empty. For example, if a column is currently null and will be updated to not be null, then you can query for the null records and pick up where you left off.
     # 2. The migration is written in such a way that it can be ran several times on the same data without causing data loss or duplication (or crashing).
 
-    from(u in "users", # Notice how we do not use Ecto schemas here.
-      where: is_nil(u.onboarding_step),
-      select: %{id: u.id}
-    )
-  end
+    from(u in "users", # Notice how we do not use Ecto schemas here.
+      where: is_nil(u.onboarding_step),
+      select: %{id: u.id}
+    )
+  end
 
   @impl DataMigration
-  def config do
-    %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}
-  end
+  def config do
+    %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}
+  end
 
   @impl DataMigration
-  def migrate(results) do
-    Enum.each(results, fn %{id: user_id} ->
+  def migrate(results) do
+    Enum.each(results, fn %{id: user_id} ->
       # hooks into a context module, which is more likely to be kept up to date as the app evolves, to avoid having to update old migrations
       user_id
-      |> MyApp.Users.set_onboarding_step!()
-    end)
-  end
-end
+
|> MyApp.Users.set_onboarding_step!() + end) + end +end
@@ -251,7 +251,7 @@

base_query()

-
@callback base_query() :: Ecto.Query.t()
+
@callback base_query() :: Ecto.Query.t()
diff --git a/EctoSparkles.ErlangTermBinary.html b/EctoSparkles.ErlangTermBinary.html index 20102fbca8..aef35f8d18 100644 --- a/EctoSparkles.ErlangTermBinary.html +++ b/EctoSparkles.ErlangTermBinary.html @@ -5,16 +5,16 @@ - + - EctoSparkles.ErlangTermBinary — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.ErlangTermBinary — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.ErlangTermBinary - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -163,7 +163,7 @@

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -194,7 +194,7 @@

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -204,7 +204,7 @@

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -225,7 +225,7 @@

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

@@ -261,7 +261,7 @@

cast(term)

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -296,7 +296,7 @@

cast(atom, term)

dump(term)

- + View Source @@ -328,7 +328,7 @@

embed_as(_)

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -350,7 +350,7 @@

equal?(term1, term2)

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -395,7 +395,7 @@

type()

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

diff --git a/EctoSparkles.JSONSerdeData.html b/EctoSparkles.JSONSerdeData.html index 483fcc88b1..eaab8be55d 100644 --- a/EctoSparkles.JSONSerdeData.html +++ b/EctoSparkles.JSONSerdeData.html @@ -5,16 +5,16 @@ - + - EctoSparkles.JSONSerdeData — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.JSONSerdeData — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.JSONSerdeData - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -161,7 +161,7 @@

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -192,7 +192,7 @@

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -202,7 +202,7 @@

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -222,7 +222,7 @@

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

@@ -258,7 +258,7 @@

cast(term)

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -325,7 +325,7 @@

embed_as(_)

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -347,7 +347,7 @@

equal?(term1, term2)

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -391,7 +391,7 @@

type()

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

diff --git a/EctoSparkles.Log.html b/EctoSparkles.Log.html index 8e0d69eb31..8b9ff1b00e 100644 --- a/EctoSparkles.Log.html +++ b/EctoSparkles.Log.html @@ -5,16 +5,16 @@ - + - EctoSparkles.Log — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.Log — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.Log - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.Migrator.html b/EctoSparkles.Migrator.html index 12ca68a83c..7995e01f84 100644 --- a/EctoSparkles.Migrator.html +++ b/EctoSparkles.Migrator.html @@ -5,16 +5,16 @@ - + - EctoSparkles.Migrator — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.Migrator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.Migrator - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.NPlus1Detector.html b/EctoSparkles.NPlus1Detector.html index 33e263f5ed..86afbdfdbd 100644 --- a/EctoSparkles.NPlus1Detector.html +++ b/EctoSparkles.NPlus1Detector.html @@ -5,16 +5,16 @@ - + - EctoSparkles.NPlus1Detector — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.NPlus1Detector — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles.NPlus1Detector - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/EctoSparkles.SanitiseStrings.html b/EctoSparkles.SanitiseStrings.html index e320d4d40c..ad26a714ce 100644 --- a/EctoSparkles.SanitiseStrings.html +++ b/EctoSparkles.SanitiseStrings.html @@ -5,16 +5,16 @@ - + - EctoSparkles.SanitiseStrings — Bonfire v0.9.10-classic-beta.156 + EctoSparkles.SanitiseStrings — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,13 +132,13 @@

EctoSparkles.SanitiseStrings - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

-

Provides functions for sanitising input on Ecto.Changeset string fields.

+

Provides functions for sanitising input on Ecto.Changeset string fields.

@@ -177,7 +177,7 @@

-

Sanitises all changes in the given changeset that apply to field which are of the :string Ecto type.

+

Sanitises all changes in the given changeset that apply to field which are of the :string Ecto type.

@@ -263,7 +263,7 @@

strip_all_tags(changeset, opts \\ [])

-

Sanitises all changes in the given changeset that apply to field which are of the :string Ecto type.

By default it uses the HtmlSanitizeEx.strip_tags/1 function on any change that satisfies all of the following conditions:

  1. The field associated with the change is of the type :string.
  2. The field associated with the change is not in the blacklisted_fields list of opts as defined using the :except key in opts. +

    Sanitises all changes in the given changeset that apply to field which are of the :string Ecto type.

    By default it uses the HtmlSanitizeEx.strip_tags/1 function on any change that satisfies all of the following conditions:

    1. The field associated with the change is of the type :string.
    2. The field associated with the change is not in the blacklisted_fields list of opts as defined using the :except key in opts. Note that this function will change the value in the :changes map of an %Ecto.Changeset{} struct if the given changes are sanitized.

    @@ -271,26 +271,26 @@

    strip_all_tags(changeset, opts \\ [])

    Examples

    -
    iex> attrs = %{string_field: "<script>Bad</script>"}
    +
    iex> attrs = %{string_field: "<script>Bad</script>"}
     iex> result_changeset =
     ...>   attrs
    -...>   |> FakeEctoSchema.changeset()
    -...>   |> EctoSparkles.SanitiseStrings.strip_all_tags()
    +...>   |> FakeEctoSchema.changeset()
    +...>   |> EctoSparkles.SanitiseStrings.strip_all_tags()
     iex> result_changeset.changes
    -%{string_field: "Bad"}

    Fields can be exempted from sanitization via the :except option.

    iex> attrs = %{string_field: "<script>Bad</script>"}
    +%{string_field: "Bad"}

    Fields can be exempted from sanitization via the :except option.

    iex> attrs = %{string_field: "<script>Bad</script>"}
     iex> result_changeset =
     ...>   attrs
    -...>   |> FakeEctoSchema.changeset()
    -...>   |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])
    +...>   |> FakeEctoSchema.changeset()
    +...>   |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])
     iex> result_changeset.changes
    -%{string_field: "<script>Bad</script>"}

    +%{string_field: "<script>Bad</script>"}

    You can also specify a specific scrubber (by passing a function as reference):

    -

    ies> attrs

    ...>   |> FakeEctoSchema.changeset()
    -...>   |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)
    +

    ies> attrs

    ...>   |> FakeEctoSchema.changeset()
    +...>   |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)
diff --git a/EctoSparkles.html b/EctoSparkles.html index 52fe8fb99c..0777f3d1bc 100644 --- a/EctoSparkles.html +++ b/EctoSparkles.html @@ -5,16 +5,16 @@ - + - EctoSparkles — Bonfire v0.9.10-classic-beta.156 + EctoSparkles — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

EctoSparkles - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -151,25 +151,25 @@

Examples using standard Ecto

  query
-  |> join(:left, [o, activity: activity], assoc(:object), as: :object)
-  |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})

Ecto requires calling three different functions for this operation: Query.join/4, Query.assoc/3 and Query.preload/2.

Here's another example:

  Invoice
-  |> join(:left, [i], assoc(i, :customer), as: :customer)
-  |> join(:left, [i], assoc(i, :lines), as: :lines)
-  |> preload([lines: v, customers: c], lines: v, customer: c)

+ |> join(:left, [o, activity: activity], assoc(:object), as: :object) + |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})

Ecto requires calling three different functions for this operation: Query.join/4, Query.assoc/3 and Query.preload/2.

Here's another example:

  Invoice
+  |> join(:left, [i], assoc(i, :customer), as: :customer)
+  |> join(:left, [i], assoc(i, :lines), as: :lines)
+  |> preload([lines: v, customers: c], lines: v, customer: c)

Example using proload

-

With proload, you can accomplish this with just one line of code:

proload(query, activity: [:object])

And for the other example:

proload(Invoice, [:customer, :lines])

As a bonus, it automatically makes use of reusable_join so calling it multiple times with the same association has no ill effects.

+

With proload, you can accomplish this with just one line of code:

proload(query, activity: [:object])

And for the other example:

proload(Invoice, [:customer, :lines])

As a bonus, it automatically makes use of reusable_join so calling it multiple times with the same association has no ill effects.

Example using join_preload

-

join_preload is proload's sister macro with a slightly different syntax:

  join_preload(query, [:activity, :object])

and:

  Invoice
-  |> join_preload(:customer)
-  |> join_preload(:lines)

+

join_preload is proload's sister macro with a slightly different syntax:

  join_preload(query, [:activity, :object])

and:

  Invoice
+  |> join_preload(:customer)
+  |> join_preload(:lines)

@@ -190,8 +190,8 @@

Creating reusable joins

query
-|> reusable_join(:left, [t1], t2 in "other_table", on: t1.id == t2.id, as: :other_a)
-|> reusable_join(:left, [t1], t2 in "other_table", on: t1.id == t2.id, as: :other_b)

join_preload(query, associations)

import Ecto.Query
 Invoice
-|> join(:left, [i], assoc(i, :customer), as: :customer)
-|> join(:left, [i, c], assoc(c, :account), as: :account)
-|> join(:left, [i], assoc(i, :lines), as: :lines)
-|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]})
-|> Repo.all()

+|> join(:left, [i], assoc(i, :customer), as: :customer) +|> join(:left, [i, c], assoc(c, :account), as: :account) +|> join(:left, [i], assoc(i, :lines), as: :lines) +|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]}) +|> Repo.all()

@@ -299,9 +299,9 @@

join_preload(query, associations)

import EctoSparkles
 Invoice
-|> join_preload([:customer, :account])
-|> join_preload([:lines])
-|> Repo.all()
+
|> join_preload([:customer, :account]) +|> join_preload([:lines]) +|> Repo.all()
@@ -327,13 +327,13 @@

proload(query, qual \\ :left, associations)
-

AKA join_preload++. It's more powerful, but it does it with more (and different!) syntax.

e.g.

proload(query, activity: [
+

AKA join_preload++. It's more powerful, but it does it with more (and different!) syntax.

e.g.

proload(query, activity: [
   :verb, :boost_count, :like_count, :replied,
   # relations under object will have their aliases prefixed with object_, i.e.
   # :object_message, :object_post, :object_post_content
   # the original names will still be used for the associations.
-  object: {"object_", [:message, :post, :post_content]}
-])
+
object: {"object_", [:message, :post, :post_content]} +])

diff --git a/Entrepot.Ecto.Type.html b/Entrepot.Ecto.Type.html index d8539ae061..3947b10b45 100644 --- a/Entrepot.Ecto.Type.html +++ b/Entrepot.Ecto.Type.html @@ -5,16 +5,16 @@ - + - Entrepot.Ecto.Type — Bonfire v0.9.10-classic-beta.156 + Entrepot.Ecto.Type — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Ecto.Type - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -157,7 +157,7 @@

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -167,7 +167,7 @@

-

Callback implementation for Ecto.Type.dump/1.

+

Callback implementation for Ecto.Type.dump/1.

@@ -177,7 +177,7 @@

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -187,7 +187,7 @@

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -197,7 +197,7 @@

-

Callback implementation for Ecto.Type.load/1.

+

Callback implementation for Ecto.Type.load/1.

@@ -207,7 +207,7 @@

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

@@ -243,7 +243,7 @@

cast(value)

-

Callback implementation for Ecto.Type.cast/1.

+

Callback implementation for Ecto.Type.cast/1.

@@ -265,7 +265,7 @@

dump(locator)

-

Callback implementation for Ecto.Type.dump/1.

+

Callback implementation for Ecto.Type.dump/1.

@@ -287,7 +287,7 @@

embed_as(_)

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -309,7 +309,7 @@

equal?(term1, term2)

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -331,7 +331,7 @@

load(serialized_data)

-

Callback implementation for Ecto.Type.load/1.

+

Callback implementation for Ecto.Type.load/1.

@@ -353,7 +353,7 @@

type()

-

Callback implementation for Ecto.Type.type/0.

+

Callback implementation for Ecto.Type.type/0.

diff --git a/Entrepot.Ecto.html b/Entrepot.Ecto.html index 8f75def818..84bfa47844 100644 --- a/Entrepot.Ecto.html +++ b/Entrepot.Ecto.html @@ -5,16 +5,16 @@ - + - Entrepot.Ecto — Bonfire v0.9.10-classic-beta.156 + Entrepot.Ecto — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Ecto - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -148,88 +148,88 @@

In your Ecto schema specify your file field with the following type to get serialization of uploads (Entrepot.Locator) to maps:

defmodule Attachment
   use Ecto.Schema
 
-  schema "attachments" do
+  schema "attachments" do
     field :file_data, Entrepot.Ecto.Type
-  end
+  end
 end

Entrepot.Ecto.upload

-

Cast params to uploaded data with Entrepot.Ecto.upload. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.

It is expected to return either a success tuple with the Locator struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.

Even if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:

  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], fn {_field, upload}, changeset ->
-      case Entrepot.Storages.Disk.put(upload) do
-        {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)
-        error_tuple -> add_error(changeset, "upload just...failed")
-      end
-  end)
+

Cast params to uploaded data with Entrepot.Ecto.upload. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.

It is expected to return either a success tuple with the Locator struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.

Even if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:

  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], fn {_field, upload}, changeset ->
+      case Entrepot.Storages.Disk.put(upload) do
+        {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)
+        error_tuple -> add_error(changeset, "upload just...failed")
+      end
+  end)
   |> validate_attachment
-

However, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.

  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], MyApp.Attacher, :attach)

+

However, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.

  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], MyApp.Attacher, :attach)

Upload cleanup

-

Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).

One good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:

  def create_attachment(user, attrs) do
-  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)
-  |> Repo.insert()
-  |> case do
-    {:ok, attachment} = success_tuple ->
-      Task.Supervisor.start_child(
+

Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).

One good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:

  def create_attachment(user, attrs) do
+  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)
+  |> Repo.insert()
+  |> case do
+    {:ok, attachment} = success_tuple ->
+      Task.Supervisor.start_child(
         YourApp.Supervisor,
-        fn -> Attachment.promote_upload(attachment) end
-      )
+        fn -> Attachment.promote_upload(attachment) end
+      )
 
       success_tuple
 
-    {:error, %{changes: %{file_data: file_data}}} = error_tuple ->
-      Task.Supervisor.start_child(
+    {:error, %{changes: %{file_data: file_data}}} = error_tuple ->
+      Task.Supervisor.start_child(
         YourApp.Supervisor,
-        fn -> Disk.delete(file_data.id) end
-      )
+        fn -> Disk.delete(file_data.id) end
+      )
 
       error_tuple
-  end

In this example, Attachment.promote_upload(attachment) would handle moving the file and updating the file data in the db. It uses Multi to ensure all operations succeed or fail together:

  def promote_upload(attachment) do
-    Multi.new()
-    |> Multi.run(:copy_file, fn _, _ ->
-      NetworkStorage.put(attachment.file_data.id)
-    end)
-    |> Multi.update(:updated_schema, fn %{move_file: new_data} ->
-      Attachment.changeset(attachment, %{file_data: new_data })
-    end)
-    |> Multi.run(:delete_old_file, fn _, _ ->
-      Disk.delete(attachment.file_data.id)
-    end)
-    |> Repo.transaction()
-  end

+ end

In this example, Attachment.promote_upload(attachment) would handle moving the file and updating the file data in the db. It uses Multi to ensure all operations succeed or fail together:

  def promote_upload(attachment) do
+    Multi.new()
+    |> Multi.run(:copy_file, fn _, _ ->
+      NetworkStorage.put(attachment.file_data.id)
+    end)
+    |> Multi.update(:updated_schema, fn %{move_file: new_data} ->
+      Attachment.changeset(attachment, %{file_data: new_data })
+    end)
+    |> Multi.run(:delete_old_file, fn _, _ ->
+      Disk.delete(attachment.file_data.id)
+    end)
+    |> Repo.transaction()
+  end

Testing

-

Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:

  %Attachment{
-    file_data: %{
+

Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:

  %Attachment{
+    file_data: %{
       id: "fake.jpg",
-      metadata: %{name: "fake"}, size: 100
-    }
-  }
-  |> Repo.insert!()

If you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.

You can configure your test environment to use the RAM storage:

  {:ok, id} = Entrepot.Storages.RAM.put(some_upload)
+      metadata: %{name: "fake"}, size: 100
+    }
+  }
+  |> Repo.insert!()

If you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.

You can configure your test environment to use the RAM storage:

  {:ok, id} = Entrepot.Storages.RAM.put(some_upload)
 
-  Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})

Or, for maximum performance, you can a simple struct that implements the Upload protocol:

  defmodule Entrepot.MockUpload do
+  Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})

Or, for maximum performance, you can a simple struct that implements the Upload protocol:

  defmodule Entrepot.MockUpload do
     defstruct content: "Hi, I'm a file", name: "hi"
 
-    defimpl Entrepot.Upload do
-      def contents(mock), do: {:ok, mock.content}
+    defimpl Entrepot.Upload do
+      def contents(mock), do: {:ok, mock.content}
 
-      def name(mock), do: mock.name
-    end
-  end
+
def name(mock), do: mock.name + end + end

Note: Entrepôt was originally forked from Capsule

@@ -310,10 +310,10 @@

upload(changeset, params, permitted, fun) Examples

-
iex> changeset = %Ecto.Changeset{}
-iex> fun = fn (_params, _changeset) -> %Entrepot.Locator{} end
-iex> Entrepot.Ecto.upload(changeset, %{"field" => "value"}, ["field"], fun)
-%Ecto.Changeset{}
+
iex> changeset = %Ecto.Changeset{}
+iex> fun = fn (_params, _changeset) -> %Entrepot.Locator{} end
+iex> Entrepot.Ecto.upload(changeset, %{"field" => "value"}, ["field"], fun)
+%Ecto.Changeset{}
@@ -347,9 +347,9 @@

upload(changeset, params, permitted, module Examples

-
iex> changeset = %Ecto.Changeset{}
-iex> Entrepot.Ecto.upload(changeset, %{"field" => "value"}, ["field"], SomeModule, :some_function)
-%Ecto.Changeset{}
+
iex> changeset = %Ecto.Changeset{}
+iex> Entrepot.Ecto.upload(changeset, %{"field" => "value"}, ["field"], SomeModule, :some_function)
+%Ecto.Changeset{}
diff --git a/Entrepot.Errors.InvalidLocator.html b/Entrepot.Errors.InvalidLocator.html index bf0df118f6..c78b1055bf 100644 --- a/Entrepot.Errors.InvalidLocator.html +++ b/Entrepot.Errors.InvalidLocator.html @@ -5,16 +5,16 @@ - + - Entrepot.Errors.InvalidLocator — Bonfire v0.9.10-classic-beta.156 + Entrepot.Errors.InvalidLocator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Errors.InvalidLocator exception - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Errors.InvalidStorage.html b/Entrepot.Errors.InvalidStorage.html index 993da16f09..78719b5fa3 100644 --- a/Entrepot.Errors.InvalidStorage.html +++ b/Entrepot.Errors.InvalidStorage.html @@ -5,16 +5,16 @@ - + - Entrepot.Errors.InvalidStorage — Bonfire v0.9.10-classic-beta.156 + Entrepot.Errors.InvalidStorage — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Errors.InvalidStorage exception - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Locator.html b/Entrepot.Locator.html index 3749321c29..f2e7878c44 100644 --- a/Entrepot.Locator.html +++ b/Entrepot.Locator.html @@ -5,16 +5,16 @@ - + - Entrepot.Locator — Bonfire v0.9.10-classic-beta.156 + Entrepot.Locator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Locator - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -281,11 +281,11 @@

new(attrs)

Examples -
iex> Entrepot.Locator.new(id: "file.txt", storage: Disk)
-{:ok, %Entrepot.Locator{id: "file.txt", storage: Disk, metadata: %{}}}
+
iex> Entrepot.Locator.new(id: "file.txt", storage: Disk)
+{:ok, %Entrepot.Locator{id: "file.txt", storage: Disk, metadata: %{}}}
 
-iex> Entrepot.Locator.new(id: 123, storage: Disk)
-{:error, "id must be binary"}
+
iex> Entrepot.Locator.new(id: 123, storage: Disk) +{:error, "id must be binary"}
@@ -331,10 +331,10 @@

new!(attrs)

Examples -
iex> Entrepot.Locator.new!(id: "file.txt", storage: Disk)
-%Entrepot.Locator{id: "file.txt", storage: Disk, metadata: %{}}
+
iex> Entrepot.Locator.new!(id: "file.txt", storage: Disk)
+%Entrepot.Locator{id: "file.txt", storage: Disk, metadata: %{}}
 
-iex> Entrepot.Locator.new!(id: 123, storage: Disk)
+iex> Entrepot.Locator.new!(id: 123, storage: Disk)
 ** (Entrepot.Errors.InvalidLocator) id must be binary
diff --git a/Entrepot.Storage.html b/Entrepot.Storage.html index c1a00db6e8..7027d6c90e 100644 --- a/Entrepot.Storage.html +++ b/Entrepot.Storage.html @@ -5,16 +5,16 @@ - + - Entrepot.Storage — Bonfire v0.9.10-classic-beta.156 + Entrepot.Storage — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Storage behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Storages.Disk.html b/Entrepot.Storages.Disk.html index 1f741535fa..35c1ca8e61 100644 --- a/Entrepot.Storages.Disk.html +++ b/Entrepot.Storages.Disk.html @@ -5,16 +5,16 @@ - + - Entrepot.Storages.Disk — Bonfire v0.9.10-classic-beta.156 + Entrepot.Storages.Disk — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Storages.Disk - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Storages.RAM.html b/Entrepot.Storages.RAM.html index 865bb9d674..32208b3a86 100644 --- a/Entrepot.Storages.RAM.html +++ b/Entrepot.Storages.RAM.html @@ -5,16 +5,16 @@ - + - Entrepot.Storages.RAM — Bonfire v0.9.10-classic-beta.156 + Entrepot.Storages.RAM — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Storages.RAM - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Storages.S3.html b/Entrepot.Storages.S3.html index 92fc57bf2e..23ffeb1d17 100644 --- a/Entrepot.Storages.S3.html +++ b/Entrepot.Storages.S3.html @@ -5,16 +5,16 @@ - + - Entrepot.Storages.S3 — Bonfire v0.9.10-classic-beta.156 + Entrepot.Storages.S3 — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Storages.S3 - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Upload.html b/Entrepot.Upload.html index 38c2a5298d..0fca903403 100644 --- a/Entrepot.Upload.html +++ b/Entrepot.Upload.html @@ -5,16 +5,16 @@ - + - Entrepot.Upload — Bonfire v0.9.10-classic-beta.156 + Entrepot.Upload — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Upload protocol - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.Uploader.html b/Entrepot.Uploader.html index 1f42c4f37d..1479e1510d 100644 --- a/Entrepot.Uploader.html +++ b/Entrepot.Uploader.html @@ -5,16 +5,16 @@ - + - Entrepot.Uploader — Bonfire v0.9.10-classic-beta.156 + Entrepot.Uploader — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot.Uploader behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Entrepot.html b/Entrepot.html index 267d59d4cb..e320c0a9bf 100644 --- a/Entrepot.html +++ b/Entrepot.html @@ -5,16 +5,16 @@ - + - Entrepot — Bonfire v0.9.10-classic-beta.156 + Entrepot — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Entrepot - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -145,18 +145,18 @@

Concepts

-

Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: storage, upload, locator, and optionally, uploader, which provides a more ergonomic API for the other 3.

It is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.

So what does it do? Here's a theoretical example of a use case with an Ecto<sup>1</sup> schema, which stores the file retrieved from a URL, along with some additional metadata:

  def create_attachment(upload, user) do
-    Multi.new()
-    |> Multi.run(:upload, fn _, _ ->
-      YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())
-    end)
-    |> Multi.insert(:attachment, fn %{upload: file_id} ->
-      %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: "document"})
+

Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: storage, upload, locator, and optionally, uploader, which provides a more ergonomic API for the other 3.

It is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.

So what does it do? Here's a theoretical example of a use case with an Ecto<sup>1</sup> schema, which stores the file retrieved from a URL, along with some additional metadata:

  def create_attachment(upload, user) do
+    Multi.new()
+    |> Multi.run(:upload, fn _, _ ->
+      YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())
+    end)
+    |> Multi.insert(:attachment, fn %{upload: file_id} ->
+      %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: "document"})
     end)
-    |> Repo.transaction()
-  end

Then to access the file:

%Attachment{file_data: file} = attachment
+    |> Repo.transaction()
+  end

Then to access the file:

%Attachment{file_data: file} = attachment
 
-{:ok, contents} = Disk.read(file.id)
1

+{:ok, contents} = Disk.read(file.id)

1

@@ -174,28 +174,28 @@

Locator

-

Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.

Locator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for "promoting" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage<sup>2</sup>:

old_file_data = %Locator{id: "/path/to/file.jpg", storage: Disk, metadata: %{}}
-{:ok, new_id} = S3.put(old_file_data)`

Note: always remember to take care of cleaning up the old file as Entrepot never automatically removes files:

Disk.delete(old_file_data.id)

+

Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.

Locator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for "promoting" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage<sup>2</sup>:

old_file_data = %Locator{id: "/path/to/file.jpg", storage: Disk, metadata: %{}}
+{:ok, new_id} = S3.put(old_file_data)`

Note: always remember to take care of cleaning up the old file as Entrepot never automatically removes files:

Disk.delete(old_file_data.id)

Uploader

-

This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can use the uploader to codify the handling for specific types of assets.

defmodule AvatarUploader do
-  use Entrepot.Uploader, storages: [cache: Disk, store: S3]
+

This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can use the uploader to codify the handling for specific types of assets.

defmodule AvatarUploader do
+  use Entrepot.Uploader, storages: [cache: Disk, store: S3]
 
-  def build_options(upload, :cache, opts) do
-    Keyword.put(opts, :prefix, "cache/#{Date.utc_today()}")
-  end
+  def build_options(upload, :cache, opts) do
+    Keyword.put(opts, :prefix, "cache/#{Date.utc_today()}")
+  end
 
-  def build_options(upload, :store, opts) do
+  def build_options(upload, :store, opts) do
     opts
-    |> Keyword.put(:prefix, "users/#{opts[:user_id]}/avatar")
-    |> Keyword.drop([:user_id])
-  end
+    |> Keyword.put(:prefix, "users/#{opts[:user_id]}/avatar")
+    |> Keyword.drop([:user_id])
+  end
 
-  def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()]
-end

Then you can get the files where they need to be without constructing all the options everywhere they might be uploaded: AvatarUploader.store(upload, :store, user_id: 1)

Note: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.

+ def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()] +end

Then you can get the files where they need to be without constructing all the options everywhere they might be uploaded: AvatarUploader.store(upload, :store, user_id: 1)

Note: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.

@@ -219,8 +219,8 @@

S3

-

This storage uploads files to AWS's S3 service. It also works with Digital Ocean Spaces.

configuration

  • To set the bucket where files will be stored: Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: "whatever")

options

  • prefix: A string to prepend to the upload's key
  • s3_options: Keyword list of option that will passed directly to ex_aws_s3

dependencies

Some of the implementations might require further dependencies (currently only S3-compatible storage) that you will also need to add to your project's deps

{:ex_aws, "~> 2.0"}
-{:ex_aws_s3, "~> 2.0"}

+

This storage uploads files to AWS's S3 service. It also works with Digital Ocean Spaces.

configuration

  • To set the bucket where files will be stored: Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: "whatever")

options

  • prefix: A string to prepend to the upload's key
  • s3_options: Keyword list of option that will passed directly to ex_aws_s3

dependencies

Some of the implementations might require further dependencies (currently only S3-compatible storage) that you will also need to add to your project's deps

{:ex_aws, "~> 2.0"}
+{:ex_aws_s3, "~> 2.0"}

@@ -238,12 +238,12 @@

URI

-

This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a TUS server.

You can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:

def attach(conn, %{"attachment" => %{"url" => url}}) when url != "" do
-  URI.parse(url)
-  |> Disk.put(upload)
+

This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a TUS server.

You can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:

def attach(conn, %{"attachment" => %{"url" => url}}) when url != "" do
+  URI.parse(url)
+  |> Disk.put(upload)
 
   # ...redirect, etc
-end

notes

This implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.

+end

notes

This implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.

@@ -255,7 +255,7 @@

EntrepôtEcto

-

There is an external library (because it needs Ecto as a dependency) which provides Entrepot.Ecto.Type for Ecto schema fields to easily handle persisting Locator data in your repository.


That's it! Happy uploading.

+

There is an external library (because it needs Ecto as a dependency) which provides Entrepot.Ecto.Type for Ecto schema fields to easily handle persisting Locator data in your repository.


Note: Entrepôt was originally forked from Capsule

@@ -382,11 +382,11 @@

add_metadata(locator, key, val)

Examples -
iex> Entrepot.add_metadata(%Locator{}, :key, "value")
-{:ok, %Locator{metadata: %{key: "value"}}}
+
iex> Entrepot.add_metadata(%Locator{}, :key, "value")
+{:ok, %Locator{metadata: %{key: "value"}}}
 
-iex> Entrepot.add_metadata(%Locator{key: "value"}, %{key2: "value2"})
-{:ok, %Locator{metadata: %{key: "value1", key2: "value2"}}}
+
iex> Entrepot.add_metadata(%Locator{key: "value"}, %{key2: "value2"}) +{:ok, %Locator{metadata: %{key: "value1", key2: "value2"}}}
@@ -434,8 +434,8 @@

copy(locator, dest_storage, opts \\ [])

Examples -
iex> Entrepot.copy(%Locator{id: "file.txt", storage: Disk}, S3)
-{:ok, %Locator{id: "new_id", storage: S3, metadata: %{copied_from: Disk}}}
+
iex> Entrepot.copy(%Locator{id: "file.txt", storage: Disk}, S3)
+{:ok, %Locator{id: "new_id", storage: S3, metadata: %{copied_from: Disk}}}
@@ -481,10 +481,10 @@

storage!(locator)

Examples -
iex> Entrepot.storage!(%Locator{storage: Disk})
+
iex> Entrepot.storage!(%Locator{storage: Disk})
 Disk
 
-iex> Entrepot.storage!(%Locator{storage: "Elixir.Disk"})
+iex> Entrepot.storage!(%Locator{storage: "Elixir.Disk"})
 Disk
diff --git a/EntrepotEcto.html b/EntrepotEcto.html index a03d6c3d5b..f1a033a983 100644 --- a/EntrepotEcto.html +++ b/EntrepotEcto.html @@ -5,16 +5,16 @@ - + - EntrepôtEcto — Bonfire v0.9.10-classic-beta.156 + EntrepôtEcto — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -145,88 +145,88 @@

In your Ecto schema specify your file field with the following type to get serialization of uploads (Entrepot.Locator) to maps:

defmodule Attachment
   use Ecto.Schema
 
-  schema "attachments" do
+  schema "attachments" do
     field :file_data, Entrepot.Ecto.Type
-  end
+  end
 end

Entrepot.Ecto.upload

-

Cast params to uploaded data with Entrepot.Ecto.upload. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.

It is expected to return either a success tuple with the Locator struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.

Even if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:

  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], fn {_field, upload}, changeset ->
-      case Entrepot.Storages.Disk.put(upload) do
-        {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)
-        error_tuple -> add_error(changeset, "upload just...failed")
-      end
-  end)
+

Cast params to uploaded data with Entrepot.Ecto.upload. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.

It is expected to return either a success tuple with the Locator struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.

Even if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:

  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], fn {_field, upload}, changeset ->
+      case Entrepot.Storages.Disk.put(upload) do
+        {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)
+        error_tuple -> add_error(changeset, "upload just...failed")
+      end
+  end)
   |> validate_attachment
-

However, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.

  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], MyApp.Attacher, :attach)

+

However, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.

  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(%{"file_data" => some_upload}, [:file_data], MyApp.Attacher, :attach)

Upload cleanup

-

Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).

One good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:

  def create_attachment(user, attrs) do
-  %Attachment{}
-  |> Ecto.Changeset.change()
-  |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)
-  |> Repo.insert()
-  |> case do
-    {:ok, attachment} = success_tuple ->
-      Task.Supervisor.start_child(
+

Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).

One good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:

  def create_attachment(user, attrs) do
+  %Attachment{}
+  |> Ecto.Changeset.change()
+  |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)
+  |> Repo.insert()
+  |> case do
+    {:ok, attachment} = success_tuple ->
+      Task.Supervisor.start_child(
         YourApp.Supervisor,
-        fn -> Attachment.promote_upload(attachment) end
-      )
+        fn -> Attachment.promote_upload(attachment) end
+      )
 
       success_tuple
 
-    {:error, %{changes: %{file_data: file_data}}} = error_tuple ->
-      Task.Supervisor.start_child(
+    {:error, %{changes: %{file_data: file_data}}} = error_tuple ->
+      Task.Supervisor.start_child(
         YourApp.Supervisor,
-        fn -> Disk.delete(file_data.id) end
-      )
+        fn -> Disk.delete(file_data.id) end
+      )
 
       error_tuple
-  end

In this example, Attachment.promote_upload(attachment) would handle moving the file and updating the file data in the db. It uses Multi to ensure all operations succeed or fail together:

  def promote_upload(attachment) do
-    Multi.new()
-    |> Multi.run(:copy_file, fn _, _ ->
-      NetworkStorage.put(attachment.file_data.id)
-    end)
-    |> Multi.update(:updated_schema, fn %{move_file: new_data} ->
-      Attachment.changeset(attachment, %{file_data: new_data })
-    end)
-    |> Multi.run(:delete_old_file, fn _, _ ->
-      Disk.delete(attachment.file_data.id)
-    end)
-    |> Repo.transaction()
-  end

+ end

In this example, Attachment.promote_upload(attachment) would handle moving the file and updating the file data in the db. It uses Multi to ensure all operations succeed or fail together:

  def promote_upload(attachment) do
+    Multi.new()
+    |> Multi.run(:copy_file, fn _, _ ->
+      NetworkStorage.put(attachment.file_data.id)
+    end)
+    |> Multi.update(:updated_schema, fn %{move_file: new_data} ->
+      Attachment.changeset(attachment, %{file_data: new_data })
+    end)
+    |> Multi.run(:delete_old_file, fn _, _ ->
+      Disk.delete(attachment.file_data.id)
+    end)
+    |> Repo.transaction()
+  end

Testing

-

Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:

  %Attachment{
-    file_data: %{
+

Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:

  %Attachment{
+    file_data: %{
       id: "fake.jpg",
-      metadata: %{name: "fake"}, size: 100
-    }
-  }
-  |> Repo.insert!()

If you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.

You can configure your test environment to use the RAM storage:

  {:ok, id} = Entrepot.Storages.RAM.put(some_upload)
+      metadata: %{name: "fake"}, size: 100
+    }
+  }
+  |> Repo.insert!()

If you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.

You can configure your test environment to use the RAM storage:

  {:ok, id} = Entrepot.Storages.RAM.put(some_upload)
 
-  Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})

Or, for maximum performance, you can a simple struct that implements the Upload protocol:

  defmodule Entrepot.MockUpload do
+  Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})

Or, for maximum performance, you can a simple struct that implements the Upload protocol:

  defmodule Entrepot.MockUpload do
     defstruct content: "Hi, I'm a file", name: "hi"
 
-    defimpl Entrepot.Upload do
-      def contents(mock), do: {:ok, mock.content}
+    defimpl Entrepot.Upload do
+      def contents(mock), do: {:ok, mock.content}
 
-      def name(mock), do: mock.name
-    end
-  end
+
def name(mock), do: mock.name + end + end

Note: Entrepôt was originally forked from Capsule

diff --git a/Exto.html b/Exto.html index 79bae8aa86..e17123a73e 100644 --- a/Exto.html +++ b/Exto.html @@ -5,16 +5,16 @@ - + - Exto — Bonfire v0.9.10-classic-beta.156 + Exto — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Exto - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -151,41 +151,41 @@

Example Schema

-
defmodule My.Schema do
+
defmodule My.Schema do
   use Ecto.Schema
-  import Exto, only: [flex_schema: 1]
+  import Exto, only: [flex_schema: 1]
 
-  schema "my_table" do
+  schema "my_table" do
     field :name, :string # just normal schema things
-    flex_schema(:my_app) # boom! give me the stuff
-  end
-end

Or if you want the Access protocol to be auto-implemented on the struct (because the reasoning for not having it on structs doesn't apply as much when using Exto), you can pull in the Accessible library by simply using use Exto instead of import Exto.

+ flex_schema(:my_app) # boom! give me the stuff + end +end

Or if you want the Access protocol to be auto-implemented on the struct (because the reasoning for not having it on structs doesn't apply as much when using Exto), you can pull in the Accessible library by simply using use Exto instead of import Exto.

Example configuration

config :my_app, My.Schema,
-  belongs_to: [
+  belongs_to: [
     foo: Foo,                   # belongs_to :foo, Foo
-    bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer
-  ],
-  field: [
+    bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer
+  ],
+  field: [
     foo: :string,                # field :foo, :string
-    bar: {:integer, default: 4}, # field :foo, :integer, default: 4
-  ],
-  has_one: [
+    bar: {:integer, default: 4}, # field :foo, :integer, default: 4
+  ],
+  has_one: [
     foo: Foo,                             # has_one :foo, Foo
-    bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id
-  ]
-  has_many: [
+    bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id
+  ]
+  has_many: [
     foo: Foo,                             # has_many :foo, Foo
-    bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id
-  ]
-  many_to_many: [
+    bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id
+  ]
+  many_to_many: [
     foo: Foo,                         # many_to_many :foo, Foo
-    bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar
-  ]

This example won't work very well because it is redefining foo and bar 5 times, but you get the point.

Reading of configuration is done during compile time. The relations will be baked in during compilation, thus:

  • Do not expect this to work in runtime config.
  • You will need to rebuild all dependencies which use this macro when you change their configuration.

This example won't work very well because it is redefining foo and bar 5 times, but you get the point.

Reading of configuration is done during compile time. The relations will be baked in during compilation, thus:

  • Do not expect this to work in runtime config.
  • You will need to rebuild all dependencies which use this macro when you change their configuration.

Iconify.Icon - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

-

A Surface component for rendering icons using various methods.

+

A Surface component for rendering icons using various methods.

diff --git a/Iconify.MaterialSymbols.CalendarMonth.html b/Iconify.MaterialSymbols.CalendarMonth.html index 2754c2335d..64aa0598b1 100644 --- a/Iconify.MaterialSymbols.CalendarMonth.html +++ b/Iconify.MaterialSymbols.CalendarMonth.html @@ -5,16 +5,16 @@ - + - Iconify.MaterialSymbols.CalendarMonth — Bonfire v0.9.10-classic-beta.156 + Iconify.MaterialSymbols.CalendarMonth — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Iconify.MaterialSymbols.CalendarMonth - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Iconify.html b/Iconify.html index bddb771574..aaff67a282 100644 --- a/Iconify.html +++ b/Iconify.html @@ -5,16 +5,16 @@ - + - Iconify — Bonfire v0.9.10-classic-beta.156 + Iconify — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Iconify - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -144,11 +144,11 @@

Installation

-
def deps do
-  [
-    {:iconify_ex, "~> 0.1.0"}
-  ]
-end

After running mix deps.get you need to fetch the latest iconify icon sets by running something like:

cd deps/iconify_ex/assets && yarn && cd -
+
def deps do
+  [
+    {:iconify_ex, "~> 0.1.0"}
+  ]
+end

After running mix deps.get you need to fetch the latest iconify icon sets by running something like:

cd deps/iconify_ex/assets && yarn && cd -
 

@@ -164,7 +164,7 @@

}

Other configurations include:

config :iconify_ex, :fallback_icon, "heroicons-solid:question-mark-circle" # when an icon is not found
 config :iconify_ex, :generated_icon_modules_path, "./lib/web/icons" # for :inline mode
 config :iconify_ex, :generated_icon_static_path, "./priv/static/images/icons" # where CSS and images are stored
-config :iconify_ex, :generated_icon_static_url, "/images/icons/" # where CSS and images are served from
  1. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:

Embed an icon using default classes (copy the icon name from the iconify website):

<.iconify icon="heroicons-solid:collection" />

Specify custom classes:

<.iconify icon="heroicons-solid:collection" class="w-8 h-8 text-base-content" /> 

Or if you use Surface, it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:

Add alias Iconify.Icon to your Web module, and then:

<#Icon iconify="heroicons-solid:collection" />

If your icon is dynamic, you'll still want to use the first form:

<.iconify icon={@my_icon} />

Note: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like sort -u -o icons_dir/icons.css icons_dir/icons.css to clean up the CSS file.

+config :iconify_ex, :generated_icon_static_url, "/images/icons/" # where CSS and images are served from
  1. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:

Embed an icon using default classes (copy the icon name from the iconify website):

<.iconify icon="heroicons-solid:collection" />

Specify custom classes:

<.iconify icon="heroicons-solid:collection" class="w-8 h-8 text-base-content" /> 

Or if you use Surface, it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:

Add alias Iconify.Icon to your Web module, and then:

<#Icon iconify="heroicons-solid:collection" />

If your icon is dynamic, you'll still want to use the first form:

<.iconify icon={@my_icon} />

Note: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like sort -u -o icons_dir/icons.css icons_dir/icons.css to clean up the CSS file.

@@ -189,6 +189,16 @@

+
+ + +

Checks if the icon is part of a known emoji set or any set shouldn't use CSS mode (eg. includes color or animation).

+ +
+
dev_env?() @@ -203,7 +213,7 @@

-

Checks if the icon is part of a known emoji set or any set that doesn't support CSS mode.

+

Checks if the icon is part of a known emoji set

@@ -287,6 +297,14 @@

+ +
manual(icon, opts \\ nil) @@ -397,7 +415,7 @@

add_icon_to_css(icon_css_name, svg_code)

- + View Source @@ -408,6 +426,37 @@

add_icon_to_css(icon_css_name, svg_code) + + +
+ + + +
+ +

Checks if the icon is part of a known emoji set or any set shouldn't use CSS mode (eg. includes color or animation).

+ + + + Examples +

+
iex> Iconify.complex?("twemoji:smile")
+true
+iex> Iconify.complex?("heroicons-solid:user")
+false
@@ -441,7 +490,7 @@

dev_env?()

emoji?(icon)

- + View Source @@ -451,15 +500,15 @@

emoji?(icon)

-

Checks if the icon is part of a known emoji set or any set that doesn't support CSS mode.

+

Checks if the icon is part of a known emoji set

Examples

-
iex> Iconify.emoji?("twemoji:smile")
+
iex> Iconify.emoji?("twemoji:smile")
 true
-iex> Iconify.emoji?("heroicons-solid:user")
+iex> Iconify.emoji?("heroicons-solid:user")
 false
@@ -488,7 +537,7 @@

fallback_icon()

Examples

-
iex> Iconify.fallback_icon()
+
iex> Iconify.fallback_icon()
 "heroicons-solid:question-mark-circle"
@@ -501,7 +550,7 @@

fallback_icon()

generate_css_from_components()

- + View Source @@ -517,7 +566,7 @@

generate_css_from_components()

Examples

-
iex> Iconify.generate_css_from_components()
+
iex> Iconify.generate_css_from_components()
 :ok
@@ -530,7 +579,7 @@

generate_css_from_components()

generate_css_from_static_files()

- + View Source @@ -546,7 +595,7 @@

generate_css_from_static_files()

Examples -
iex> Iconify.generate_css_from_static_files()
+
iex> Iconify.generate_css_from_static_files()
 :ok
@@ -559,7 +608,7 @@

generate_css_from_static_files()

generate_sets_from_components()

- + View Source @@ -575,8 +624,8 @@

generate_sets_from_components()

Examples -
iex> Iconify.generate_sets_from_components()
-[:ok, :ok, ...]
+
iex> Iconify.generate_sets_from_components()
+[:ok, :ok, ...]
@@ -604,8 +653,8 @@

iconify(assigns)

Examples -
iex> assigns = %{icon: "heroicons-solid:user", class: "w-6 h-6"}
-iex> Iconify.iconify(assigns)
+
iex> assigns = %{icon: "heroicons-solid:user", class: "w-6 h-6"}
+iex> Iconify.iconify(assigns)
 # Returns rendered icon HTML
@@ -618,7 +667,7 @@

iconify(assigns)

list_all_existing()

- + View Source @@ -634,11 +683,11 @@

list_all_existing()

Examples -
iex> Iconify.list_all_existing()
-%{
-  "HeroiconsSolid" => [Iconify.HeroiconsSolid.User, "user", ...],
-  "HeroiconsOutline" => [Iconify.HeroiconsOutline.User, "user", ...]
-}
+
iex> Iconify.list_all_existing()
+%{
+  "HeroiconsSolid" => [Iconify.HeroiconsSolid.User, "user", ...],
+  "HeroiconsOutline" => [Iconify.HeroiconsOutline.User, "user", ...]
+}
@@ -650,7 +699,7 @@

list_all_existing()

list_components()

- + View Source @@ -666,11 +715,11 @@

list_components()

Examples -
iex> Iconify.list_components()
-%{
-  "HeroiconsSolid" => [Iconify.HeroiconsSolid.User, Iconify.HeroiconsSolid.Star, ...],
-  "HeroiconsOutline" => [Iconify.HeroiconsOutline.User, Iconify.HeroiconsOutline.Star, ...]
-}
+
iex> Iconify.list_components()
+%{
+  "HeroiconsSolid" => [Iconify.HeroiconsSolid.User, Iconify.HeroiconsSolid.Star, ...],
+  "HeroiconsOutline" => [Iconify.HeroiconsOutline.User, Iconify.HeroiconsOutline.Star, ...]
+}
@@ -682,7 +731,7 @@

list_components()

list_icons_in_css()

- + View Source @@ -698,11 +747,33 @@

list_icons_in_css()

Examples -
iex> Iconify.list_icons_in_css()
-%{
-  "HeroiconsSolid" => ["user", "star", ...],
-  "HeroiconsOutline" => ["user", "star", ...]
-}
+
iex> Iconify.list_icons_in_css()
+%{
+  "HeroiconsSolid" => ["user", "star", ...],
+  "HeroiconsOutline" => ["user", "star", ...]
+}
+
+ +
+ +
+ + + Link to this function + +

list_icons_in_images()

+ + + + View Source + + + +
+ +
+ +
@@ -732,7 +803,7 @@

manual(icon, opts \\ nil)

Examples -
iex> Iconify.manual("heroicons-solid:user", mode: :css)
+
iex> Iconify.manual("heroicons-solid:user", mode: :css)
 # Returns rendered icon HTML or data
@@ -747,7 +818,7 @@

manual(icon, opts \\ nil)

maybe_phx_live_set_dynamic(socket, icon, type \\ "svg")

- + View Source @@ -769,7 +840,7 @@

maybe_phx_live_set_dynamic(socket, icon, ty

maybe_set_favicon(socket, icon)

- + View Source @@ -785,9 +856,9 @@

maybe_set_favicon(socket, icon)

Examples -
iex> socket = %Phoenix.LiveView.Socket{}
-iex> Iconify.maybe_set_favicon(socket, "heroicons-solid:star")
-%Phoenix.LiveView.Socket{}
+
iex> socket = %Phoenix.LiveView.Socket{}
+iex> Iconify.maybe_set_favicon(socket, "heroicons-solid:star")
+%Phoenix.LiveView.Socket{}
@@ -815,7 +886,7 @@

path()

Examples -
iex> Iconify.path()
+
iex> Iconify.path()
 "./lib/web/icons"
@@ -846,29 +917,29 @@

prepare(assigns, opts \\ [])

Examples -
iex> {:css, _function, %{
+
iex> {:css, _function, %{
   icon: "heroicons-solid:user",
   class: "w-4 h-4",
   icon_name: "heroicons-solid:user"
-}} = Iconify.prepare(%{icon: "heroicons-solid:user"}, :css)
+}} = Iconify.prepare(%{icon: "heroicons-solid:user"}, :css)
 
-iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :inline)
-{:inline, _fun, %{icon: "heroicons-solid:user"}}
+iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :inline)
+{:inline, _fun, %{icon: "heroicons-solid:user"}}
 
-iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :img)
-{:img, _fun, %{src: "/images/icons/heroicons-solid/user.svg"}}
+iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :img)
+{:img, _fun, %{src: "/images/icons/heroicons-solid/user.svg"}}
 
-iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :set)
-{:set, _fun, %{href: "/images/icons/heroicons-solid.svg#user"}}
+iex> Iconify.prepare(%{icon: "heroicons-solid:user"}, :set)
+{:set, _fun, %{href: "/images/icons/heroicons-solid.svg#user"}}
 
-iex> Iconify.prepare(%{icon: "twemoji:rabbit"})
-{:img, _fun, %{src: "/images/icons/twemoji/rabbit.svg"}}
+iex> Iconify.prepare(%{icon: "twemoji:rabbit"})
+{:img, _fun, %{src: "/images/icons/twemoji/rabbit.svg"}}
 
-iex> Iconify.prepare(%{icon: "non-existent-icon"})
-{:css, _fun, %{icon_name: "heroicons-solid:question-mark-circle"}}
+iex> Iconify.prepare(%{icon: "non-existent-icon"})
+{:css, _fun, %{icon_name: "heroicons-solid:question-mark-circle"}}
 
- > Iconify.prepare(%{icon: "<svg>...</svg>"})
-{:inline, _fun, %{icon: "<svg>...</svg>"}}
+
> Iconify.prepare(%{icon: "<svg>...</svg>"}) +{:inline, _fun, %{icon: "<svg>...</svg>"}}
@@ -882,7 +953,7 @@

prepare(assigns, opts \\ [])

prepare_entire_icon_family(family_name, mode \\ nil)

- + View Source @@ -898,7 +969,7 @@

prepare_entire_icon_family(family_name, mod Examples

-
iex> Iconify.prepare_entire_icon_family("heroicons-solid", :inline)
+
iex> Iconify.prepare_entire_icon_family("heroicons-solid", :inline)
 # creates a Phoenix.Component module file for each icon in the set
@@ -927,7 +998,7 @@

static_path()

Examples -
iex> Iconify.static_path()
+
iex> Iconify.static_path()
 "./assets/static/images/icons"
@@ -956,7 +1027,7 @@

static_url()

Examples -
iex> Iconify.static_url()
+
iex> Iconify.static_url()
 "/images/icons"
@@ -985,7 +1056,7 @@

using_svg_inject?()

Examples -
iex> Iconify.using_svg_inject?()
+
iex> Iconify.using_svg_inject?()
 false
diff --git a/IconifyEx.html b/IconifyEx.html index 842cfa4449..3d880f66e2 100644 --- a/IconifyEx.html +++ b/IconifyEx.html @@ -5,16 +5,16 @@ - + - Iconify for Phoenix — Bonfire v0.9.10-classic-beta.156 + Iconify for Phoenix — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,11 +141,11 @@

Installation

-
def deps do
-  [
-    {:iconify_ex, "~> 0.1.0"}
-  ]
-end

After running mix deps.get you need to fetch the latest iconify icon sets by running something like:

cd deps/iconify_ex/assets && yarn && cd -
+
def deps do
+  [
+    {:iconify_ex, "~> 0.1.0"}
+  ]
+end

After running mix deps.get you need to fetch the latest iconify icon sets by running something like:

cd deps/iconify_ex/assets && yarn && cd -
 

@@ -161,30 +161,30 @@

}

Other configurations include:

config :iconify_ex, :fallback_icon, "heroicons-solid:question-mark-circle" # when an icon is not found
 config :iconify_ex, :generated_icon_modules_path, "./lib/web/icons" # for :inline mode
 config :iconify_ex, :generated_icon_static_path, "./priv/static/images/icons" # where CSS and images are stored
-config :iconify_ex, :generated_icon_static_url, "/images/icons/" # where CSS and images are served from
  1. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:

Embed an icon using default classes (copy the icon name from the iconify website):

<.iconify icon="heroicons-solid:collection" />

Specify custom classes:

<.iconify icon="heroicons-solid:collection" class="w-8 h-8 text-base-content" /> 

Or if you use Surface, it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:

Add alias Iconify.Icon to your Web module, and then:

<#Icon iconify="heroicons-solid:collection" />

If your icon is dynamic, you'll still want to use the first form:

<.iconify icon={@my_icon} />

Note: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like sort -u -o icons_dir/icons.css icons_dir/icons.css to clean up the CSS file.

+
config :iconify_ex, :generated_icon_static_url, "/images/icons/" # where CSS and images are served from
  1. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:

Embed an icon using default classes (copy the icon name from the iconify website):

<.iconify icon="heroicons-solid:collection" />

Specify custom classes:

<.iconify icon="heroicons-solid:collection" class="w-8 h-8 text-base-content" /> 

Or if you use Surface, it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:

Add alias Iconify.Icon to your Web module, and then:

<#Icon iconify="heroicons-solid:collection" />

If your icon is dynamic, you'll still want to use the first form:

<.iconify icon={@my_icon} />

Note: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like sort -u -o icons_dir/icons.css icons_dir/icons.css to clean up the CSS file.

- diff --git a/Import2Alias.CallerTracer.html b/Import2Alias.CallerTracer.html index e5b7eacbfa..eb68a9b98d 100644 --- a/Import2Alias.CallerTracer.html +++ b/Import2Alias.CallerTracer.html @@ -5,16 +5,16 @@ - + - Import2Alias.CallerTracer — Bonfire v0.9.10-classic-beta.156 + Import2Alias.CallerTracer — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
@@ -132,7 +132,7 @@

Import2Alias.CallerTracer - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Import2Alias.Server.html b/Import2Alias.Server.html index 35f1f5f70c..03a66b6392 100644 --- a/Import2Alias.Server.html +++ b/Import2Alias.Server.html @@ -5,16 +5,16 @@ - + - Import2Alias.Server — Bonfire v0.9.10-classic-beta.156 + Import2Alias.Server — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Import2Alias.Server - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Import2Alias.html b/Import2Alias.html index 0d5a1a9f34..ac290c6c46 100644 --- a/Import2Alias.html +++ b/Import2Alias.html @@ -5,16 +5,16 @@ - + - Import2Alias — Bonfire v0.9.10-classic-beta.156 + Import2Alias — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Import2Alias - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.Account.New.html b/Mix.Tasks.Bonfire.Account.New.html index 215a9046a9..69a2b904cc 100644 --- a/Mix.Tasks.Bonfire.Account.New.html +++ b/Mix.Tasks.Bonfire.Account.New.html @@ -5,16 +5,16 @@ - + - mix bonfire.account.new — Bonfire v0.9.10-classic-beta.156 + mix bonfire.account.new — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.account.new - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -144,7 +144,7 @@

Usage

-
just mix bonfire.account.new [email@address]

You will be prompted for a password and an email if it was not provided.

+
just mix bonfire.account.new [email@address]

You will be prompted for a password and an email if it was not provided.

diff --git a/Mix.Tasks.Bonfire.Extension.Compile.html b/Mix.Tasks.Bonfire.Extension.Compile.html index fe124625db..31383e42ac 100644 --- a/Mix.Tasks.Bonfire.Extension.Compile.html +++ b/Mix.Tasks.Bonfire.Extension.Compile.html @@ -5,16 +5,16 @@ - + - mix bonfire.extension.compile — Bonfire v0.9.10-classic-beta.156 + mix bonfire.extension.compile — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.extension.compile - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.Extension.CopyMigrations.html b/Mix.Tasks.Bonfire.Extension.CopyMigrations.html index 913b1cb592..0e77fa54c5 100644 --- a/Mix.Tasks.Bonfire.Extension.CopyMigrations.html +++ b/Mix.Tasks.Bonfire.Extension.CopyMigrations.html @@ -5,16 +5,16 @@ - + - mix bonfire.extension.copy_migrations — Bonfire v0.9.10-classic-beta.156 + mix bonfire.extension.copy_migrations — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.extension.copy_migrations - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -202,7 +202,7 @@

copy(extension_paths, dest_path, opts)

- + View Source diff --git a/Mix.Tasks.Bonfire.Extension.New.html b/Mix.Tasks.Bonfire.Extension.New.html index eb2b205e7c..68d8e1a548 100644 --- a/Mix.Tasks.Bonfire.Extension.New.html +++ b/Mix.Tasks.Bonfire.Extension.New.html @@ -5,16 +5,16 @@ - + - mix bonfire.extension.new — Bonfire v0.9.10-classic-beta.156 + mix bonfire.extension.new — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.extension.new - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.FullDocs.html b/Mix.Tasks.Bonfire.FullDocs.html index da600e9a32..3b47962647 100644 --- a/Mix.Tasks.Bonfire.FullDocs.html +++ b/Mix.Tasks.Bonfire.FullDocs.html @@ -5,16 +5,16 @@ - + - mix bonfire.full_docs — Bonfire v0.9.10-classic-beta.156 + mix bonfire.full_docs — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.full_docs - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.LoadTesting.html b/Mix.Tasks.Bonfire.LoadTesting.html index d450216b26..f073c6f238 100644 --- a/Mix.Tasks.Bonfire.LoadTesting.html +++ b/Mix.Tasks.Bonfire.LoadTesting.html @@ -5,16 +5,16 @@ - + - mix bonfire.load_testing — Bonfire v0.9.10-classic-beta.156 + mix bonfire.load_testing — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.load_testing - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.Localise.Extract.html b/Mix.Tasks.Bonfire.Localise.Extract.html index 6a5a16c485..35010496d5 100644 --- a/Mix.Tasks.Bonfire.Localise.Extract.html +++ b/Mix.Tasks.Bonfire.Localise.Extract.html @@ -5,16 +5,16 @@ - + - mix bonfire.localise.extract — Bonfire v0.9.10-classic-beta.156 + mix bonfire.localise.extract — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,13 +132,13 @@

mix bonfire.localise.extract - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

-

Extracts translations by recompiling the Elixir source code.

mix gettext.extract [OPTIONS]

Translations are extracted into POT (Portable Object Template) files (with a +

Extracts translations by recompiling the Elixir source code.

mix gettext.extract [OPTIONS]

Translations are extracted into POT (Portable Object Template) files (with a .pot extension). The location of these files is determined by the :otp_app and :priv options given by Gettext modules when they call use Gettext. One POT file is generated for each translation domain.

It is possible to give the --merge option to perform merging diff --git a/Mix.Tasks.Bonfire.Release.html b/Mix.Tasks.Bonfire.Release.html index 941dd06ffc..c732a0a0ab 100644 --- a/Mix.Tasks.Bonfire.Release.html +++ b/Mix.Tasks.Bonfire.Release.html @@ -5,16 +5,16 @@ - + - mix bonfire.release — Bonfire v0.9.10-classic-beta.156 + mix bonfire.release — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire

@@ -132,7 +132,7 @@

mix bonfire.release - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.Secrets.html b/Mix.Tasks.Bonfire.Secrets.html index d8d8e4eaf2..bd175aed03 100644 --- a/Mix.Tasks.Bonfire.Secrets.html +++ b/Mix.Tasks.Bonfire.Secrets.html @@ -5,16 +5,16 @@ - + - mix bonfire.secrets — Bonfire v0.9.10-classic-beta.156 + mix bonfire.secrets — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,13 +132,13 @@

mix bonfire.secrets - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

-

Generates secrets and prints to the terminal.

mix bonfire.secrets [length]

By default, it generates keys 64 characters long. +

Generates secrets and prints to the terminal.

mix bonfire.secrets [length]

By default, it generates keys 64 characters long. The minimum value for length is 32.

diff --git a/Mix.Tasks.Bonfire.User.Admin.Promote.html b/Mix.Tasks.Bonfire.User.Admin.Promote.html index 3708fd47c8..ffdfc80e9a 100644 --- a/Mix.Tasks.Bonfire.User.Admin.Promote.html +++ b/Mix.Tasks.Bonfire.User.Admin.Promote.html @@ -5,16 +5,16 @@ - + - mix bonfire.user.admin.promote — Bonfire v0.9.10-classic-beta.156 + mix bonfire.user.admin.promote — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.user.admin.promote - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Mix.Tasks.Bonfire.User.New.html b/Mix.Tasks.Bonfire.User.New.html index b45ea7fce0..c8fac89424 100644 --- a/Mix.Tasks.Bonfire.User.New.html +++ b/Mix.Tasks.Bonfire.User.New.html @@ -5,16 +5,16 @@ - + - mix bonfire.user.new — Bonfire v0.9.10-classic-beta.156 + mix bonfire.user.new — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.user.new - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -144,7 +144,7 @@

Usage

-
just mix bonfire.user.new [username] [email@address]

You will be prompted for a password, and username/email if not provided.

+
just mix bonfire.user.new [username] [email@address]

You will be prompted for a password, and username/email if not provided.

diff --git a/Mix.Tasks.Bonfire.Widget.New.html b/Mix.Tasks.Bonfire.Widget.New.html index 14c1a627c2..cd9f4dd194 100644 --- a/Mix.Tasks.Bonfire.Widget.New.html +++ b/Mix.Tasks.Bonfire.Widget.New.html @@ -5,16 +5,16 @@ - + - mix bonfire.widget.new — Bonfire v0.9.10-classic-beta.156 + mix bonfire.widget.new — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix bonfire.widget.new - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -169,7 +169,7 @@

-

Callback implementation for Igniter.Mix.Task.igniter/2.

+

Callback implementation for Igniter.Mix.Task.igniter/2.

@@ -233,7 +233,7 @@

igniter(igniter, argv)

-

Callback implementation for Igniter.Mix.Task.igniter/2.

+

Callback implementation for Igniter.Mix.Task.igniter/2.

diff --git a/Mix.Tasks.Import2alias.html b/Mix.Tasks.Import2alias.html index e06daef1b0..36461763fa 100644 --- a/Mix.Tasks.Import2alias.html +++ b/Mix.Tasks.Import2alias.html @@ -5,16 +5,16 @@ - + - mix import2alias — Bonfire v0.9.10-classic-beta.156 + mix import2alias — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

mix import2alias - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Nebulex.DiskAdapter.DiskCacheHelper.html b/Nebulex.DiskAdapter.DiskCacheHelper.html index 6c7107ed42..d904ddc32c 100644 --- a/Nebulex.DiskAdapter.DiskCacheHelper.html +++ b/Nebulex.DiskAdapter.DiskCacheHelper.html @@ -5,16 +5,16 @@ - + - Nebulex.DiskAdapter.DiskCacheHelper — Bonfire v0.9.10-classic-beta.156 + Nebulex.DiskAdapter.DiskCacheHelper — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Nebulex.DiskAdapter.DiskCacheHelper - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Nebulex.DiskAdapter.html b/Nebulex.DiskAdapter.html index 63d6ee75c5..1fb77a56ca 100644 --- a/Nebulex.DiskAdapter.html +++ b/Nebulex.DiskAdapter.html @@ -5,16 +5,16 @@ - + - Nebulex.DiskAdapter — Bonfire v0.9.10-classic-beta.156 + Nebulex.DiskAdapter — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Nebulex.DiskAdapter - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Changesets.html b/Needle.Changesets.html index 51cf248f0b..7734407e0d 100644 --- a/Needle.Changesets.html +++ b/Needle.Changesets.html @@ -5,16 +5,16 @@ - + - Needle.Changesets — Bonfire v0.9.10-classic-beta.156 + Needle.Changesets — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Changesets - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -281,7 +281,7 @@

-

Like Ecto.Changeset.put_assoc/3 but for Pointables, Virtuals and Mixins.

+

Like Ecto.Changeset.put_assoc/3 but for Pointables, Virtuals and Mixins.

@@ -673,7 +673,7 @@

put_assoc!(changeset, assoc_key, rels)

-

Like Ecto.Changeset.put_assoc/3 but for Pointables, Virtuals and Mixins.

Copies across keys where possible.

+

Like Ecto.Changeset.put_assoc/3 but for Pointables, Virtuals and Mixins.

Copies across keys where possible.

diff --git a/Needle.Form.html b/Needle.Form.html index 95da566a3d..e1e31e3c17 100644 --- a/Needle.Form.html +++ b/Needle.Form.html @@ -5,16 +5,16 @@ - + - Needle.Form — Bonfire v0.9.10-classic-beta.156 + Needle.Form — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Form - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Migration.html b/Needle.Migration.html index e8885f4acb..1363462314 100644 --- a/Needle.Migration.html +++ b/Needle.Migration.html @@ -5,16 +5,16 @@ - + - Needle.Migration — Bonfire v0.9.10-classic-beta.156 + Needle.Migration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Migration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Mixin.html b/Needle.Mixin.html index 45ae960476..c8c2693a2a 100644 --- a/Needle.Mixin.html +++ b/Needle.Mixin.html @@ -5,16 +5,16 @@ - + - Needle.Mixin — Bonfire v0.9.10-classic-beta.156 + Needle.Mixin — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Mixin - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -152,16 +152,16 @@

Declaring a mixin table type

-
defmodule My.Mixin do
+
defmodule My.Mixin do
 
   use Needle.Mixin,
     otp_app: :my_app,
     source: "postgres_table_name"
 
-  mixin_schema do
+  mixin_schema do
     field :is_awesome, :boolean
-  end
-end
+
end +end
diff --git a/Needle.NotFound.html b/Needle.NotFound.html index 49cd226983..e95b907172 100644 --- a/Needle.NotFound.html +++ b/Needle.NotFound.html @@ -5,16 +5,16 @@ - + - Needle.NotFound — Bonfire v0.9.10-classic-beta.156 + Needle.NotFound — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.NotFound exception - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Pointable.html b/Needle.Pointable.html index 6251a63c21..92ca1e108a 100644 --- a/Needle.Pointable.html +++ b/Needle.Pointable.html @@ -5,16 +5,16 @@ - + - Needle.Pointable — Bonfire v0.9.10-classic-beta.156 + Needle.Pointable — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Pointable - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -149,9 +149,9 @@

source: "my_table", # default name of table in database table_id: "01EBTVSZJ6X02J01R1XWWPWGZW" # unique UID to identify table -pointable_schema do +pointable_schema do # ... fields go here, if any -end

+end

diff --git a/Needle.Pointer.html b/Needle.Pointer.html index 9c10af86d9..4a1d402a1e 100644 --- a/Needle.Pointer.html +++ b/Needle.Pointer.html @@ -5,16 +5,16 @@ - + - Needle.Pointer — Bonfire v0.9.10-classic-beta.156 + Needle.Pointer — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Pointer - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Pointers.html b/Needle.Pointers.html index 40047d3f58..be0fd4596f 100644 --- a/Needle.Pointers.html +++ b/Needle.Pointers.html @@ -5,16 +5,16 @@ - + - Needle.Pointers — Bonfire v0.9.10-classic-beta.156 + Needle.Pointers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Pointers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Random.html b/Needle.Random.html index 21c076093a..c4a08ee945 100644 --- a/Needle.Random.html +++ b/Needle.Random.html @@ -5,16 +5,16 @@ - + - Needle.Random — Bonfire v0.9.10-classic-beta.156 + Needle.Random — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Random - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Table.html b/Needle.Table.html index 773f578877..90e0163027 100644 --- a/Needle.Table.html +++ b/Needle.Table.html @@ -5,16 +5,16 @@ - + - Needle.Table — Bonfire v0.9.10-classic-beta.156 + Needle.Table — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Table - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Tables.html b/Needle.Tables.html index d8ce5839af..991f88354a 100644 --- a/Needle.Tables.html +++ b/Needle.Tables.html @@ -5,16 +5,16 @@ - + - Needle.Tables — Bonfire v0.9.10-classic-beta.156 + Needle.Tables — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Tables - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -569,7 +569,7 @@

schema!(query)

schema?(module)

- + View Source diff --git a/Needle.UID.html b/Needle.UID.html index d5d11b456e..5676a2b571 100644 --- a/Needle.UID.html +++ b/Needle.UID.html @@ -5,16 +5,16 @@ - + - Needle.UID — Bonfire v0.9.10-classic-beta.156 + Needle.UID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.UID - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -145,7 +145,7 @@

Installation

-
{:needle_uid, git: "https://github.com/bonfire-networks/needle_uid", branch: "main"}

-

Same as cast/1 but raises Ecto.CastError on invalid arguments.

+

Same as cast/1 but raises Ecto.CastError on invalid arguments.

@@ -355,7 +355,7 @@

cast!(value, params \\ nil)

-

Same as cast/1 but raises Ecto.CastError on invalid arguments.

+

Same as cast/1 but raises Ecto.CastError on invalid arguments.

@@ -457,10 +457,10 @@

is_ulid?(str)

Examples -
iex> is_ulid?("01J3MQ2Q4RVB1WTE3KT1D8ZNX1")
+
iex> is_ulid?("01J3MQ2Q4RVB1WTE3KT1D8ZNX1")
 true
 
-iex> is_ulid?("invalid_ulid")
+iex> is_ulid?("invalid_ulid")
 false
@@ -491,13 +491,13 @@

is_uuid?(str, params \\ nil)

Examples -
iex> is_uuid?("550e8400-e29b-41d4-a716-446655440000")
+
iex> is_uuid?("550e8400-e29b-41d4-a716-446655440000")
 true
 
-iex> is_uuid?("test_3TUIKuXX5mNO2jSA41bsDx")
+iex> is_uuid?("test_3TUIKuXX5mNO2jSA41bsDx")
 true
 
-iex> is_uuid?("invalid_uuid")
+iex> is_uuid?("invalid_uuid")
 false
@@ -620,16 +620,16 @@

valid?(str, params \\ nil)

Examples -
iex> valid?("01J3MQ2Q4RVB1WTE3KT1D8ZNX1")
+
iex> valid?("01J3MQ2Q4RVB1WTE3KT1D8ZNX1")
 true
 
-iex> valid?("550e8400-e29b-41d4-a716-446655440000")
+iex> valid?("550e8400-e29b-41d4-a716-446655440000")
 true
 
-iex> is_uuid?("test_3TUIKuXX5mNO2jSA41bsDx")
+iex> is_uuid?("test_3TUIKuXX5mNO2jSA41bsDx")
 true
 
-iex> valid?("invalid_id")
+iex> valid?("invalid_id")
 false
diff --git a/Needle.ULID.Migration.html b/Needle.ULID.Migration.html index c54e3d914b..1d121c42a6 100644 --- a/Needle.ULID.Migration.html +++ b/Needle.ULID.Migration.html @@ -5,16 +5,16 @@ - + - Needle.ULID.Migration — Bonfire v0.9.10-classic-beta.156 + Needle.ULID.Migration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.ULID.Migration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.ULID.html b/Needle.ULID.html index ac01f4002a..697450dab3 100644 --- a/Needle.ULID.html +++ b/Needle.ULID.html @@ -5,16 +5,16 @@ - + - Needle.ULID — Bonfire v0.9.10-classic-beta.156 + Needle.ULID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.ULID - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -146,7 +146,7 @@

Installation

-
{:needle_ulid, git: "https://github.com/bonfire-networks/needle_ulid", branch: "main"}

-

Same as cast/1 but raises Ecto.CastError on invalid arguments.

+

Same as cast/1 but raises Ecto.CastError on invalid arguments.

@@ -254,7 +254,7 @@

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -292,7 +292,7 @@

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

@@ -455,7 +455,7 @@

cast!(value)

-

Same as cast/1 but raises Ecto.CastError on invalid arguments.

+

Same as cast/1 but raises Ecto.CastError on invalid arguments.

@@ -543,7 +543,7 @@

embed_as(_)

-

Callback implementation for Ecto.Type.embed_as/1.

+

Callback implementation for Ecto.Type.embed_as/1.

@@ -633,7 +633,7 @@

equal?(term1, term2)

-

Callback implementation for Ecto.Type.equal?/2.

+

Callback implementation for Ecto.Type.equal?/2.

diff --git a/Needle.Uid.html b/Needle.Uid.html index fd05d7bab0..188a51e51f 100644 --- a/Needle.Uid.html +++ b/Needle.Uid.html @@ -5,16 +5,16 @@ - + - Needle.UID — Bonfire v0.9.10-classic-beta.156 + Needle.UID — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -142,7 +142,7 @@

Installation

-
{:needle_uid, git: "https://github.com/bonfire-networks/needle_uid", branch: "main"}

Installation

-
{:needle_ulid, git: "https://github.com/bonfire-networks/needle_ulid", branch: "main"}

Needle.Unpointable - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

diff --git a/Needle.Virtual.html b/Needle.Virtual.html index 1187748a13..1f1b6505f5 100644 --- a/Needle.Virtual.html +++ b/Needle.Virtual.html @@ -5,16 +5,16 @@ - + - Needle.Virtual — Bonfire v0.9.10-classic-beta.156 + Needle.Virtual — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle.Virtual - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -152,9 +152,9 @@

source: "my_table", # default name of view in database table_id: "01EBTVSZJ6X02J01R1XWWPWGZW" # valid UID to identify virtual -virtual_schema do +virtual_schema do # ... `has_one`, `has_many`, or *virtual* fields ONLY go here. -end

+end

diff --git a/Needle.html b/Needle.html index e5026bda88..d4dbbf2fbf 100644 --- a/Needle.html +++ b/Needle.html @@ -5,16 +5,16 @@ - + - Needle — Bonfire v0.9.10-classic-beta.156 + Needle — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

Needle - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

@@ -170,19 +170,19 @@

Installation

-

Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:

defmodule MyApp.Repo.Migrations.InitPointers do
+

Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:

defmodule MyApp.Repo.Migrations.InitPointers do
   @moduledoc false
   use Ecto.Migration
   import Needle.Migration
 
-  def up(), do: inits(:up)
-  def down(), do: inits(:down)
+  def up(), do: inits(:up)
+  def down(), do: inits(:down)
 
-  defp inits(dir) do
-    init_pointers_ulid_extra(dir) # this one is optional but recommended
-    init_pointers(dir) # this one is not optional
-  end
-end

Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.

+ defp inits(dir) do + init_pointers_ulid_extra(dir) # this one is optional but recommended + init_pointers(dir) # this one is not optional + end +end

Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.

@@ -194,26 +194,26 @@

Picking a table id

-

The first step to declaring a new type is picking a unique table ID in UID format.

You could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.

For example, the ID for the Feed table is: 1TFEEDS0NTHES0V1S0FM0RTA1S, which can be read as "It feeds on the souls of mortals". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:

  • The alphabet is Crockford's Base32.
  • They must be 26 characters in length.
  • The first character must be a digit in the range 0-7.

To help you with this, the Needle.UID.synthesise!/1 method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:

iex(1)> Needle.UID.synthesise!("itfeedsonthesouls")
+

The first step to declaring a new type is picking a unique table ID in UID format.

You could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.

For example, the ID for the Feed table is: 1TFEEDS0NTHES0V1S0FM0RTA1S, which can be read as "It feeds on the souls of mortals". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:

  • The alphabet is Crockford's Base32.
  • They must be 26 characters in length.
  • The first character must be a digit in the range 0-7.

To help you with this, the Needle.UID.synthesise!/1 method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:

iex(1)> Needle.UID.synthesise!("itfeedsonthesouls")
 
-11:20:28.299 [error] Too short, need 9 chars.
+11:20:28.299 [error] Too short, need 9 chars.
 :ok
-iex(2)> Needle.UID.synthesise!("itfeedsonthesoulsofmortalsandothers")
+iex(2)> Needle.UID.synthesise!("itfeedsonthesoulsofmortalsandothers")
 
-11:20:31.819 [warn]  Too long, chopping off last 9 chars
+11:20:31.819 [warn]  Too long, chopping off last 9 chars
 "1TFEEDS0NTHES0V1S0FM0RTA1S"
-iex(3)> Needle.UID.synthesise!("itfeedsonthesoulsofmortals")
+iex(3)> Needle.UID.synthesise!("itfeedsonthesoulsofmortals")
 "1TFEEDS0NTHES0V1S0FM0RTA1S"
-iex(4)> Needle.UID.synthesise!("gtfeedsonthesoulsofmortals")
+iex(4)> Needle.UID.synthesise!("gtfeedsonthesoulsofmortals")
 
-11:21:03.268 [warn]  First character must be a digit in the range 0-7, replacing with 7
+11:21:03.268 [warn]  First character must be a digit in the range 0-7, replacing with 7
 "7TFEEDS0NTHES0V1S0FM0RTA1S"

Virtual pointables ("virtuals")

-

Needle.Virtual is the simplest and most common type of object. Here's a definition of block:

defmodule Bonfire.Data.Social.Block do
+

Needle.Virtual is the simplest and most common type of object. Here's a definition of block:

defmodule Bonfire.Data.Social.Block do
 
   use Needle.Virtual,
     otp_app: :bonfire_data_social,
@@ -222,26 +222,26 @@ 

alias Bonfire.Data.Edges.Edge - virtual_schema do + virtual_schema do has_one :edge, Edge, foreign_key: :id - end -end

It should look quite similar to a mixin definition, except that we use Needle.Virtual this time (passing an additional table_id argument) and we call the virtual_schema macro.

The primary limitation of a virtual is that you cannot put extra fields on it. This also means that belongs_to is not generally permitted because it results in adding a field, while has_one and has_many work just fine as they do not cause the creation of fields in the schema.

This is not usually a problem, as extra fields can be put into mixins or multimixins as appropriate.

In all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.

Under the hood, a virtual has a writable view (in the above example, called bonfire_data_social_block). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the pointers table for you transparently. When you delete from the view, the corresponding pointers entry is marked deleted for you.

Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).

+ end +end

It should look quite similar to a mixin definition, except that we use Needle.Virtual this time (passing an additional table_id argument) and we call the virtual_schema macro.

The primary limitation of a virtual is that you cannot put extra fields on it. This also means that belongs_to is not generally permitted because it results in adding a field, while has_one and has_many work just fine as they do not cause the creation of fields in the schema.

This is not usually a problem, as extra fields can be put into mixins or multimixins as appropriate.

In all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.

Under the hood, a virtual has a writable view (in the above example, called bonfire_data_social_block). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the pointers table for you transparently. When you delete from the view, the corresponding pointers entry is marked deleted for you.

Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).

Pointables

-

The other, lesser used, type of object is called the Needle.Pointable. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.

When a record is inserted into a pointable table, a copy is made in the pointers table for you transparently. When you delete from the table, the the corresponding pointers entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.

Pointables pay for this flexibility by being slightly more expensive than virtuals:

  • Records must be inserted into/deleted from two tables (the pointable's table and the pointers table).
  • The pointable table needs its own primary key index.

The choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.

Here is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):

defmodule Bonfire.Data.Social.APActivity do
+

The other, lesser used, type of object is called the Needle.Pointable. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.

When a record is inserted into a pointable table, a copy is made in the pointers table for you transparently. When you delete from the table, the the corresponding pointers entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.

Pointables pay for this flexibility by being slightly more expensive than virtuals:

  • Records must be inserted into/deleted from two tables (the pointable's table and the pointers table).
  • The pointable table needs its own primary key index.

The choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.

Here is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):

defmodule Bonfire.Data.Social.APActivity do
 
   use Needle.Pointable,
     otp_app: :bonfire_data_social,
     table_id: "30NF1REAPACTTAB1ENVMBER0NE",
     source: "bonfire_data_social_apactivity"
 
-  pointable_schema do
+  pointable_schema do
     field :json, :map
-  end
-end

As you can see, to declare a pointable schema, we start by using Needle.Pointable, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.

We then call pointable_schema and define any fields we wish to put directly in the table. For the most part, pointable_schema is like Ecto's schema macro, except you do not provide the table name and let it handle the primary key.

If for some reason you wished to turn ID autogeneration off, you could pass autogenerate: false to the options provided when using Needle.Pointable.

+ end +end

As you can see, to declare a pointable schema, we start by using Needle.Pointable, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.

We then call pointable_schema and define any fields we wish to put directly in the table. For the most part, pointable_schema is like Ecto's schema macro, except you do not provide the table name and let it handle the primary key.

If for some reason you wished to turn ID autogeneration off, you could pass autogenerate: false to the options provided when using Needle.Pointable.

@@ -254,26 +254,26 @@

Mixins - storing data about objects

Mixins are tables which contain extra information on behalf of objects. Each object can choose to -record or not record information for each mixin. Sample mixins include:

  • user profile (containing a name, location and summary)
  • post content (containing the title, summary, and/or html body of a post or message)
  • created (containing the id of the object creator)

In this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.

Mixins are just tables too! The only requirement is they have a UID primary key which references Needle.Pointer. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the mixin_schema macro).

Here is a sample mixin definition for a user profile:

defmodule Bonfire.Data.Social.Profile do
+record or not record information for each mixin. Sample mixins include:

  • user profile (containing a name, location and summary)
  • post content (containing the title, summary, and/or html body of a post or message)
  • created (containing the id of the object creator)

In this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.

Mixins are just tables too! The only requirement is they have a UID primary key which references Needle.Pointer. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the mixin_schema macro).

Here is a sample mixin definition for a user profile:

defmodule Bonfire.Data.Social.Profile do
 
   use Needle.Mixin,
     otp_app: :bonfire_data_social,
     source: "bonfire_data_social_profile"
 
-  mixin_schema do
+  mixin_schema do
     field :name, :string
     field :summary, :string
     field :website, :string
     field :location, :string
-  end
-end

Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.

Aside from useing Needle.Mixin instead of Ecto.Schema and calling mixin_schema instead of + end +end

Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.

Aside from useing Needle.Mixin instead of Ecto.Schema and calling mixin_schema instead of schema, pretty similar to a standard Ecto schema, right?

The arguments to use Needle.Mixin are:

  • otp_app: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)
  • source: the underlying table name to use in the database

We will cover dynamic configuration later. For now, you can use the OTP app that includes the module.

Multimixins

-

Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.

For this to work, a multimixin must have a compound primary key which must contain an id column referencing Needle.Pointer and at least one other field which will collectively be unique.

An example multimixin is used for publishing an item to feeds:

defmodule Bonfire.Data.Social.FeedPublish do
+

Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.

For this to work, a multimixin must have a compound primary key which must contain an id column referencing Needle.Pointer and at least one other field which will collectively be unique.

An example multimixin is used for publishing an item to feeds:

defmodule Bonfire.Data.Social.FeedPublish do
 
   use Needle.Mixin,
     otp_app: :bonfire_data_social,
@@ -281,10 +281,10 @@ 

alias Needle.Pointer - mixin_schema do + mixin_schema do belongs_to :feed, Pointer, primary_key: true - end -end

Notice that this looks very similar to defining a mixin. Indeed, the only difference is the primary_key: true in this line, which adds a second field to the compound primary key. + end +end

Notice that this looks very similar to defining a mixin. Indeed, the only difference is the primary_key: true in this line, which adds a second field to the compound primary key. This results in ecto recording a compound primary key of (id, feed_id) for the schema (the id is added for you as with regular mixins).

@@ -297,207 +297,207 @@

Virtuals

-

Most virtuals are incredibly simple to migrate for:

defmodule Bonfire.Data.Social.Post.Migration do
+

Most virtuals are incredibly simple to migrate for:

defmodule Bonfire.Data.Social.Post.Migration do
 
   import Needle.Migration
   alias Bonfire.Data.Social.Post
 
-  def migrate_post(), do: migrate_virtual(Post)
+  def migrate_post(), do: migrate_virtual(Post)
 
-end

If you need to do more work, it can be a little trickier. Here's an example for block, which also creates a unique index on another table:

defmodule Bonfire.Data.Social.Block.Migration do
+end

If you need to do more work, it can be a little trickier. Here's an example for block, which also creates a unique index on another table:

defmodule Bonfire.Data.Social.Block.Migration do
 
   import Ecto.Migration
   import Needle.Migration
   import Bonfire.Data.Edges.Edge.Migration
   alias Bonfire.Data.Social.Block
 
-  def migrate_block_view(), do: migrate_virtual(Block)
+  def migrate_block_view(), do: migrate_virtual(Block)
 
-  def migrate_block_unique_index(), do: migrate_type_unique_index(Block)
+  def migrate_block_unique_index(), do: migrate_type_unique_index(Block)
 
-  def migrate_block(dir \\ direction())
+  def migrate_block(dir \\ direction())
 
-  def migrate_block(:up) do
-    migrate_block_view()
-    migrate_block_unique_index()
-  end
+  def migrate_block(:up) do
+    migrate_block_view()
+    migrate_block_unique_index()
+  end
 
-  def migrate_block(:down) do
-    migrate_block_unique_index()
-    migrate_block_view()
-  end
+  def migrate_block(:down) do
+    migrate_block_unique_index()
+    migrate_block_view()
+  end
 
-end

Notice how we have to write our up and down versions separately to get the correct ordering of operations.

+end

Notice how we have to write our up and down versions separately to get the correct ordering of operations.

Pointables

-

Migration example for a Pointable:

defmodule Bonfire.Data.Social.APActivity.Migration do
+

Migration example for a Pointable:

defmodule Bonfire.Data.Social.APActivity.Migration do
   @moduledoc false
   use Ecto.Migration
   import Needle.Migration
   alias Bonfire.Data.Social.APActivity
 
-  defp make_apactivity_table(exprs) do
-    quote do
+  defp make_apactivity_table(exprs) do
+    quote do
       require Needle.Migration
-      Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do
+      Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do
         Ecto.Migration.add :json, :jsonb
-        unquote_splicing(exprs)
-      end
-    end
-  end
-
-  defmacro create_apactivity_table, do: make_apactivity_table([])
-  defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)
-
-  def drop_apactivity_table(), do: drop_pointable_table(APActivity)
-
-  defp maa(:up), do: make_apactivity_table([])
-  defp maa(:down) do
-    quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()
-  end
-
-  defmacro migrate_apactivity() do
-    quote do
-      if Ecto.Migration.direction() == :up,
-        do: unquote(maa(:up)),
-        else: unquote(maa(:down))
-    end
-  end
-
-end

As you can see, this Pointable migration a little trickier to define than a Virtual because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:

defmodule MyApp.Repo.Migrations.Greeting do
+        unquote_splicing(exprs)
+      end
+    end
+  end
+
+  defmacro create_apactivity_table, do: make_apactivity_table([])
+  defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)
+
+  def drop_apactivity_table(), do: drop_pointable_table(APActivity)
+
+  defp maa(:up), do: make_apactivity_table([])
+  defp maa(:down) do
+    quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()
+  end
+
+  defmacro migrate_apactivity() do
+    quote do
+      if Ecto.Migration.direction() == :up,
+        do: unquote(maa(:up)),
+        else: unquote(maa(:down))
+    end
+  end
+
+end

As you can see, this Pointable migration a little trickier to define than a Virtual because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:

defmodule MyApp.Repo.Migrations.Greeting do
   @moduledoc false
   use Ecto.Migration
   import Needle.Migration
 
-  def up() do
-    create_pointable_table(:greeting, "GREET1NGSFR0MD0CEXAMP1E000") do
+  def up() do
+    create_pointable_table(:greeting, "GREET1NGSFR0MD0CEXAMP1E000") do
       add :greeting, :text, null: false
-    end
-  end
+    end
+  end
 
-  def down() do
-    drop_pointable_table(:greeting, "GREET1NGSFR0MD0CEXAMP1E000")
-  end
-end

As you can see, it's pretty similar to defining a regular migration, except you use create_pointable_table and + def down() do + drop_pointable_table(:greeting, "GREET1NGSFR0MD0CEXAMP1E000") + end +end

As you can see, it's pretty similar to defining a regular migration, except you use create_pointable_table and drop_pointable_table. Notice that our sentinel UID makes an appearance again here. It's very important that these match what we declared in the schema.

Mixins

-

Mixins look much like pointables:

defmodule Bonfire.Data.Social.Profile.Migration do
+

Mixins look much like pointables:

defmodule Bonfire.Data.Social.Profile.Migration do
 
   import Needle.Migration
   alias Bonfire.Data.Social.Profile
 
   # create_profile_table/{0,1}
 
-  defp make_profile_table(exprs) do
-    quote do
+  defp make_profile_table(exprs) do
+    quote do
       require Needle.Migration
-      Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do
+      Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do
         Ecto.Migration.add :name, :text
         Ecto.Migration.add :summary, :text
         Ecto.Migration.add :website, :text
         Ecto.Migration.add :location, :text
-        Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)
-        Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)
-        unquote_splicing(exprs)
-      end
-    end
-  end
+        Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)
+        Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)
+        unquote_splicing(exprs)
+      end
+    end
+  end
 
-  defmacro create_profile_table(), do: make_profile_table([])
-  defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)
+  defmacro create_profile_table(), do: make_profile_table([])
+  defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)
 
   # drop_profile_table/0
 
-  def drop_profile_table(), do: drop_mixin_table(Profile)
+  def drop_profile_table(), do: drop_mixin_table(Profile)
 
   # migrate_profile/{0,1}
 
-  defp mp(:up), do: make_profile_table([])
+  defp mp(:up), do: make_profile_table([])
 
-  defp mp(:down) do
-    quote do
-      Bonfire.Data.Social.Profile.Migration.drop_profile_table()
-    end
-  end
+  defp mp(:down) do
+    quote do
+      Bonfire.Data.Social.Profile.Migration.drop_profile_table()
+    end
+  end
 
-  defmacro migrate_profile() do
-    quote do
-      if Ecto.Migration.direction() == :up,
-        do: unquote(mp(:up)),
-        else: unquote(mp(:down))
-    end
-  end
+  defmacro migrate_profile() do
+    quote do
+      if Ecto.Migration.direction() == :up,
+        do: unquote(mp(:up)),
+        else: unquote(mp(:down))
+    end
+  end
 
-end

+end

Multimixins

-

Similar to mixins:

defmodule Bonfire.Data.Social.FeedPublish.Migration do
+

Similar to mixins:

defmodule Bonfire.Data.Social.FeedPublish.Migration do
 
   import Ecto.Migration
   import Needle.Migration
   alias Bonfire.Data.Social.FeedPublish
 
-  @feed_publish_table FeedPublish.__schema__(:source)
+  @feed_publish_table FeedPublish.__schema__(:source)
 
   # create_feed_publish_table/{0,1}
 
-  defp make_feed_publish_table(exprs) do
-    quote do
+  defp make_feed_publish_table(exprs) do
+    quote do
       require Needle.Migration
-      Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do
+      Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do
         Ecto.Migration.add :feed_id,
-          Needle.Migration.strong_pointer(), primary_key: true
-        unquote_splicing(exprs)
-      end
-    end
-  end
-
-  defmacro create_feed_publish_table(), do: make_feed_publish_table([])
-  defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body)
-
-  def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish)
-
-  def migrate_feed_publish_feed_index(dir \\ direction(), opts \\ [])
-  def migrate_feed_publish_feed_index(:up, opts),
-    do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts))
-  def migrate_feed_publish_feed_index(:down, opts),
-    do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts))
-
-  defp mf(:up) do
-    quote do
-      Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table()
-      Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()
-    end
-  end
-
-  defp mf(:down) do
-    quote do
-      Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()
-      Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table()
-    end
-  end
-
-  defmacro migrate_feed_publish() do
-    quote do
-      if Ecto.Migration.direction() == :up,
-        do: unquote(mf(:up)),
-        else: unquote(mf(:down))
-    end
-  end
-
-  defmacro migrate_feed_publish(dir), do: mf(dir)
-
-end

+ Needle.Migration.strong_pointer(), primary_key: true + unquote_splicing(exprs) + end + end + end + + defmacro create_feed_publish_table(), do: make_feed_publish_table([]) + defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body) + + def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish) + + def migrate_feed_publish_feed_index(dir \\ direction(), opts \\ []) + def migrate_feed_publish_feed_index(:up, opts), + do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts)) + def migrate_feed_publish_feed_index(:down, opts), + do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts)) + + defp mf(:up) do + quote do + Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table() + Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index() + end + end + + defp mf(:down) do + quote do + Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index() + Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table() + end + end + + defmacro migrate_feed_publish() do + quote do + if Ecto.Migration.direction() == :up, + do: unquote(mf(:up)), + else: unquote(mf(:down)) + end + end + + defmacro migrate_feed_publish(dir), do: mf(dir) + +end

@@ -520,15 +520,15 @@

Referencing Pointables

-

Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically belongs_to with Needle.Pointer. The table in which we do this does not itself need to necessarily be a Pointable.

defmodule MyApp.Foo do
+

Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically belongs_to with Needle.Pointer. The table in which we do this does not itself need to necessarily be a Pointable.

defmodule MyApp.Foo do
 
   use Ecto.Schema
 
   # regular ecto table, not pointable!
-  schema "hello" do
+  schema "hello" do
     belongs_to :pointer, Needle.Pointer # who knows what it points to?
-  end
-end

You may choose to reference a specific schema rather than Pointer if it + end +end

You may choose to reference a specific schema rather than Pointer if it will only point to a single table. If you do this, you must ensure that the referenced record exists in that table in the normal way. There may be some performance benefit, we didn't benchmark it.

The migration is slightly more complex, we have to decide what type of @@ -536,18 +536,18 @@

points to is deleted.
  • A weak pointer is nullable and is nilified when the object it points to is deleted.
  • An unbreakable pointer will raise when you attempt to delete the object it points to.
  • TypeNullable?On Delete
    StrongNoCascade
    WeakYesSet Null
    UnbreakableNoRaise

    In this case we will use a strong pointer, because we want it to be -deleted if the pointed object is deleted.

    defmodule MyApp.Repo.Migrations.Hello do
    +deleted if the pointed object is deleted.

    defmodule MyApp.Repo.Migrations.Hello do
       @moduledoc false
       use Ecto.Migration
       import Needle.Migration
     
    -  def change() do
    -    create_if_not_exists table(:hello) do
    -      add :pointer, strong_pointer(), null: false
    +  def change() do
    +    create_if_not_exists table(:hello) do
    +      add :pointer, strong_pointer(), null: false
           add :greeting, :text, null: false
    -    end
    -  end
    -end

    If you are pointing to a specific table instead of pointer, + end + end +end

    If you are pointing to a specific table instead of pointer, strong_pointer/1 allows you to pass the name of that module (strong_pointer/0 calls this with Needle.Pointer).

    diff --git a/Paginator.Page.html b/Paginator.Page.html index ae2acccb6e..75f36eddd4 100644 --- a/Paginator.Page.html +++ b/Paginator.Page.html @@ -5,16 +5,16 @@ - + - Paginator.Page — Bonfire v0.9.10-classic-beta.156 + Paginator.Page — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Paginator.Page - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Paginator.PageInfo.html b/Paginator.PageInfo.html index 9deaa49126..f26488e7d5 100644 --- a/Paginator.PageInfo.html +++ b/Paginator.PageInfo.html @@ -5,16 +5,16 @@ - + - Paginator.PageInfo — Bonfire v0.9.10-classic-beta.156 + Paginator.PageInfo — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Paginator.PageInfo - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Paginator.html b/Paginator.html index 74c35e1634..4214cfe54d 100644 --- a/Paginator.html +++ b/Paginator.html @@ -5,16 +5,16 @@ - + - Paginator — Bonfire v0.9.10-classic-beta.156 + Paginator — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,23 +132,23 @@

    Paginator behaviour - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    -

    Defines a paginator.

    This module adds a paginate/3 function to your Ecto.Repo so that you can +

    Defines a paginator.

    This module adds a paginate/3 function to your Ecto.Repo so that you can paginate through results using opaque cursors.

    Usage

    -
    defmodule MyApp.Repo do
    +
    defmodule MyApp.Repo do
       use Ecto.Repo, otp_app: :my_app
       use Paginator
    -end

    +end

    @@ -161,29 +161,29 @@

    Example

    -
    defmodule MyApp.Repo do
    +
    defmodule MyApp.Repo do
       use Ecto.Repo, otp_app: :my_app
       use Paginator,
         limit: 10,                           # sets the default limit to 10
         maximum_limit: 100,                  # sets the maximum limit to 100
         include_total_count: true,           # include total count by default
         total_count_primary_key_field: :uuid # sets the total_count_primary_key_field to uuid for calculate total_count
    -end

    Note that these values can be still be overriden when paginate/3 is called.

    +end

    Note that these values can be still be overriden when paginate/3 is called.

    Use without macros

    If you wish to avoid use of macros or you wish to use a different name for -the pagination function you can define your own function like so:

    defmodule MyApp.Repo do
    +the pagination function you can define your own function like so:

    defmodule MyApp.Repo do
       use Ecto.Repo, otp_app: :my_app
     
    -  def my_paginate_function(queryable, opts \ [], repo_opts \ []) do
    -    defaults = [limit: 10] # Default options of your choice here
    -    opts = Keyword.merge(defaults, opts)
    -    Paginator.paginate(queryable, opts, __MODULE__, repo_opts)
    -  end
    -end
    +
    def my_paginate_function(queryable, opts \ [], repo_opts \ []) do + defaults = [limit: 10] # Default options of your choice here + opts = Keyword.merge(defaults, opts) + Paginator.paginate(queryable, opts, __MODULE__, repo_opts) + end +end
    @@ -282,7 +282,7 @@

    paginate(queryable, opts, repo_opts)

    @callback paginate(
    -  queryable :: Ecto.Query.t(),
    +  queryable :: Ecto.Query.t(),
       opts :: Keyword.t(),
       repo_opts :: Keyword.t()
     ) ::
    @@ -319,36 +319,36 @@ 

    paginate(queryable, opts, repo_opts)

    Simple example -
    query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)
    +
    query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)
     
    -Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)

    +Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)

    Example with using custom sort directions per field

    -
    query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)
    +
    query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)
     
    -Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)

    +Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)

    Example with sorting on columns in joined tables

    -
    from(
    +
    from(
       p in Post,
       as: :posts,
    -  join: a in assoc(p, :author),
    +  join: a in assoc(p, :author),
       as: :author,
    -  preload: [author: a],
    +  preload: [author: a],
       select: p,
    -  order_by: [
    -    {:asc, a.name},
    -    {:asc, p.id}
    -  ]
    -)
    +  order_by: [
    +    {:asc, a.name},
    +    {:asc, p.id}
    +  ]
    +)
     
    -Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)

    When sorting on columns in joined tables it is necessary to use named bindings. In +Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)

    When sorting on columns in joined tables it is necessary to use named bindings. In this case we name it author. In the cursor_fields we refer to this named binding and its column name.

    To build the cursor Paginator uses the returned Ecto.Schema. When using a joined column the returned Ecto.Schema won't have the value of the joined column @@ -363,32 +363,32 @@

    paginate(queryable, opts, repo_opts)

    Example -
    from(
    +
    from(
       p in Post,
       as: :posts,
    -  join: a in assoc(p, :author),
    +  join: a in assoc(p, :author),
       as: :author,
    -  join: c in assoc(a, :company),
    +  join: c in assoc(a, :company),
       as: :company,
    -  preload: [author: a],
    +  preload: [author: a],
       select: p,
    -  order_by: [
    -    {:asc, a.name},
    -    {:asc, p.id}
    -  ]
    -)
    -
    -Repo.paginate(query,
    -  cursor_fields: [{{:company, :name}, :asc}, id: :asc],
    -  fetch_cursor_value_fun: fn
    -    post, {{:company, name}, _} ->
    +  order_by: [
    +    {:asc, a.name},
    +    {:asc, p.id}
    +  ]
    +)
    +
    +Repo.paginate(query,
    +  cursor_fields: [{{:company, :name}, :asc}, id: :asc],
    +  fetch_cursor_value_fun: fn
    +    post, {{:company, name}, _} ->
           post.author.company.name
     
         post, field ->
    -      Paginator.default_fetch_cursor_value(post, field)
    -  end,
    +      Paginator.default_fetch_cursor_value(post, field)
    +  end,
       limit: 50
    -)
    +
    )
    @@ -442,10 +442,10 @@

    cursor_for_record(record, cursor_fields, fe Example

    -
    iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])
    +
    iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])
     "g3QAAAABZAACaWRhAQ=="
     
    -iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: "Alice"}, [id: :asc, name: :desc])
    +iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: "Alice"}, [id: :asc, name: :desc])
     "g3QAAAACZAACaWRhAWQABG5hbWVtAAAABUFsaWNl"
    @@ -484,10 +484,10 @@

    default_fetch_cursor_value(schema, field) Example

    -
    iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)
    +
    iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)
     1
     
    -iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: "London"}}, {:address, :city})
    +iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: "London"}}, {:address, :city})
     "London"
    diff --git a/PaperTrail.Multi.html b/PaperTrail.Multi.html deleted file mode 100644 index 21acfe1648..0000000000 --- a/PaperTrail.Multi.html +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - - - - - - PaperTrail.Multi — Bonfire v0.9.10-classic-beta.156 - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - PaperTrail.Multi - (Bonfire v0.9.10-classic-beta.156) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - - - -
    - - - - -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - -
    -
    - new() - -
    - - - -
    - - - - - - - - - -
    - - - - -
    - - - -
    - -
    - - -
    -

    - - - - Functions -

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

    add_prefix(schema, prefix)

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

    See PaperTrail.Serializer.add_prefix/2.

    -
    -
    -
    - - - -
    - -

    See Ecto.Multi.append/2.

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

    delete(multi, struct, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])

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

    error(multi, name, value)

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

    See Ecto.Multi.error/3.

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

    get_item_type(data)

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

    See PaperTrail.Serializer.get_item_type/1.

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

    get_model_id(model)

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

    See PaperTrail.Serializer.get_model_id/1.

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

    get_sequence_id(table_name)

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

    See PaperTrail.Serializer.get_sequence_id/1.

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

    insert(multi, changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])

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

    insert_or_update(multi, changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])

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

    make_version_struct(version, model, options)

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

    See PaperTrail.Serializer.make_version_struct/3.

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

    merge(multi, merge)

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

    See Ecto.Multi.merge/2.

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

    merge(multi, mod, fun, args)

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

    See Ecto.Multi.merge/4.

    -
    -
    -
    - - - -
    - -

    See Ecto.Multi.new/0.

    -
    -
    -
    - - - -
    - -

    See Ecto.Multi.prepend/2.

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

    run(multi, name, run)

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

    See Ecto.Multi.run/3.

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

    run(multi, name, mod, fun, args)

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

    See Ecto.Multi.run/5.

    -
    -
    -
    - - - -
    - -

    See PaperTrail.Serializer.serialize/1.

    -
    -
    -
    - - - -
    - -

    See Ecto.Multi.to_list/1.

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

    update(multi, changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - diff --git a/PaperTrail.Serializer.html b/PaperTrail.Serializer.html deleted file mode 100644 index 3b5a6306d3..0000000000 --- a/PaperTrail.Serializer.html +++ /dev/null @@ -1,596 +0,0 @@ - - - - - - - - - - - PaperTrail.Serializer — Bonfire v0.9.10-classic-beta.156 - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - PaperTrail.Serializer - (Bonfire v0.9.10-classic-beta.156) - -

    - - -
    -

    Serialization functions to create a version struct

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - model() - -
    - -
    - -
    -
    - options() - -
    - -
    - -
    - - -
    - -
    -
    -

    - Functions -

    - -
    - - -

    Adds a prefix to the Ecto schema

    - -
    - -
    - - -

    Returns the model type, which is the last module name

    - -
    - -
    - - -

    Returns the model primary id

    - -
    - -
    - - -

    Returns the last primary key value of a table

    - -
    - -
    - - -

    Creates a version struct for a model and a specific changeset action

    - -
    - -
    - - -

    Shows DB representation of an Ecto model, filters relationships and virtual attributes from an Ecto.Changeset or %ModelStruct{}

    - -
    - -
    - - -

    Dumps changes using Ecto fields

    - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    @type model() :: struct() | Ecto.Changeset.t()
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    @type options() :: Keyword.t()
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    @type primary_key() :: integer() | String.t()
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

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

    add_prefix(schema, prefix)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec add_prefix(Ecto.Schema.schema(), nil | String.t()) :: Ecto.Schema.schema()
    - -
    - -

    Adds a prefix to the Ecto schema

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

    get_item_type(arg1)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_item_type(model()) :: String.t()
    - -
    - -

    Returns the model type, which is the last module name

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

    get_model_id(model)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_model_id(model()) :: primary_key()
    - -
    - -

    Returns the model primary id

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

    get_sequence_id(table_name)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_sequence_id(model() | String.t()) :: primary_key()
    - -
    - -

    Returns the last primary key value of a table

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

    make_version_struct(map, model, options)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec make_version_struct(map(), model(), options()) :: PaperTrail.Version.t()
    - -
    - -

    Creates a version struct for a model and a specific changeset action

    -
    -
    -
    - - - -
    - -
    - -
    @spec serialize(nil | Ecto.Changeset.t() | struct()) :: nil | map()
    - -
    - -

    Shows DB representation of an Ecto model, filters relationships and virtual attributes from an Ecto.Changeset or %ModelStruct{}

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

    serialize_changes(changeset)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec serialize_changes(Ecto.Changeset.t()) :: map()
    - -
    - -

    Dumps changes using Ecto fields

    -
    -
    - -
    -
    - - -
    -
    -
    - - - diff --git a/PaperTrail.Version.html b/PaperTrail.Version.html deleted file mode 100644 index f24c600909..0000000000 --- a/PaperTrail.Version.html +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - - - - - - PaperTrail.Version — Bonfire v0.9.10-classic-beta.156 - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - PaperTrail.Version - (Bonfire v0.9.10-classic-beta.156) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - t() - -
    - -
    - -
    -
    -

    - Functions -

    - - - -
    -
    - count() - -
    - -

    Returns the count of all version records in the database

    - -
    - -
    - - -
    - -
    -
    - first() - -
    - -

    Returns the first version record in the database by :inserted_at

    - -
    - -
    - - -
    - -
    -
    - last() - -
    - -

    Returns the last version record in the database by :inserted_at

    - -
    - -
    - - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    @type t() :: %PaperTrail.Version{
    -  __meta__: term(),
    -  event: term(),
    -  id: term(),
    -  inserted_at: term(),
    -  item_changes: term(),
    -  item_id: term(),
    -  item_type: term(),
    -  meta: term(),
    -  origin: term(),
    -  originator_id: term(),
    -  user: term()
    -}
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

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

    changeset(model, params \\ %{})

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

    Returns the count of all version records in the database

    -
    -
    -
    - - - -
    - - -
    -
    -
    - - - -
    - -

    Returns the first version record in the database by :inserted_at

    -
    -
    -
    - - - -
    - - -
    -
    -
    - - - -
    - -

    Returns the last version record in the database by :inserted_at

    -
    -
    -
    - - - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - diff --git a/PaperTrail.VersionQueries.html b/PaperTrail.VersionQueries.html deleted file mode 100644 index 5e7760962b..0000000000 --- a/PaperTrail.VersionQueries.html +++ /dev/null @@ -1,591 +0,0 @@ - - - - - - - - - - - PaperTrail.VersionQueries — Bonfire v0.9.10-classic-beta.156 - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - PaperTrail.VersionQueries - (Bonfire v0.9.10-classic-beta.156) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - -
    - - -

    Gets the current model record/struct of a version

    - -
    - -
    - - -

    Gets the last version of a record.

    - -
    - - - - - -
    - - -

    Gets all the versions of a record.

    - -
    - -
    - - -

    Gets all the versions of a record given a module and its id

    - -
    - - - -
    - - -
    - - - - - -
    - -
    - - -
    -

    - - - - Functions -

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

    get_current_model(version)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_current_model(version :: PaperTrail.Version.t()) :: Ecto.Schema.t() | nil
    - -
    - -

    Gets the current model record/struct of a version

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

    get_version(record)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_version(record :: Ecto.Schema.t()) :: PaperTrail.Version.t() | nil
    - -
    - -

    Gets the last version of a record.

    A list of options is optional, so you can set for example the :prefix of the query, -wich allows you to change between different tenants.

    Usage examples:

    iex(1)> PaperTrail.VersionQueries.get_version(record, id) - iex(1)> PaperTrail.VersionQueries.get_version(record, [prefix: "tenant_id"]) - iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id) - iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id, [prefix: "tenant_id"])

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

    get_version(model, id)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_version(model :: module(), id :: pos_integer()) ::
    -  PaperTrail.Version.t() | nil
    - -
    @spec get_version(record :: Ecto.Schema.t(), options :: keyword() | []) ::
    -  PaperTrail.Version.t() | nil
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_version(model, id, options)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_version(model :: module(), id :: pos_integer(), options :: keyword() | []) ::
    -  PaperTrail.Version.t() | nil
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_versions(record)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_versions(record :: Ecto.Schema.t()) :: [PaperTrail.Version.t()]
    - -
    - -

    Gets all the versions of a record.

    A list of options is optional, so you can set for example the :prefix of the query, -wich allows you to change between different tenants.

    Usage examples:

    iex(1)> PaperTrail.VersionQueries.get_versions(record) - iex(1)> PaperTrail.VersionQueries.get_versions(record, [prefix: "tenant_id"]) - iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id) - iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id, [prefix: "tenant_id"])

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

    get_versions(model, id)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_versions(model :: module(), id :: pos_integer()) :: [PaperTrail.Version.t()]
    - -
    @spec get_versions(record :: Ecto.Schema.t(), options :: keyword() | []) :: [
    -  PaperTrail.Version.t()
    -]
    - -
    - -

    Gets all the versions of a record given a module and its id

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

    get_versions(model, id, options)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec get_versions(model :: module(), id :: pos_integer(), options :: keyword() | []) ::
    -  [
    -    PaperTrail.Version.t()
    -  ]
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    has_version?(record)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec has_version?(record :: Ecto.Schema.t()) :: boolean()
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    has_version?(model, id)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec has_version?(model :: module(), id :: pos_integer()) :: boolean()
    - -
    @spec has_version?(record :: Ecto.Schema.t(), options :: keyword() | []) :: boolean()
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    has_version?(model, id, options)

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec has_version?(model :: module(), id :: pos_integer(), options :: keyword() | []) ::
    -  boolean()
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - diff --git a/PaperTrail.html b/PaperTrail.html deleted file mode 100644 index d6856497bd..0000000000 --- a/PaperTrail.html +++ /dev/null @@ -1,1452 +0,0 @@ - - - - - - - - - - - PaperTrail — Bonfire v0.9.10-classic-beta.156 - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - PaperTrail - (Bonfire v0.9.10-classic-beta.156) - -

    - - -
    -

    Track and record all the changes in your database. Revert back to anytime in history.

    Hex Version Hex docs -Total Download -License -Last Updated

    How does it work?

    PaperTrail lets you record every change in your database in a separate database table called versions. Library generates a new version record with associated data every time you run PaperTrail.insert/2, PaperTrail.update/2 or PaperTrail.delete/2 functions. Simply these functions wrap your Repo insert, update or destroy actions in a database transaction, so if your database action fails you won't get a new version.

    PaperTrail is assailed with hundreds of test assertions for each release. Data integrity is an important aim of this project, please refer to the strict_mode if you want to ensure data correctness and integrity of your versions. For simpler use cases the default mode of PaperTrail should suffice.

    - - - - Example -

    -
    changeset = Post.changeset(%Post{}, %{
    -  title: "Word on the street is Elixir got its own database versioning library",
    -  content: "You should try it now!"
    -})
    -
    -PaperTrail.insert(changeset)
    -# => on success:
    -# {:ok,
    -#  %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
    -#     title: "Word on the street is Elixir got its own database versioning library",
    -#     content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 21:42:38]},
    -#    version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#     event: "insert", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     item_changes: %{title: "Word on the street is Elixir got its own database versioning library",
    -#       content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#       updated_at: ~N[2016-09-15 21:42:38]},
    -#     item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}}
    -
    -# => on error(it matches Repo.insert/2):
    -# {:error, Ecto.Changeset<action: :insert,
    -#  changes: %{title: "Word on the street is Elixir got its own database versioning library", content: "You should try it now!"},
    -#  errors: [content: {"is too short", []}], data: #Post<>,
    -#  valid?: false>, %{}}
    -
    -post = Repo.get!(Post, 1)
    -edit_changeset = Post.changeset(post, %{
    -  title: "Elixir matures fast",
    -  content: "Future is already here, Elixir is the next step!"
    -})
    -
    -PaperTrail.update(edit_changeset)
    -# => on success:
    -# {:ok,
    -#  %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
    -#     title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!",
    -#     id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 22:00:59]},
    -#    version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#     event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59],
    -#     item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"},
    -#     item_id: 1, item_type: "Post", originator_id: nil, originator: nil
    -#     meta: nil}}}
    -
    -# => on error(it matches Repo.update/2):
    -# {:error, Ecto.Changeset<action: :update,
    -#  changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"},
    -#  errors: [title: {"is too short", []}], data: #Post<>,
    -#  valid?: false>, %{}}
    -
    -PaperTrail.get_version(post)
    -#  %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59],
    -#   item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}}
    -
    -updated_post = Repo.get!(Post, 1)
    -
    -PaperTrail.delete(updated_post)
    -# => on success:
    -# {:ok,
    -#  %{model: %Post{__meta__: #Ecto.Schema.Metadata<:deleted, "posts">,
    -#     title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!",
    -#     id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 22:00:59]},
    -#    version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#     event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12],
    -#     item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!",
    -#       id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#       updated_at: ~N[2016-09-15 22:00:59]},
    -#     item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}}
    -
    -Repo.aggregate(Post, :count, :id) # => 0
    -PaperTrail.Version.count() # => 3
    -# same as Repo.aggregate(PaperTrail.Version, :count, :id)
    -
    -PaperTrail.Version.last() # returns the last version in the db by inserted_at
    -#  %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12],
    -#   item_changes: %{"title" => "Elixir matures fast", content: "Future is already here, Elixir is the next step!", "id" => 1,
    -#     "inserted_at" => "2016-09-15T21:42:38",
    -#     "updated_at" => "2016-09-15T22:00:59"},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}

    PaperTrail is inspired by the ruby gem paper_trail. However, unlike the paper_trail gem this library actually results in less data duplication, faster and more explicit programming model to version your record changes.

    The library source code is minimal and well tested. It is suggested to read the source code.

    - - - - Installation -

    -
    1. Add paper_trail to your list of dependencies in mix.exs:

      def deps do
      -  [{:paper_trail, "~> 0.14.3"}]
      -end
    2. Configure paper_trail to use your application repo in config/config.exs:

      config :paper_trail, repo: YourApplicationName.Repo
      -# if you don't specify this PaperTrail will assume your repo name is Repo
    3. Install and compile your dependency:

      mix deps.get && mix compile

    4. Run this command to generate the migration:

      mix papertrail.install

      You might want to edit the types for :item_id or :originator_id if you're -using UUID or other types for your primary keys before you execute -mix ecto.migrate.

    5. Run the migration:

      mix ecto.migrate

    Your application is now ready to collect some history!

    Does this work with phoenix?

    YES! Make sure you do the steps above.

    - - - - %PaperTrail.Version{} fields: -

    -
    Column NameTypeDescriptionEntry Method
    eventStringeither "insert", "update" or "delete"Library generates
    item_typeStringmodel name of the reference recordLibrary generates
    item_idconfigurable (Integer by default)model id of the reference recordLibrary generates
    item_changesMapall the changes in this version as a mapLibrary generates
    originator_idconfigurable (Integer by default)foreign key reference to the creator/owner of this changeOptionally set
    originStringshort reference to origin(eg. worker:activity-checker, migration, admin:33)Optionally set
    metaMapany extra optional meta information about the version(eg. %{slug: "ausername", important: true})Optionally set
    inserted_atDateinserted_at timestampEcto generates

    Configuring the types

    If you are using UUID or another type for your primary keys, you can configure -the PaperTrail.Version schema to use it.

    Example Config
    config :paper_trail, item_type: Ecto.UUID,
    -                     originator_type: Ecto.UUID,
    -                     originator_relationship_options: [references: :uuid]
    Example User
    defmodule Acme.User do
    -  use Ecto.Schema
    -
    -  @primary_key {:uuid, :binary_id, autogenerate: true}
    -  schema "users" do
    -    field :email, :string
    -
    -    timestamps()
    -  end

    Remember to edit the types accordingly in the generated migration.

    - - - - Version origin references: -

    -

    PaperTrail records have a string field called origin. PaperTrail.insert/2, PaperTrail.update/2, PaperTrail.delete/2 functions accept a second argument to describe the origin of this version:

    PaperTrail.update(changeset, origin: "migration")
    -# or:
    -PaperTrail.update(changeset, origin: "user:1234")
    -# or:
    -PaperTrail.delete(changeset, origin: "worker:delete_inactive_users")
    -# or:
    -PaperTrail.insert(new_user_changeset, origin: "password_registration")
    -# or:
    -PaperTrail.insert(new_user_changeset, origin: "facebook_registration")

    - - - - Version originator relationships -

    -

    You can specify setter/originator relationship to paper_trail versions with originator assignment. This feature is only possible by specifying :originator keyword list for your application configuration:

    # In your config/config.exs
    -config :paper_trail, originator: [name: :user, model: YourApp.User]
    -# For most applications originator should be the user since models can be updated/created/deleted by several users.

    Note: You will need to recompile your deps after you have added the config for originator.

    Then originator name could be used for querying and preloading. Originator setting must be done via :originator or originator name that is defined in the paper_trail configuration:

    user = create_user()
    -# all these set originator_id's for the version records
    -PaperTrail.insert(changeset, originator: user)
    -{:ok, result} = PaperTrail.update(edit_changeset, originator: user)
    -# or you can use :user in the params instead of :originator if this is your config:
    -# config :paper_trail, originator: [name: :user, model: YourApplication.User]
    -{:ok, result} = PaperTrail.update(edit_changeset, user: user)
    -result[:version] |> Repo.preload(:user) |> Map.get(:user) # we can access the user who made the change from the version thanks to originator relationships!
    -PaperTrail.delete(edit_changeset, user: user)

    Also make sure you have the foreign-key constraint in the database and in your version migration file.

    - - - - Storing version meta data -

    -

    You might want to add some meta data that doesn't belong to originator and origin fields. Such data could be stored in one object named meta in paper_trail versions. Meta field could be passed as the second optional parameter to PaperTrail.insert/2, PaperTrail.update/2, PaperTrail.delete/2 functions:

    company = Company.changeset(%Company{}, %{name: "Acme Inc."})
    -  |> PaperTrail.insert(meta: %{slug: "acme-llc"})
    -
    -# You can also combine this with an origin:
    -edited_company = Company.changeset(company, %{name: "Acme LLC"})
    -  |> PaperTrail.update(origin: "documentation", meta: %{slug: "acme-llc"})
    -
    -# Or even with an originator:
    -user = create_user()
    -deleted_company = Company.changeset(edited_company, %{})
    -  |> PaperTrail.delete(origin: "worker:github", originator: user, meta: %{slug: "acme-llc", important: true})

    Strict mode

    This is a feature more suitable for larger applications. Models can keep their version references via foreign key constraints. Therefore it would be impossible to delete the first and current version of a model if the model exists in the database, it also makes querying easier and the whole design more relational database/SQL friendly. In order to enable strict mode:

    # In your config/config.exs
    -config :paper_trail, strict_mode: true

    Strict mode expects tracked models to have foreign-key reference to their first_version and current_version. These columns must be named first_version_id, and current_version_id in their respective model tables. A tracked model example with a migration file:

    # In the migration file: priv/repo/migrations/create_company.exs
    -defmodule Repo.Migrations.CreateCompany do
    -  def change do
    -    create table(:companies) do
    -      add :name,       :string, null: false
    -      add :founded_in, :date
    -
    -      # null constraints are highly suggested:
    -      add :first_version_id, references(:versions), null: false
    -      add :current_version_id, references(:versions), null: false
    -
    -      timestamps()
    -    end
    -
    -    create unique_index(:companies, [:first_version_id])
    -    create unique_index(:companies, [:current_version_id])
    -  end
    -end
    -
    -# In the model definition:
    -defmodule Company do
    -  use Ecto.Schema
    -
    -  import Ecto.Changeset
    -
    -  schema "companies" do
    -    field :name, :string
    -    field :founded_in, :date
    -
    -    belongs_to :first_version, PaperTrail.Version
    -    belongs_to :current_version, PaperTrail.Version, on_replace: :update # on_replace: is important!
    -
    -    timestamps()
    -  end
    -
    -  def changeset(struct, params \\ %{}) do
    -    struct
    -    |> cast(params, [:name, :founded_in])
    -  end
    -end

    When you run PaperTrail.insert/2 transaction, first_version_id and current_version_id automagically gets assigned for the model. Example:

    company = Company.changeset(%Company{}, %{name: "Acme LLC"}) |> PaperTrail.insert
    -# {:ok,
    -#  %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, "companies">,
    -#     name: "Acme LLC", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 21:42:38], first_version_id: 1, current_version_id: 1},
    -#    version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#      event: "insert", id: 1, inserted_at: ~N[2016-09-15 22:22:12],
    -#      item_changes: %{name: "Acme LLC", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38]},
    -#      originator_id: nil, origin: "unknown", meta: nil}}}

    When you PaperTrail.update/2 a model, current_version_id gets updated during the transaction:

    edited_company = Company.changeset(company, %{name: "Acme Inc."}) |> PaperTrail.update(origin: "documentation")
    -# {:ok,
    -#  %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, "companies">,
    -#     name: "Acme Inc.", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 23:22:12], first_version_id: 1, current_version_id: 2},
    -#    version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#      event: "update", id: 2, inserted_at: ~N[2016-09-15 23:22:12],
    -#      item_changes: %{name: "Acme Inc."}, originator_id: nil, origin: "documentation", meta: nil}}}

    Additionally, you can put a null constraint on origin column, you should always put an origin reference to describe who makes the change. This is important for big applications because a model can change from many sources.

    - - - - Bang(!) functions: -

    -

    PaperTrail also supports PaperTrail.insert!, PaperTrail.update!, PaperTrail.delete!. Naming of these functions intentionally match Repo.insert!, Repo.update!, Repo.delete! functions. If PaperTrail is on strict_mode these bang functions will update the version references of the model just like the normal PaperTrail operations.

    Bang functions assume the operation will always be successful, otherwise functions will raise Ecto.InvalidChangesetError just like Repo.insert!, Repo.update! and Repo.delete!:

    changeset = Post.changeset(%Post{}, %{
    -  title: "Word on the street is Elixir got its own database versioning library",
    -  content: "You should try it now!"
    -})
    -
    -inserted_post = PaperTrail.insert!(changeset)
    -# => on success:
    -# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
    -#   title: "Word on the street is Elixir got its own database versioning library",
    -#   content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#   updated_at: ~N[2016-09-15 21:42:38]
    -# }
    -#
    -# => on error raises: Ecto.InvalidChangesetError !!
    -
    -inserted_post_version = PaperTrail.get_version(inserted_post)
    -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "insert", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#   item_changes: %{title: "Word on the street is Elixir got its own database versioning library",
    -#     content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#     updated_at: ~N[2016-09-15 21:42:38]},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}
    -
    -edit_changeset = Post.changeset(inserted_post, %{
    -  title: "Elixir matures fast",
    -  content: "Future is already here, Elixir is the next step!"
    -})
    -
    -updated_post = PaperTrail.update!(edit_changeset)
    -# => on success:
    -# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
    -#   title: "Elixir matures fast", content: "Future is already here, you deserve to be awesome!",
    -#   id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#   updated_at: ~N[2016-09-15 22:00:59]}
    -#
    -# => on error raises: Ecto.InvalidChangesetError !!
    -
    -updated_post_version = PaperTrail.get_version(updated_post)
    -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59],
    -#   item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil
    -#   meta: nil}
    -
    -PaperTrail.delete!(updated_post)
    -# => on success:
    -# %Post{__meta__: #Ecto.Schema.Metadata<:deleted, "posts">,
    -#   title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!",
    -#   id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#   updated_at: ~N[2016-09-15 22:00:59]}
    -#
    -# => on error raises: Ecto.InvalidChangesetError !!
    -
    -PaperTrail.get_version(updated_post)
    -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12],
    -#   item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!",
    -#   id: 1, inserted_at: ~N[2016-09-15 21:42:38],
    -#   updated_at: ~N[2016-09-15 22:00:59]},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}
    -
    -Repo.aggregate(Post, :count, :id) # => 0
    -PaperTrail.Version.count() # => 3
    -# same as Repo.aggregate(PaperTrail.Version, :count, :id)
    -
    -PaperTrail.Version.last() # returns the last version in the db by inserted_at
    -#  %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">,
    -#   event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12],
    -#   item_changes: %{"title" => "Elixir matures fast", content: "Future is already here, Elixir is the next step!", "id" => 1,
    -#     "inserted_at" => "2016-09-15T21:42:38",
    -#     "updated_at" => "2016-09-15T22:00:59"},
    -#   item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}

    - - - - Working with multi tenancy -

    -

    Sometimes you have to deal with applications where you need multi tenancy capabilities, -and you want to keep tracking of the versions of your data on different schemas (PostgreSQL) -or databases (MySQL).

    You can use the Ecto.Query prefix -in order to switch between different schemas/databases for your own data, so -you can specify in your changeset where to store your record. Example:

    tenant = "tenant_id"
    -changeset = User.changeset(%User{}, %{first_name: "Izel", last_name: "Nakri"})
    -
    -changeset
    -|> Ecto.Queryable.to_query()
    -|> Map.put(:prefix, tenant)
    -|> Repo.insert()

    PaperTrail also allows you to store the Version entries generated by your activity in -different schemas/databases by using the value of the element :prefix on the options -of the functions. Example:

    tenant = "tenant_id"
    -
    -changeset =
    -  User.changeset(%User{}, %{first_name: "Izel", last_name: "Nakri"})
    -  |> Ecto.Queryable.to_query()
    -  |> Map.put(:prefix, tenant)
    -
    -PaperTrail.insert(changeset, [prefix: tenant])

    By doing this, you're storing the new User entry into the schema/database -specified by the :prefix value (tenant_id).

    Note that the User's changeset it's sent with the :prefix, so PaperTrail will take care of the -storage of the generated Version entry in the desired schema/database. Make sure -to add this prefix to your changeset before the execution of the PaperTrail function if you want to do versioning on a separate schema.

    PaperTrail can also get versions of records or models from different schemas/databases as well -by using the :prefix option. Example:

    tenant = "tenant_id"
    -id = 1
    -
    -PaperTrail.get_versions(User, id, [prefix: tenant])

    - - - - Version timestamps -

    -

    PaperTrail can be configured to use utc_datetime or utc_datetime_usec for Version timestamps.

    # In your config/config.exs
    -config :paper_trail, timestamps_type: :utc_datetime

    Note: You will need to recompile your deps after you have added the config for timestamps.

    - - - - Suggestions -

    -
    • PaperTrail.Version(s) order matter,
    • Don't delete your paper_trail versions, instead you can merge them
    • If you have a question or a problem, do not hesitate to create an issue or submit a pull request

    - - - - Contributing -

    -
    set -a
    -source .env
    -mix test --trace

    Credits

    Many thanks to:

    Additional thanks to:

    - - - - License -

    -

    This source code is licensed under the MIT license. Copyright (c) 2016-present Izel Nakri.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - - - -
    - - -

    Deletes a record from the database with a related version insertion in one transaction

    - -
    - -
    - - -

    Same as delete/2 but returns only the model struct or raises if the changeset is invalid.

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -

    Explicitly inserts a non-versioned already existing record into the Versions table

    - -
    - -
    - - -

    Inserts a record to the database with a related version insertion in one transaction

    - -
    - -
    - - -

    Same as insert/2 but returns only the model struct or raises if the changeset is invalid.

    - -
    - -
    - - -

    Upserts a record to the database with a related version insertion in one transaction.

    - -
    - -
    - - -

    Same as insert_or_update/2 but returns only the model struct or raises if the changeset is invalid.

    - -
    - - - - - -
    - - -

    Updates a record from the database with a related version insertion in one transaction

    - -
    - -
    - - -

    Same as update/2 but returns only the model struct or raises if the changeset is invalid.

    - -
    - -
    - -
    - - -
    -

    - - - - Functions -

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

    add_prefix(schema, prefix)

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

    See PaperTrail.Serializer.add_prefix/2.

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

    delete(model_or_changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec delete(
    -  model_or_changeset :: model | Ecto.Changeset.t(model),
    -  options :: Keyword.t()
    -) ::
    -  {:ok, %{model: model, version: PaperTrail.Version.t()}}
    -  | {:error, Ecto.Changeset.t(model) | term()}
    -when model: struct()
    - -
    - -

    Deletes a record from the database with a related version insertion in one transaction

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

    delete!(model_or_changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec delete!(
    -  model_or_changeset :: model | Ecto.Changeset.t(model),
    -  options :: Keyword.t()
    -) :: model
    -when model: struct()
    - -
    - -

    Same as delete/2 but returns only the model struct or raises if the changeset is invalid.

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

    get_current_model(version)

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

    See PaperTrail.VersionQueries.get_current_model/1.

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

    get_item_type(data)

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

    See PaperTrail.Serializer.get_item_type/1.

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

    get_model_id(model)

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

    See PaperTrail.Serializer.get_model_id/1.

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

    get_sequence_id(table_name)

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

    See PaperTrail.Serializer.get_sequence_id/1.

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

    get_version(record)

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

    See PaperTrail.VersionQueries.get_version/1.

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

    get_version(model_or_record, id_or_options)

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

    See PaperTrail.VersionQueries.get_version/2.

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

    get_version(model, id, options)

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

    See PaperTrail.VersionQueries.get_version/3.

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

    get_versions(record)

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

    See PaperTrail.VersionQueries.get_versions/1.

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

    get_versions(model_or_record, id_or_options)

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

    See PaperTrail.VersionQueries.get_versions/2.

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

    get_versions(model, id, options)

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

    See PaperTrail.VersionQueries.get_versions/3.

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

    has_version?(record)

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

    See PaperTrail.VersionQueries.has_version?/1.

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

    has_version?(model_or_record, id_or_options)

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

    See PaperTrail.VersionQueries.has_version?/2.

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

    has_version?(model, id, options)

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

    See PaperTrail.VersionQueries.has_version?/3.

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

    initialise(model, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, version_key: :version])

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

    Explicitly inserts a non-versioned already existing record into the Versions table

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

    insert(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec insert(
    -  changeset :: Ecto.Changeset.t(model),
    -  options :: Keyword.t()
    -) ::
    -  {:ok, %{model: model, version: PaperTrail.Version.t()}}
    -  | {:error, Ecto.Changeset.t(model) | term()}
    -when model: struct()
    - -
    - -

    Inserts a record to the database with a related version insertion in one transaction

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

    insert!(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec insert!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: model
    -when model: struct()
    - -
    - -

    Same as insert/2 but returns only the model struct or raises if the changeset is invalid.

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

    insert_or_update(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec insert_or_update(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) ::
    -  {:ok, %{model: model, version: PaperTrail.Version.t()}}
    -  | {:error, Ecto.Changeset.t(model) | term()}
    -when model: struct()
    - -
    - -

    Upserts a record to the database with a related version insertion in one transaction.

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

    insert_or_update!(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec insert_or_update!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) ::
    -  model
    -when model: struct()
    - -
    - -

    Same as insert_or_update/2 but returns only the model struct or raises if the changeset is invalid.

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

    make_version_struct(version, model, options)

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

    See PaperTrail.Serializer.make_version_struct/3.

    -
    -
    -
    - - - -
    - -

    See PaperTrail.Serializer.serialize/1.

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

    update(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec update(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) ::
    -  {:ok, %{model: model, version: PaperTrail.Version.t()}}
    -  | {:error, Ecto.Changeset.t(model) | term()}
    -when model: struct()
    - -
    - -

    Updates a record from the database with a related version insertion in one transaction

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

    update!(changeset, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])

    - - - - View Source - - - -
    - -
    - -
    - -
    @spec update!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: model
    -when model: struct()
    - -
    - -

    Same as update/2 but returns only the model struct or raises if the changeset is invalid.

    -
    -
    - -
    -
    - - -
    -
    -
    - - - diff --git a/Releaser.Git.html b/Releaser.Git.html index a2cc2d57d2..7e09b1aeeb 100644 --- a/Releaser.Git.html +++ b/Releaser.Git.html @@ -5,16 +5,16 @@ - + - Releaser.Git — Bonfire v0.9.10-classic-beta.156 + Releaser.Git — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -132,7 +132,7 @@

    Releaser.Git - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Releaser.Publish.html b/Releaser.Publish.html index d6f80a6001..7cf6fe4a43 100644 --- a/Releaser.Publish.html +++ b/Releaser.Publish.html @@ -5,16 +5,16 @@ - + - Releaser.Publish — Bonfire v0.9.10-classic-beta.156 + Releaser.Publish — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Releaser.Publish - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Releaser.Tests.html b/Releaser.Tests.html index c99c3d873a..6b94042308 100644 --- a/Releaser.Tests.html +++ b/Releaser.Tests.html @@ -5,16 +5,16 @@ - + - Releaser.Tests — Bonfire v0.9.10-classic-beta.156 + Releaser.Tests — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Releaser.Tests - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Releaser.VersionUtils.html b/Releaser.VersionUtils.html index f8d490b33d..1faa3efe8e 100644 --- a/Releaser.VersionUtils.html +++ b/Releaser.VersionUtils.html @@ -5,16 +5,16 @@ - + - Releaser.VersionUtils — Bonfire v0.9.10-classic-beta.156 + Releaser.VersionUtils — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Releaser.VersionUtils - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Untangle.Time.html b/Untangle.Time.html index 447f63931d..6d348bda89 100644 --- a/Untangle.Time.html +++ b/Untangle.Time.html @@ -5,16 +5,16 @@ - + - Untangle.Time — Bonfire v0.9.10-classic-beta.156 + Untangle.Time — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Untangle.Time - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Untangle.html b/Untangle.html index f9ac84fac2..d61d274907 100644 --- a/Untangle.html +++ b/Untangle.html @@ -5,16 +5,16 @@ - + - Untangle — Bonfire v0.9.10-classic-beta.156 + Untangle — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Untangle - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    @@ -146,13 +146,13 @@

    Untangle provides alternatives for IO.inspect and the macros in Elixir's Logger to output code location information. It also provides a polyfill for dbg which was introduce in Elixir 1.14

    screenshot

    The first argument is inspected and the second argument (if provided) is used as a label:

    > import Untangle
     Untangle
    -> debug(:no, "the answer is") # log at debug
    -11:19:09.915 [debug] [iex:2] the answer is: :no
    +> debug(:no, "the answer is") # log at debug
    +11:19:09.915 [debug] [iex:2] the answer is: :no
     :no
    -> dump(%{a: :map}, "it") # inspect something on stdout
    -[iex:3] it: %{a: :map}
    -%{a: :map}

    When used in a code file, the location information becomes more useful, e.g.:

    [lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []

    You may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:

    do_something()
    -|> debug("output of do_something/0")

    When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change warn or info for debug if you only need it during development :-)

    +> dump(%{a: :map}, "it") # inspect something on stdout +[iex:3] it: %{a: :map} +%{a: :map}

    When used in a code file, the location information becomes more useful, e.g.:

    [lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []

    You may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:

    do_something()
    +|> debug("output of do_something/0")

    When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change warn or info for debug if you only need it during development :-)

    @@ -160,19 +160,19 @@

    You can decorate functions to measure and log their execution time:

    use Untangle
     
    -@decorate time()
    -def fun(), do: :stuff

    will output something like [info] Time to run MyModule.fun/0: 1 ms

    +@decorate time() +def fun(), do: :stuff

    will output something like [info] Time to run MyModule.fun/0: 1 ms

    Installation

    If available in Hex, the package can be installed -by adding untangle to your list of dependencies in mix.exs:

    def deps do
    -  [
    -    {:untangle, "~> 0.3"}
    -  ]
    -end

    Configure as default dbg/2 handler

    +by adding untangle to your list of dependencies in mix.exs:

    def deps do
    +  [
    +    {:untangle, "~> 0.3"}
    +  ]
    +end

    Configure as default dbg/2 handler

    @@ -487,21 +487,21 @@

    error(thing, label \\ nil, opts \\ [])

    -

    Similar to dump, but for logging at error level, and returns an error tuple:

    • an error tuple with the label, if any
    • an error tuple with the passed value otherwise
    iex> error(:value)
    +

    Similar to dump, but for logging at error level, and returns an error tuple:

    • an error tuple with the label, if any
    • an error tuple with the passed value otherwise
    iex> error(:value)
     ### [error] :value
    -{:error, :value}
    +{:error, :value}
     
    -iex> error({:error, :value})
    +iex> error({:error, :value})
     ### [error] :value
    -{:error, :value}
    +{:error, :value}
     
    -iex> error(:value, "with label")
    +iex> error(:value, "with label")
     ### [error] with label: :value
    -{:error, "with label"}
    +{:error, "with label"}
     
    -iex> error({:error, :value}, "with label")
    +iex> error({:error, :value}, "with label")
     ### [error] with label: :value
    -{:error, "with label"}
    +
    {:error, "with label"}
    diff --git a/UserAuthLiveMount.html b/UserAuthLiveMount.html index 772199afc6..ed8f158d5f 100644 --- a/UserAuthLiveMount.html +++ b/UserAuthLiveMount.html @@ -5,16 +5,16 @@ - + - UserAuthLiveMount — Bonfire v0.9.10-classic-beta.156 + UserAuthLiveMount — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    UserAuthLiveMount - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Agent.Agents.html b/ValueFlows.Agent.Agents.html index 4df1d458d0..76fd6ae324 100644 --- a/ValueFlows.Agent.Agents.html +++ b/ValueFlows.Agent.Agents.html @@ -5,16 +5,16 @@ - + - ValueFlows.Agent.Agents — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Agent.Agents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Agent.Agents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Agent.Organizations.html b/ValueFlows.Agent.Organizations.html index 0b6bba7bfe..ad7c4533b2 100644 --- a/ValueFlows.Agent.Organizations.html +++ b/ValueFlows.Agent.Organizations.html @@ -5,16 +5,16 @@ - + - ValueFlows.Agent.Organizations — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Agent.Organizations — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Agent.Organizations - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Agent.People.html b/ValueFlows.Agent.People.html index 0a7cd21465..913a6696cd 100644 --- a/ValueFlows.Agent.People.html +++ b/ValueFlows.Agent.People.html @@ -5,16 +5,16 @@ - + - ValueFlows.Agent.People — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Agent.People — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Agent.People - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Agreement.html b/ValueFlows.Agreement.html index 73fc39eb80..875300de0b 100644 --- a/ValueFlows.Agreement.html +++ b/ValueFlows.Agreement.html @@ -5,16 +5,16 @@ - + - ValueFlows.Agreement — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Agreement — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Agreement - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.AllMigrations.html b/ValueFlows.AllMigrations.html index 1b0df0ed88..3d8352fe45 100644 --- a/ValueFlows.AllMigrations.html +++ b/ValueFlows.AllMigrations.html @@ -5,16 +5,16 @@ - + - ValueFlows.AllMigrations — Bonfire v0.9.10-classic-beta.156 + ValueFlows.AllMigrations — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.AllMigrations - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Claim.Claims.html b/ValueFlows.Claim.Claims.html index a3fb0f1652..db15fc08ec 100644 --- a/ValueFlows.Claim.Claims.html +++ b/ValueFlows.Claim.Claims.html @@ -5,16 +5,16 @@ - + - ValueFlows.Claim.Claims — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Claim.Claims — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Claim.Claims - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Claim.GraphQL.html b/ValueFlows.Claim.GraphQL.html index 4041de6b73..4273db37c6 100644 --- a/ValueFlows.Claim.GraphQL.html +++ b/ValueFlows.Claim.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Claim.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Claim.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Claim.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Claim.Queries.html b/ValueFlows.Claim.Queries.html index 108e6a9ccf..a48700aed9 100644 --- a/ValueFlows.Claim.Queries.html +++ b/ValueFlows.Claim.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Claim.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Claim.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Claim.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Claim.html b/ValueFlows.Claim.html index 6c6c5c0f16..7c2feb5be8 100644 --- a/ValueFlows.Claim.html +++ b/ValueFlows.Claim.html @@ -5,16 +5,16 @@ - + - ValueFlows.Claim — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Claim — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Claim - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.EconomicEvents.html b/ValueFlows.EconomicEvent.EconomicEvents.html index 60bf15b151..195c634c7b 100644 --- a/ValueFlows.EconomicEvent.EconomicEvents.html +++ b/ValueFlows.EconomicEvent.EconomicEvents.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.EconomicEvents — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.EconomicEvents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.EconomicEvents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.EventSideEffects.html b/ValueFlows.EconomicEvent.EventSideEffects.html index 4e5319d028..53f750c2bd 100644 --- a/ValueFlows.EconomicEvent.EventSideEffects.html +++ b/ValueFlows.EconomicEvent.EventSideEffects.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.EventSideEffects — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.EventSideEffects — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.EventSideEffects - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.GraphQL.html b/ValueFlows.EconomicEvent.GraphQL.html index 7426eec0ba..b3c36647fa 100644 --- a/ValueFlows.EconomicEvent.GraphQL.html +++ b/ValueFlows.EconomicEvent.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.LiveHandler.html b/ValueFlows.EconomicEvent.LiveHandler.html index c88b0294e3..0895fabe84 100644 --- a/ValueFlows.EconomicEvent.LiveHandler.html +++ b/ValueFlows.EconomicEvent.LiveHandler.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.LiveHandler — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.Queries.html b/ValueFlows.EconomicEvent.Queries.html index 016830bee7..844185ab1e 100644 --- a/ValueFlows.EconomicEvent.Queries.html +++ b/ValueFlows.EconomicEvent.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.Trace.html b/ValueFlows.EconomicEvent.Trace.html index 79be7b5a97..bcfd214f79 100644 --- a/ValueFlows.EconomicEvent.Trace.html +++ b/ValueFlows.EconomicEvent.Trace.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.Trace — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.Trace — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.Trace - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.Track.html b/ValueFlows.EconomicEvent.Track.html index 0b9d730bf0..108cdaa638 100644 --- a/ValueFlows.EconomicEvent.Track.html +++ b/ValueFlows.EconomicEvent.Track.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent.Track — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent.Track — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent.Track - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicEvent.html b/ValueFlows.EconomicEvent.html index 6b72dcbadf..96642b4108 100644 --- a/ValueFlows.EconomicEvent.html +++ b/ValueFlows.EconomicEvent.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicEvent — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicEvent — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicEvent - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicResource.EconomicResources.html b/ValueFlows.EconomicResource.EconomicResources.html index c558f89c7c..6f3c2ab0a9 100644 --- a/ValueFlows.EconomicResource.EconomicResources.html +++ b/ValueFlows.EconomicResource.EconomicResources.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicResource.EconomicResources — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicResource.EconomicResources — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicResource.EconomicResources - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicResource.LiveHandler.html b/ValueFlows.EconomicResource.LiveHandler.html index ba2125337d..ea2ee30880 100644 --- a/ValueFlows.EconomicResource.LiveHandler.html +++ b/ValueFlows.EconomicResource.LiveHandler.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicResource.LiveHandler — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicResource.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicResource.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicResource.Queries.html b/ValueFlows.EconomicResource.Queries.html index bd3f7ce0b0..51bbd6e2e1 100644 --- a/ValueFlows.EconomicResource.Queries.html +++ b/ValueFlows.EconomicResource.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicResource.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicResource.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicResource.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.EconomicResource.html b/ValueFlows.EconomicResource.html index 8aeadfca86..32da720d56 100644 --- a/ValueFlows.EconomicResource.html +++ b/ValueFlows.EconomicResource.html @@ -5,16 +5,16 @@ - + - ValueFlows.EconomicResource — Bonfire v0.9.10-classic-beta.156 + ValueFlows.EconomicResource — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.EconomicResource - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.Action.Actions.html b/ValueFlows.Knowledge.Action.Actions.html index 1d8b5fad59..4a6dcc2713 100644 --- a/ValueFlows.Knowledge.Action.Actions.html +++ b/ValueFlows.Knowledge.Action.Actions.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.Action.Actions — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.Action.Actions — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.Action.Actions - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.Action.html b/ValueFlows.Knowledge.Action.html index 616d86669b..d3e3230075 100644 --- a/ValueFlows.Knowledge.Action.html +++ b/ValueFlows.Knowledge.Action.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.Action — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.Action — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.Action - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ProcessSpecification.GraphQL.html b/ValueFlows.Knowledge.ProcessSpecification.GraphQL.html index 7708a8e979..5f8fcbea6a 100644 --- a/ValueFlows.Knowledge.ProcessSpecification.GraphQL.html +++ b/ValueFlows.Knowledge.ProcessSpecification.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ProcessSpecification.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ProcessSpecification.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ProcessSpecification.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html b/ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html index 491e3cebbe..788ea51bc4 100644 --- a/ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html +++ b/ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ProcessSpecification.Queries.html b/ValueFlows.Knowledge.ProcessSpecification.Queries.html index c3a24a62ae..b7cae6915d 100644 --- a/ValueFlows.Knowledge.ProcessSpecification.Queries.html +++ b/ValueFlows.Knowledge.ProcessSpecification.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ProcessSpecification.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ProcessSpecification.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ProcessSpecification.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ProcessSpecification.html b/ValueFlows.Knowledge.ProcessSpecification.html index 15115bad70..7a7874c6a1 100644 --- a/ValueFlows.Knowledge.ProcessSpecification.html +++ b/ValueFlows.Knowledge.ProcessSpecification.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ProcessSpecification — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ProcessSpecification — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ProcessSpecification - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ResourceSpecification.GraphQL.html b/ValueFlows.Knowledge.ResourceSpecification.GraphQL.html index e55591b14d..40f861a191 100644 --- a/ValueFlows.Knowledge.ResourceSpecification.GraphQL.html +++ b/ValueFlows.Knowledge.ResourceSpecification.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ResourceSpecification.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ResourceSpecification.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ResourceSpecification.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html b/ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html index 8606e06250..a2613cb1d2 100644 --- a/ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html +++ b/ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ResourceSpecification.LiveHandler — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ResourceSpecification.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ResourceSpecification.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ResourceSpecification.Queries.html b/ValueFlows.Knowledge.ResourceSpecification.Queries.html index 8a8cd46f3a..622a27ac0e 100644 --- a/ValueFlows.Knowledge.ResourceSpecification.Queries.html +++ b/ValueFlows.Knowledge.ResourceSpecification.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ResourceSpecification.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ResourceSpecification.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ResourceSpecification.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html b/ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html index 8008ed473c..91743cac6a 100644 --- a/ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html +++ b/ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Knowledge.ResourceSpecification.html b/ValueFlows.Knowledge.ResourceSpecification.html index 40f1e0ee4e..d1aa0155db 100644 --- a/ValueFlows.Knowledge.ResourceSpecification.html +++ b/ValueFlows.Knowledge.ResourceSpecification.html @@ -5,16 +5,16 @@ - + - ValueFlows.Knowledge.ResourceSpecification — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Knowledge.ResourceSpecification — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Knowledge.ResourceSpecification - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Classifications.html b/ValueFlows.Observe.Classifications.html index 6a160ed26c..1c8fd57658 100644 --- a/ValueFlows.Observe.Classifications.html +++ b/ValueFlows.Observe.Classifications.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Classifications — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Classifications — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Classifications - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Hydration.html b/ValueFlows.Observe.Hydration.html index 2ff13ea6a6..635b1a74c1 100644 --- a/ValueFlows.Observe.Hydration.html +++ b/ValueFlows.Observe.Hydration.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Hydration — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Hydration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Hydration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Integration.html b/ValueFlows.Observe.Integration.html index 240e962a58..638c628d3c 100644 --- a/ValueFlows.Observe.Integration.html +++ b/ValueFlows.Observe.Integration.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Integration — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Integration — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Integration - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.ObservablePhenomenons.html b/ValueFlows.Observe.ObservablePhenomenons.html index fb241e3248..4fd8a512da 100644 --- a/ValueFlows.Observe.ObservablePhenomenons.html +++ b/ValueFlows.Observe.ObservablePhenomenons.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.ObservablePhenomenons — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.ObservablePhenomenons — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.ObservablePhenomenons - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.ObservablePhenomenonsGraphQL.html b/ValueFlows.Observe.ObservablePhenomenonsGraphQL.html index adc567d5b7..283f40833b 100644 --- a/ValueFlows.Observe.ObservablePhenomenonsGraphQL.html +++ b/ValueFlows.Observe.ObservablePhenomenonsGraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.ObservablePhenomenonsGraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.ObservablePhenomenonsGraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.ObservablePhenomenonsGraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.ObservableProperties.html b/ValueFlows.Observe.ObservableProperties.html index c354523cac..e18f1766d9 100644 --- a/ValueFlows.Observe.ObservableProperties.html +++ b/ValueFlows.Observe.ObservableProperties.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.ObservableProperties — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.ObservableProperties — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.ObservableProperties - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.ObservablePropertiesGraphQL.html b/ValueFlows.Observe.ObservablePropertiesGraphQL.html index 877abdd8e7..3aa9a79181 100644 --- a/ValueFlows.Observe.ObservablePropertiesGraphQL.html +++ b/ValueFlows.Observe.ObservablePropertiesGraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.ObservablePropertiesGraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.ObservablePropertiesGraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.ObservablePropertiesGraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Observation.Queries.html b/ValueFlows.Observe.Observation.Queries.html index 7a335dbe0f..350e387203 100644 --- a/ValueFlows.Observe.Observation.Queries.html +++ b/ValueFlows.Observe.Observation.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Observation.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Observation.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Observation.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Observation.html b/ValueFlows.Observe.Observation.html index 34e70a0a83..01283f5783 100644 --- a/ValueFlows.Observe.Observation.html +++ b/ValueFlows.Observe.Observation.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Observation — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Observation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Observation - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Observations.ObservationsResolvers.html b/ValueFlows.Observe.Observations.ObservationsResolvers.html index 0c91e961fe..19558aa3ab 100644 --- a/ValueFlows.Observe.Observations.ObservationsResolvers.html +++ b/ValueFlows.Observe.Observations.ObservationsResolvers.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Observations.ObservationsResolvers — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Observations.ObservationsResolvers — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Observations.ObservationsResolvers - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Observations.html b/ValueFlows.Observe.Observations.html index dd28bcb410..02b24e23aa 100644 --- a/ValueFlows.Observe.Observations.html +++ b/ValueFlows.Observe.Observations.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Observations — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Observations — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Observations - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Seeds.html b/ValueFlows.Observe.Seeds.html index b5f3921c47..eb029d3ff9 100644 --- a/ValueFlows.Observe.Seeds.html +++ b/ValueFlows.Observe.Seeds.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Seeds — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Seeds — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Seeds - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Observe.Simulate.html b/ValueFlows.Observe.Simulate.html index 5abd8f2cf7..237058562c 100644 --- a/ValueFlows.Observe.Simulate.html +++ b/ValueFlows.Observe.Simulate.html @@ -5,16 +5,16 @@ - + - ValueFlows.Observe.Simulate — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Observe.Simulate — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Observe.Simulate - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Commitment.Commitments.html b/ValueFlows.Planning.Commitment.Commitments.html index 16e7a995d0..118a7f41f6 100644 --- a/ValueFlows.Planning.Commitment.Commitments.html +++ b/ValueFlows.Planning.Commitment.Commitments.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Commitment.Commitments — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Commitment.Commitments — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Commitment.Commitments - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Commitment.GraphQL.html b/ValueFlows.Planning.Commitment.GraphQL.html index d9c50ff2a2..0de402578b 100644 --- a/ValueFlows.Planning.Commitment.GraphQL.html +++ b/ValueFlows.Planning.Commitment.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Commitment.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Commitment.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Commitment.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Commitment.Queries.html b/ValueFlows.Planning.Commitment.Queries.html index 87e2c7023d..b4afcff662 100644 --- a/ValueFlows.Planning.Commitment.Queries.html +++ b/ValueFlows.Planning.Commitment.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Commitment.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Commitment.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Commitment.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Commitment.html b/ValueFlows.Planning.Commitment.html index 3b99895652..af1c74332c 100644 --- a/ValueFlows.Planning.Commitment.html +++ b/ValueFlows.Planning.Commitment.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Commitment — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Commitment — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Commitment - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    @@ -418,9 +418,9 @@

    create_changeset(creator, attrs)

    @spec create_changeset(
       struct(),
       attrs()
    -) :: Ecto.Changeset.t()
    +) :: Ecto.Changeset.t()
    -
    @spec create_changeset(t(), attrs()) :: Ecto.Changeset.t()
    +
    @spec create_changeset(t(), attrs()) :: Ecto.Changeset.t()
    diff --git a/ValueFlows.Planning.Intent.GraphQL.html b/ValueFlows.Planning.Intent.GraphQL.html index ac8bcefc52..31bb69fb53 100644 --- a/ValueFlows.Planning.Intent.GraphQL.html +++ b/ValueFlows.Planning.Intent.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Intent.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Intent.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Intent.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Intent.Intents.html b/ValueFlows.Planning.Intent.Intents.html index 427eb79117..042f802b21 100644 --- a/ValueFlows.Planning.Intent.Intents.html +++ b/ValueFlows.Planning.Intent.Intents.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Intent.Intents — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Intent.Intents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Intent.Intents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Intent.LiveHandler.html b/ValueFlows.Planning.Intent.LiveHandler.html index 94d4d51df5..0f42857a03 100644 --- a/ValueFlows.Planning.Intent.LiveHandler.html +++ b/ValueFlows.Planning.Intent.LiveHandler.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Intent.LiveHandler — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Intent.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Intent.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Intent.Queries.html b/ValueFlows.Planning.Intent.Queries.html index 89dd9f0297..6df4175a99 100644 --- a/ValueFlows.Planning.Intent.Queries.html +++ b/ValueFlows.Planning.Intent.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Intent.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Intent.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Intent.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Intent.html b/ValueFlows.Planning.Intent.html index c23f4af601..5e9b9d870b 100644 --- a/ValueFlows.Planning.Intent.html +++ b/ValueFlows.Planning.Intent.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Intent — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Intent — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Intent - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Satisfaction.GraphQL.html b/ValueFlows.Planning.Satisfaction.GraphQL.html index d9b026aa28..cd365429ed 100644 --- a/ValueFlows.Planning.Satisfaction.GraphQL.html +++ b/ValueFlows.Planning.Satisfaction.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Satisfaction.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Satisfaction.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Satisfaction.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Satisfaction.Queries.html b/ValueFlows.Planning.Satisfaction.Queries.html index b8f5bd4dc7..f6f115598f 100644 --- a/ValueFlows.Planning.Satisfaction.Queries.html +++ b/ValueFlows.Planning.Satisfaction.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Satisfaction.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Satisfaction.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Satisfaction.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Planning.Satisfaction.Satisfactions.html b/ValueFlows.Planning.Satisfaction.Satisfactions.html index 6fb2ed278f..7a371f64b0 100644 --- a/ValueFlows.Planning.Satisfaction.Satisfactions.html +++ b/ValueFlows.Planning.Satisfaction.Satisfactions.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Satisfaction.Satisfactions — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Satisfaction.Satisfactions — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Satisfaction.Satisfactions - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    @@ -268,7 +268,7 @@

    create(creator, attrs)

    @spec create(
       struct(),
       attrs()
    -) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    +) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    @@ -367,12 +367,12 @@

    soft_delete(id, user)

    @spec soft_delete(
       struct(),
       String.t()
    -) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    +) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    @spec soft_delete(
       struct(),
       ValueFlows.Planning.Satisfaction.t()
    -) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    +) :: {:ok, ValueFlows.Planning.Satisfaction.t()} | {:error, Ecto.Changeset.t()}
    diff --git a/ValueFlows.Planning.Satisfaction.html b/ValueFlows.Planning.Satisfaction.html index 8cd09f5499..1a470bbc66 100644 --- a/ValueFlows.Planning.Satisfaction.html +++ b/ValueFlows.Planning.Satisfaction.html @@ -5,16 +5,16 @@ - + - ValueFlows.Planning.Satisfaction — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Planning.Satisfaction — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Planning.Satisfaction - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    @@ -397,7 +397,7 @@

    create_changeset(creator, attrs)

    @spec create_changeset(
       struct(),
       attrs()
    -) :: Ecto.Changeset.t()
    +) :: Ecto.Changeset.t()
    @@ -559,7 +559,7 @@

    update_changeset(satis, attrs)

    -
    @spec update_changeset(t(), attrs()) :: Ecto.Changeset.t()
    +
    @spec update_changeset(t(), attrs()) :: Ecto.Changeset.t()
    diff --git a/ValueFlows.Process.LiveHandler.html b/ValueFlows.Process.LiveHandler.html index 2d03cf79f3..f19a1c7033 100644 --- a/ValueFlows.Process.LiveHandler.html +++ b/ValueFlows.Process.LiveHandler.html @@ -5,16 +5,16 @@ - + - ValueFlows.Process.LiveHandler — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Process.LiveHandler — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Process.LiveHandler - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Process.Processes.html b/ValueFlows.Process.Processes.html index 911a833c36..336ccdc393 100644 --- a/ValueFlows.Process.Processes.html +++ b/ValueFlows.Process.Processes.html @@ -5,16 +5,16 @@ - + - ValueFlows.Process.Processes — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Process.Processes — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Process.Processes - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Process.Queries.html b/ValueFlows.Process.Queries.html index 6902104a31..2baaa07f02 100644 --- a/ValueFlows.Process.Queries.html +++ b/ValueFlows.Process.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Process.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Process.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Process.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Process.html b/ValueFlows.Process.html index b1788ac6d6..d11e681904 100644 --- a/ValueFlows.Process.html +++ b/ValueFlows.Process.html @@ -5,16 +5,16 @@ - + - ValueFlows.Process — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Process — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Process - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.GraphQL.html b/ValueFlows.Proposal.GraphQL.html index d46dc814ca..94ff31ed84 100644 --- a/ValueFlows.Proposal.GraphQL.html +++ b/ValueFlows.Proposal.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.Proposals.html b/ValueFlows.Proposal.Proposals.html index 627a10563f..8433e2d66d 100644 --- a/ValueFlows.Proposal.Proposals.html +++ b/ValueFlows.Proposal.Proposals.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.Proposals — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.Proposals — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.Proposals - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedIntent.html b/ValueFlows.Proposal.ProposedIntent.html index 00f74ed5e6..43106cb612 100644 --- a/ValueFlows.Proposal.ProposedIntent.html +++ b/ValueFlows.Proposal.ProposedIntent.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedIntent — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedIntent — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedIntent - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedIntentQueries.html b/ValueFlows.Proposal.ProposedIntentQueries.html index 202c307fa3..71ba9cc9f2 100644 --- a/ValueFlows.Proposal.ProposedIntentQueries.html +++ b/ValueFlows.Proposal.ProposedIntentQueries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedIntentQueries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedIntentQueries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedIntentQueries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedIntents.html b/ValueFlows.Proposal.ProposedIntents.html index 951bd8a602..9e435a9c44 100644 --- a/ValueFlows.Proposal.ProposedIntents.html +++ b/ValueFlows.Proposal.ProposedIntents.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedIntents — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedIntents — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedIntents - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedTo.html b/ValueFlows.Proposal.ProposedTo.html index db794ddbb7..b5fe1c7f0c 100644 --- a/ValueFlows.Proposal.ProposedTo.html +++ b/ValueFlows.Proposal.ProposedTo.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedTo — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedTo — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedTo - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedToQueries.html b/ValueFlows.Proposal.ProposedToQueries.html index 3cfe9116c4..e3aa81b8ba 100644 --- a/ValueFlows.Proposal.ProposedToQueries.html +++ b/ValueFlows.Proposal.ProposedToQueries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedToQueries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedToQueries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedToQueries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.ProposedTos.html b/ValueFlows.Proposal.ProposedTos.html index a4dc162be4..41a03c43da 100644 --- a/ValueFlows.Proposal.ProposedTos.html +++ b/ValueFlows.Proposal.ProposedTos.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.ProposedTos — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.ProposedTos — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.ProposedTos - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.Queries.html b/ValueFlows.Proposal.Queries.html index 72b7a301a1..3e8e08a061 100644 --- a/ValueFlows.Proposal.Queries.html +++ b/ValueFlows.Proposal.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Proposal.html b/ValueFlows.Proposal.html index cd945ce66a..4c283aecd9 100644 --- a/ValueFlows.Proposal.html +++ b/ValueFlows.Proposal.html @@ -5,16 +5,16 @@ - + - ValueFlows.Proposal — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Proposal — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Proposal - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Util.Federation.html b/ValueFlows.Util.Federation.html index 91b01a06f1..30b783595c 100644 --- a/ValueFlows.Util.Federation.html +++ b/ValueFlows.Util.Federation.html @@ -5,16 +5,16 @@ - + - ValueFlows.Util.Federation — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Util.Federation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Util.Federation - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.Util.html b/ValueFlows.Util.html index 4fcaf2279e..0f4b56709f 100644 --- a/ValueFlows.Util.html +++ b/ValueFlows.Util.html @@ -5,16 +5,16 @@ - + - ValueFlows.Util — Bonfire v0.9.10-classic-beta.156 + ValueFlows.Util — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.Util - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.ValueCalculation.GraphQL.html b/ValueFlows.ValueCalculation.GraphQL.html index 26e1979361..9353fdbb2a 100644 --- a/ValueFlows.ValueCalculation.GraphQL.html +++ b/ValueFlows.ValueCalculation.GraphQL.html @@ -5,16 +5,16 @@ - + - ValueFlows.ValueCalculation.GraphQL — Bonfire v0.9.10-classic-beta.156 + ValueFlows.ValueCalculation.GraphQL — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.ValueCalculation.GraphQL - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.ValueCalculation.Queries.html b/ValueFlows.ValueCalculation.Queries.html index 3283c1f11d..eea810e0ad 100644 --- a/ValueFlows.ValueCalculation.Queries.html +++ b/ValueFlows.ValueCalculation.Queries.html @@ -5,16 +5,16 @@ - + - ValueFlows.ValueCalculation.Queries — Bonfire v0.9.10-classic-beta.156 + ValueFlows.ValueCalculation.Queries — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.ValueCalculation.Queries - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.ValueCalculation.ValueCalculations.html b/ValueFlows.ValueCalculation.ValueCalculations.html index 56046cd426..05df67746a 100644 --- a/ValueFlows.ValueCalculation.ValueCalculations.html +++ b/ValueFlows.ValueCalculation.ValueCalculations.html @@ -5,16 +5,16 @@ - + - ValueFlows.ValueCalculation.ValueCalculations — Bonfire v0.9.10-classic-beta.156 + ValueFlows.ValueCalculation.ValueCalculations — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.ValueCalculation.ValueCalculations - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.ValueCalculation.html b/ValueFlows.ValueCalculation.html index 8eb04f8251..51fa34d640 100644 --- a/ValueFlows.ValueCalculation.html +++ b/ValueFlows.ValueCalculation.html @@ -5,16 +5,16 @@ - + - ValueFlows.ValueCalculation — Bonfire v0.9.10-classic-beta.156 + ValueFlows.ValueCalculation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows.ValueCalculation - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/ValueFlows.html b/ValueFlows.html index ffb01883d7..243a4b4822 100644 --- a/ValueFlows.html +++ b/ValueFlows.html @@ -5,16 +5,16 @@ - + - ValueFlows — Bonfire v0.9.10-classic-beta.156 + ValueFlows — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    ValueFlows - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    diff --git a/Voodoo.html b/Voodoo.html index 6cc68c4b5d..d5a96df4ec 100644 --- a/Voodoo.html +++ b/Voodoo.html @@ -5,16 +5,16 @@ - + - Voodoo — Bonfire v0.9.10-classic-beta.156 + Voodoo — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    Voodoo - (Bonfire v0.9.10-classic-beta.156) + (Bonfire v0.9.10-classic-beta.160)

    @@ -212,14 +212,14 @@

    def_reverse_router(name, opts)

    Generates a reverse router function with the given name based upon a compiled(!) phoenix router module.

    Must be used outside of the router module, or else the router won't -be compiled yet and we won't be able to look up the routes.

    Generated function wraps the existing phoenix helpers.

    defmodule MyAppWeb.Router do
    +be compiled yet and we won't be able to look up the routes.

    Generated function wraps the existing phoenix helpers.

    defmodule MyAppWeb.Router do
       use MyAppWeb, :router
       # ...
    -end
    -defmodule MyAppWeb.Router.Reverse do
    -  import Voodoo, only: [def_reverse_router: 2]
    +end
    +defmodule MyAppWeb.Router.Reverse do
    +  import Voodoo, only: [def_reverse_router: 2]
       def_reverse_router :path, for: MyAppWeb.Router
    -end
    +
    end
    diff --git a/add-a-new-widget.html b/add-a-new-widget.html index 0a384d709f..887e31cb9c 100644 --- a/add-a-new-widget.html +++ b/add-a-new-widget.html @@ -5,16 +5,16 @@ - + - Add a new widget — Bonfire v0.9.10-classic-beta.156 + Add a new widget — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,26 +141,26 @@

    Let’s code!

    -

    The first step is to identify the most appropriate extension for this widget. In this case, we can include the widget in the bonfire_geolocate extension, which already handles all the necessary logic for dealing with geolocations.

    Widgets are typically included in lib/web/components/widgets. Bonfire uses Surface on the frontend, so we'll create two files:

    • widget_forecast_live.ex
    • widget_forecast_live.sface

    This forecast widget is a stateless component, meaning it won't handle any internal state. Therefore, the widget_forecast_live.ex code will be quite basic:

    defmodule Bonfire.Geolocate.WidgetForecastLive do
    +

    The first step is to identify the most appropriate extension for this widget. In this case, we can include the widget in the bonfire_geolocate extension, which already handles all the necessary logic for dealing with geolocations.

    Widgets are typically included in lib/web/components/widgets. Bonfire uses Surface on the frontend, so we'll create two files:

    • widget_forecast_live.ex
    • widget_forecast_live.sface

    This forecast widget is a stateless component, meaning it won't handle any internal state. Therefore, the widget_forecast_live.ex code will be quite basic:

    defmodule Bonfire.Geolocate.WidgetForecastLive do
       use Bonfire.UI.Common.Web, :stateless_component
     
       prop location, :string, default: nil
    -end
    -

    We use :stateless_component, a function that wraps the Surface.Component and includes a list of helpers widely used across most components.

    Since we want to include the widget on the user profile, we can gather the location data from there, so we define the location prop.

    Widgets are wrapped in a WidgetBlockLive component that takes care of injecting a style and the basic prop as the title. The initial implementation of our widget_forecast_live.sface looks like this:

    <Bonfire.UI.Common.WidgetBlockLive widget_title={e(@location, "")}>
    +end
    +

    We use :stateless_component, a function that wraps the Surface.Component and includes a list of helpers widely used across most components.

    Since we want to include the widget on the user profile, we can gather the location data from there, so we define the location prop.

    Widgets are wrapped in a WidgetBlockLive component that takes care of injecting a style and the basic prop as the title. The initial implementation of our widget_forecast_live.sface looks like this:

    <Bonfire.UI.Common.WidgetBlockLive widget_title={e(@location, "")}>
       hello world
     </Bonfire.UI.Common.WidgetBlockLive>
    -

    To see our widget, we need to include it in a page. Widgets are included in our right sidebar and are defined within a prop called sidebar_widgets, which is a list that includes guest and user lists (respectively, the widgets to show when the user is visiting a page while not logged in or when the user is logged in).

    We'll include our widget in the logged list, specifying it is in the secondary widget section. The final look of our sidebar_widget prop looks like this:

    sidebar_widgets = [
    -  users: [
    -    secondary: [
    -      Bonfire.Geolocate.WidgetForecastLive, [location: "Naples, Italy"]
    -    ]
    -  ]
    -]
    -

    We'll include our widget in the user profile page, located in the Bonfire.UI.Me extension, a library that deals with all the views related to user profiles and settings.

    The Bonfire.UI.Me.ProfileLive mount function looks like:

      def mount(_params, _session, socket) do
    -    {:ok,
    +

    To see our widget, we need to include it in a page. Widgets are included in our right sidebar and are defined within a prop called sidebar_widgets, which is a list that includes guest and user lists (respectively, the widgets to show when the user is visiting a page while not logged in or when the user is logged in).

    We'll include our widget in the logged list, specifying it is in the secondary widget section. The final look of our sidebar_widget prop looks like this:

    sidebar_widgets = [
    +  users: [
    +    secondary: [
    +      Bonfire.Geolocate.WidgetForecastLive, [location: "Naples, Italy"]
    +    ]
    +  ]
    +]
    +

    We'll include our widget in the user profile page, located in the Bonfire.UI.Me extension, a library that deals with all the views related to user profiles and settings.

    The Bonfire.UI.Me.ProfileLive mount function looks like:

      def mount(_params, _session, socket) do
    +    {:ok,
          socket
    -     |> assign(LiveHandler.default_assigns(is_nil(current_user_id(socket.assigns))))}
    -  end
    +     |> assign(LiveHandler.default_assigns(is_nil(current_user_id(assigns(socket)))))}
    +  end
     

    The default_assigns function includes data needed for dealing with multiple kinds of interactions and permissions. It also fetches the user from the database and ensures all the data is loaded correctly. The location data is fetched in profiles_live_handler.ex:95, and the widget is included in profiles_live_handler.ex:274.

    @@ -170,39 +170,39 @@

    To ensure the user can decide whether they want to include the widget when visiting any user page, we're creating a new setting that optionally shows the widget based on user input.

    In profiles_live_handler.ex:274, the widget is preceded by weather_widget_enabled, a boolean that controls whether the widget should be displayed or not. It makes use of the Settings.get function. You can learn more about defining and returning settings in our Add an Extension Settings section.

    We're adding the settings in the edit_profile_info_live.sface component (we may later refactor this to add the setting in the defined extension, but this is still a work in progress):

    <form data-scope="set-weather" phx-change="Bonfire.Common.Settings:set">
         <Bonfire.UI.Common.SettingsToggleLive
           name="Weather"
    -      description={l("Show the Weather widget on user profile")}
    -      keys={[Bonfire.Geolocate, :weather]}
    -      scope={:user}
    +      description={l("Show the Weather widget on user profile")}
    +      keys={[Bonfire.Geolocate, :weather]}
    +      scope={:user}
         />
       </form>
     

    At this point, we should be able to see our basic weather widget on our profile page and decide to switch it on and off.

    What remains is to include the logic for returning and displaying the weather. We will use the Forecastr library, which is already used in our application and added in the bonfire extension.

    The Forecastr library makes use of the Pirate Weather service, so we need a Pirate Weather API KEY. You can generate one on pirateweather.net and add it at the bottom of your .env file:

    PIRATE_WEATHER_API=***********************
    -

    The final component code looks like:

    {#if e(@location, nil)}
    -  <Bonfire.UI.Common.WidgetBlockLive widget_title={e(@location, "")}>
    -    {#case Forecastr.forecast(:today, e(@location, nil),
    +

    The final component code looks like:

    {#if e(@location, nil)}
    +  <Bonfire.UI.Common.WidgetBlockLive widget_title={e(@location, "")}>
    +    {#case Forecastr.forecast(:today, e(@location, nil),
             units: :metric,
             renderer: Forecastr.Renderer.JSON
    -      )}
    -      {#match {:ok,
    -           %{
    +      )}
    +      {#match {:ok,
    +           %{
                  "description" => weather,
                  "id" => weather_id,
                  "temp" => temp,
                  "name" => weather_location
    -           }}}
    +           }}}
             <div
               class="flex items-center gap-3"
    -          title={l("%{weather} in %{location}", weather: weather, location: weather_location)}
    +          title={l("%{weather} in %{location}", weather: weather, location: weather_location)}
             >
    -          <Iconify.iconify icon={"meteocons:#{weather_id}"} class="w-16 h-16" />
    +          <Iconify.iconify icon={"meteocons:#{weather_id}"} class="w-16 h-16" />
               <div class="flex flex-col">
    -            <span class="text-xl text-base-content/90">{temp}°</span>
    -            <span class="text-sm text-base-content/70">{weather}</span>
    +            <span class="text-xl text-base-content/90">{temp}°</span>
    +            <span class="text-sm text-base-content/70">{weather}</span>
               </div>
             </div>
    -      {#match _}
    -    {/case}
    +      {#match _}
    +    {/case}
       </Bonfire.UI.Common.WidgetBlockLive>
    -{/if}
    +{/if}
     

    diff --git a/add-a-page-to-the-sidebar.html b/add-a-page-to-the-sidebar.html index bbe9d98dc5..0d100f0de7 100644 --- a/add-a-page-to-the-sidebar.html +++ b/add-a-page-to-the-sidebar.html @@ -5,16 +5,16 @@ - + - Bonfire Navigation Sidebar — Bonfire v0.9.10-classic-beta.156 + Bonfire Navigation Sidebar — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -153,46 +153,46 @@

    Creating a New Navigation Menu

    -

    To create a new menu for your extension:

    1. Use the declare_extension macro in one of your extension views (typically the extension homepage).
    2. Configure your extension with options like name, icon, description, and navigation menu.
    declare_extension("Your Extension Name",
    +

    To create a new menu for your extension:

    1. Use the declare_extension macro in one of your extension views (typically the extension homepage).
    2. Configure your extension with options like name, icon, description, and navigation menu.
    declare_extension("Your Extension Name",
       icon: "🎆",
       description: "A short description to display in the extension settings",
    -  default_nav: [
    +  default_nav: [
         ExtensionName.Path.YourPageLive,
         ExtensionName.Path.AnotherPageLive,
         # Add more pages as needed
    -  ]
    -)
    1. For each page in default_nav, use the declare_nav_link macro to define link properties:
    declare_nav_link(l("Your Page"),
    +  ]
    +)
    1. For each page in default_nav, use the declare_nav_link macro to define link properties:
    declare_nav_link(l("Your Page"),
       page: "your_page",
       href: "/your_page",
       icon: "ph:search",
       icon_active: "ph:search-fill"
    -)

    +)

    Using the Default Navigation Menu

    -

    To use the default navigation menu instead of your extension's menu:

    1. In each view's mount function, set the nav_items property:
    def mount(params, session, socket) do
    -  {:ok,
    +

    To use the default navigation menu instead of your extension's menu:

    1. In each view's mount function, set the nav_items property:
    def mount(params, session, socket) do
    +  {:ok,
        socket
    -   |> assign(
    -      nav_items: Bonfire.Common.ExtensionModule.default_nav()
    -    )
    -  }
    -end

    + |> assign( + nav_items: Bonfire.Common.ExtensionModule.default_nav() + ) + } +end

    Overriding Default Navigation with a Custom Menu

    -

    To override the default navigation for specific pages:

    1. Create a custom navigation menu component.
    2. Use the declare_nav_component("sidebar description") macro on the custom menu.
    3. In each view's mount function, set the nav_items property:
    def mount(params, session, socket) do
    -  {:ok,
    +

    To override the default navigation for specific pages:

    1. Create a custom navigation menu component.
    2. Use the declare_nav_component("sidebar description") macro on the custom menu.
    3. In each view's mount function, set the nav_items property:
    def mount(params, session, socket) do
    +  {:ok,
        socket
    -   |> assign(
    -      nav_items: [ExtensionName.Path.YourPageLive.declared_nav()]
    -    )
    -  }
    -end
    +
    |> assign( + nav_items: [ExtensionName.Path.YourPageLive.declared_nav()] + ) + } +end
    diff --git a/add-an-extension-settings.html b/add-an-extension-settings.html index 70913b0c3a..f4c2c5c9f9 100644 --- a/add-an-extension-settings.html +++ b/add-an-extension-settings.html @@ -5,16 +5,16 @@ - + - Add a new extension settings — Bonfire v0.9.10-classic-beta.156 + Add a new extension settings — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    diff --git a/api-reference.html b/api-reference.html index a3a7df3e5a..bcf8587aca 100644 --- a/api-reference.html +++ b/api-reference.html @@ -5,16 +5,16 @@ - + - API Reference — Bonfire v0.9.10-classic-beta.156 + API Reference — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -132,7 +132,7 @@

    - API Reference Bonfire v0.9.10-classic-beta.156 + API Reference Bonfire v0.9.10-classic-beta.160

    @@ -427,21 +427,30 @@

    -

    Handles RSA keys for Actors & helpers for HTTP signatures

    +

    Provides encryption and decryption functionality using RSA keys managed by ActivityPub.Safety.Keys.

    +
    + + +

    Handles RSA keys for Actors & helpers for HTTP signatures

    +
    @@ -951,67 +960,78 @@

    -

    Provides functions to create default boundary fixtures for the instance.

    +

    A grant defines a permission (value boolean on a Verb) for a subject, within the context of an Acl. It defines the access rights for a specific user or circle in relation to a particular action.

    -

    A grant defines a permission (value boolean on a Verb) for a subject, within the context of an Acl. It defines the access rights for a specific user or circle in relation to a particular action.

    +
    +
    + + +

    Helpers for writing common boundary-related queries, particularly for applying access control to queries.

    +

    Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.

    +
    -

    Helpers for writing common boundary-related queries, particularly for applying access control to queries.

    +

    Provides functions to create default boundary fixtures for the instance or for users.

    -

    Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.

    +

    Provides functions to create default boundary fixtures for the instance.

    +

    Provides batching functionality to insert/update default boundary fixtures for all users.

    +
    @@ -1187,6 +1207,15 @@

    Integration with Akismet.com for spam detection

    +

    +
    + + +

    Integration with Bumblebee model(s) for anti-spam detection.

    +
    @@ -1282,6 +1311,13 @@

    Find a context or query module via its schema, backed by a global cache of known modules.

    +

    +
    @@ -2464,7 +2500,7 @@

    -

    Bonfire.Ecto contains Ecto transactional support as acts for Bonfire.Epics

    +

    Bonfire.Ecto contains Ecto transactional support as acts for Bonfire.Epics

    @@ -4124,6 +4160,15 @@

    +
    +
    + + +

    Handles pushing activities (via PubSub and/or email) to active feeds and notifications

    +
    @@ -4993,15 +5038,6 @@

    -
    -
    - - -

    Handles pushing activities (via PubSub) to active feeds and notifications

    -
    @@ -5341,7 +5377,7 @@

    -

    Provides functions for sanitising input on Ecto.Changeset string fields.

    +

    Provides functions for sanitising input on Ecto.Changeset string fields.

    @@ -5465,7 +5501,7 @@

    -

    A Surface component for rendering icons using various methods.

    +

    A Surface component for rendering icons using various methods.

    @@ -5695,52 +5731,6 @@

    Defines page page_info.

    -

    -
    -
    - PaperTrail - -
    - -

    Track and record all the changes in your database. Revert back to anytime in history.

    - -
    -
    - - -
    - -
    - - -

    Serialization functions to create a version struct

    - -
    -
    - - -
    -
    @@ -6482,13 +6472,6 @@

    -
    -
    diff --git a/architecture.html b/architecture.html index b160456585..e01558fc05 100644 --- a/architecture.html +++ b/architecture.html @@ -5,16 +5,16 @@ - + - Bonfire Architecture — Bonfire v0.9.10-classic-beta.156 + Bonfire Architecture — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -165,15 +165,15 @@

    Code Structure

    -

    The code is broadly composed namespaces such as these, many of which are packaged as "extensions" which live in separate git repositories, which are included in the app by way of mix dependencies:

    • Bonfire.* - Core application logic (very little code).
    • Bonfire.*.* - Bonfire extensions (eg Bonfire.Posts) containing mostly context modules, APIs, and routes
    • Bonfire.Data.* - Extensions containing database schemas and migrations
    • Bonfire.UI.* - UI component extensions
    • Bonfire.*.*.LiveHandler - Backend logic to handle events in the frontend
    • Bonfire.Editor.* (pluggable text editors, eg. CKEditor for WYSIWYG markdown input)
    • Bonfire.GraphQL.* - Optional GraphQL API
    • Bonfire.Federate.* - Optional Federation hooks
    • ActivityPub - ActivityPub S2S models, logic and various helper modules
    • ActivityPub.Web - ActivityPub S2S REST endpoints, activity ingestion and push federation facilities
    • ValueFlows.* - economic extensions implementing the ValueFlows vocabulary

    Contexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. Bonfire.Posts implements Bonfire.Data.Social.Post).

    All Bonfire objects use an ULID as their primary key. We use the Needle library (with extra logic in Bonfire.Common.Needles) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see Bonfire.Data.Social.Follow) for an example.

    Context modules usually have one/2, many/2, and many_paginated/1 functions for fetching objects, which in turn call a query/2 function. These take a keyword list as filters (and an optional opts argument) allowing objects to be fetched by arbitrary criteria.

    Examples:

    Users.one(username: "bob") # Fetching by username
    -Posts.many_paginated(by: "01E9TQP93S8XFSV2ZATX1FQ528") # List a page of posts by its author
    -EconomicResources.many(deleted: true) # List any deleted resources

    Context modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.

    Here is an incomplete sample of some of current extensions and modules:

    Additional extensions, libraries, and modules

    +

    The code is broadly composed namespaces such as these, many of which are packaged as "extensions" which live in separate git repositories, which are included in the app by way of mix dependencies:

    • Bonfire.* - Core application logic (very little code).
    • Bonfire.*.* - Bonfire extensions (eg Bonfire.Posts) containing mostly context modules, APIs, and routes
    • Bonfire.Data.* - Extensions containing database schemas and migrations
    • Bonfire.UI.* - UI component extensions
    • Bonfire.*.*.LiveHandler - Backend logic to handle events in the frontend
    • Bonfire.Editor.* (pluggable text editors, eg. CKEditor for WYSIWYG markdown input)
    • Bonfire.GraphQL.* - Optional GraphQL API
    • Bonfire.Federate.* - Optional Federation hooks
    • ActivityPub - ActivityPub S2S models, logic and various helper modules
    • ActivityPub.Web - ActivityPub S2S REST endpoints, activity ingestion and push federation facilities
    • ValueFlows.* - economic extensions implementing the ValueFlows vocabulary

    Contexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. Bonfire.Posts implements Bonfire.Data.Social.Post).

    All Bonfire objects use an ULID as their primary key. We use the Needle library (with extra logic in Bonfire.Common.Needles) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see Bonfire.Data.Social.Follow) for an example.

    Context modules usually have one/2, many/2, and many_paginated/1 functions for fetching objects, which in turn call a query/2 function. These take a keyword list as filters (and an optional opts argument) allowing objects to be fetched by arbitrary criteria.

    Examples:

    Users.one(username: "bob") # Fetching by username
    +Posts.many_paginated(by: "01E9TQP93S8XFSV2ZATX1FQ528") # List a page of posts by its author
    +EconomicResources.many(deleted: true) # List any deleted resources

    Context modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.

    Here is an incomplete sample of some of current extensions and modules:

    Additional extensions, libraries, and modules

    General structure

    -
    • Bonfire app
      • A flavour running Bonfire.Application as supervisor
        • Configs assembled from extensions at flavour/$FLAVOUR/config
        • Phoenix at Bonfire.Web.Endpoint
        • GraphQL schema assembled from extensions at Bonfire.GraphQL.Schema
        • Database migrations assembled from extensions at flavour/$FLAVOUR/repo/migrations
        • Data seeds assembled from extensions at flavour/$FLAVOUR/repo/seeds
        • Extensions and libraries as listed in flavour/$FLAVOUR/config/deps.*
          • Extensions defining schemas and migrations (usually Bonfire.Data.*)
            • Schemas
            • Migrations defined as functions in the schema modules in lib/
            • Migration templates calling those functions in priv/repo/migrations which are then copied into an app flavour's migrations
          • Extensions implementing features or groups of features (eg. Bonfire.Me)
            • Config template which is then copied into an app flavour's config (eg config/bonfire_me.exs)
            • Contexts (eg Bonfire.Me.Users)
            • Routes (eg Bonfire.UI.Me.Routes)
              • Controllers and/or Views (eg Bonfire.UI.Me.CreateUserController and Bonfire.UI.Me.CreateUserLive)
            • API (eg Bonfire.Me.API.GraphQL), refer to GraphQL API documentation
              • Schemas
              • Resolvers
            • Sometimes Plugs (eg Bonfire.Web.Plugs.UserRequired and Bonfire.Web.LivePlugs.UserRequired)
          • Other extensions or libraries (eg Needle or Bonfire.Common which are used by most other extensions)

    +
    • Bonfire app
      • A flavour running Bonfire.Application as supervisor
        • Configs assembled from extensions at flavour/$FLAVOUR/config
        • Phoenix at Bonfire.Web.Endpoint
        • GraphQL schema assembled from extensions at Bonfire.GraphQL.Schema
        • Database migrations assembled from extensions at flavour/$FLAVOUR/repo/migrations
        • Data seeds assembled from extensions at flavour/$FLAVOUR/repo/seeds
        • Extensions and libraries as listed in flavour/$FLAVOUR/config/deps.*
          • Extensions defining schemas and migrations (usually Bonfire.Data.*)
            • Schemas
            • Migrations defined as functions in the schema modules in lib/
            • Migration templates calling those functions in priv/repo/migrations which are then copied into an app flavour's migrations
          • Extensions implementing features or groups of features (eg. Bonfire.Me)
            • Config template which is then copied into an app flavour's config (eg config/bonfire_me.exs)
            • Contexts (eg Bonfire.Me.Users)
            • Routes (eg Bonfire.UI.Me.Routes)
              • Controllers and/or Views (eg Bonfire.UI.Me.CreateUserController and Bonfire.UI.Me.CreateUserLive)
            • API (eg Bonfire.Me.API.GraphQL), refer to GraphQL API documentation
              • Schemas
              • Resolvers
            • Sometimes Plugs (eg Bonfire.Web.Plugs.UserRequired and Bonfire.Web.LivePlugs.UserRequired)
          • Other extensions or libraries (eg Needle or Bonfire.Common which are used by most other extensions)

    diff --git a/blog.html b/blog.html index 3917c9c855..a80584a165 100644 --- a/blog.html +++ b/blog.html @@ -5,16 +5,16 @@ - + - Bonfire Community — Bonfire v0.9.10-classic-beta.156 + Bonfire Community — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/bonfire-flavoured-elixir.html b/bonfire-flavoured-elixir.html index bfc479043b..8b68818aaa 100644 --- a/bonfire-flavoured-elixir.html +++ b/bonfire-flavoured-elixir.html @@ -5,16 +5,16 @@ - + - Bonfire-flavoured Elixir — Bonfire v0.9.10-classic-beta.156 + Bonfire-flavoured Elixir — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -142,33 +142,33 @@

    Arrows

    The Elixir |> ("pipe") operator is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. -The moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.

    Not any more! By simply inserting ... where you would like the value to be inserted, Arrows will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. Arrows was inspired by an existing library. Here is part of the test suite in lieu of examples:

    defmodule ArrowsTest do
    +The moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.

    Not any more! By simply inserting ... where you would like the value to be inserted, Arrows will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. Arrows was inspired by an existing library. Here is part of the test suite in lieu of examples:

    defmodule ArrowsTest do
       use ExUnit.Case
       use Arrows
     
    -  def double(x), do: x * 2
    -  def double_fst(x, _), do: x * 2
    -  def double_snd(_, x), do: x * 2
    -  def add_snd_thd(_, x, y), do: x + y
    -
    -  test "|>" do
    -    assert 4 == (2 |> double)
    -    assert 4 == (2 |> double())
    -    assert 4 == (2 |> double(...))
    -    assert 8 == (2 |> double(double(...)))
    -    assert 4 == (2 |> double_fst(1))
    -    assert 4 == (2 |> double_fst(..., 1))
    -    assert 8 == (2 |> double_fst(double(...), 1))
    -    assert 4 == (2 |> double_snd(1, ...))
    -    assert 8 == (2 |> double_snd(1, double(...)))
    -    assert 3 == (2 |> add_snd_thd(1, ..., 1))
    -    assert 4 == (2 |> add_snd_thd(1, ..., ...))
    -    assert 6 == (2 |> add_snd_thd(1, ..., double(...)))
    -    for x <- [:yes, 2, nil, false] do
    -      assert {:ok, x} == (x |> {:ok, ...})
    -    end
    -  end
    -end

    A few little extra features you might notice here:

    • You can move the parameter into a subexpression, as in 2 |> double_fst(double(...), 1) where double will be called before the parameter is passed to double_fst.
    • You can use ... multiple times, substituting it in multiple places.
    • The right hand side need not even be a function call, you can use any expression with ....

    + def double(x), do: x * 2 + def double_fst(x, _), do: x * 2 + def double_snd(_, x), do: x * 2 + def add_snd_thd(_, x, y), do: x + y + + test "|>" do + assert 4 == (2 |> double) + assert 4 == (2 |> double()) + assert 4 == (2 |> double(...)) + assert 8 == (2 |> double(double(...))) + assert 4 == (2 |> double_fst(1)) + assert 4 == (2 |> double_fst(..., 1)) + assert 8 == (2 |> double_fst(double(...), 1)) + assert 4 == (2 |> double_snd(1, ...)) + assert 8 == (2 |> double_snd(1, double(...))) + assert 3 == (2 |> add_snd_thd(1, ..., 1)) + assert 4 == (2 |> add_snd_thd(1, ..., ...)) + assert 6 == (2 |> add_snd_thd(1, ..., double(...))) + for x <- [:yes, 2, nil, false] do + assert {:ok, x} == (x |> {:ok, ...}) + end + end +end

    A few little extra features you might notice here:

    • You can move the parameter into a subexpression, as in 2 |> double_fst(double(...), 1) where double will be called before the parameter is passed to double_fst.
    • You can use ... multiple times, substituting it in multiple places.
    • The right hand side need not even be a function call, you can use any expression with ....

    @@ -182,14 +182,14 @@

    Untangle provides replacements for the macros in Elixir's Logger module and the IO.inspect function to output code location information. The first argument will be inspected and the second (where provided) will be used as a label:

    iex(1)> import Untangle
     Untangle
    -iex(2)> debug(:no, "the answer is") # log at debug
    -11:19:09.915 [debug] [iex:2] the answer is: :no
    +iex(2)> debug(:no, "the answer is") # log at debug
    +11:19:09.915 [debug] [iex:2] the answer is: :no
     :no
    -iex(3)> dump(%{a: :map}, "it") # inspect something on stdout
    -[iex:3] it: %{a: :map}
    -%{a: :map}

    When used in a code file, the location information becomes slightly more useful, e.g.:

    [lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []

    You may also notice from the iex output that it returns its first argument. This makes it ideal for -inserting into a pipeline for debugging purposes:

    do_something()
    -|> debug("output of do_something/0")

    When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!

    You will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.

    +iex(3)> dump(%{a: :map}, "it") # inspect something on stdout +[iex:3] it: %{a: :map} +%{a: :map}

    When used in a code file, the location information becomes slightly more useful, e.g.:

    [lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []

    You may also notice from the iex output that it returns its first argument. This makes it ideal for +inserting into a pipeline for debugging purposes:

    do_something()
    +|> debug("output of do_something/0")

    When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!

    You will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.

    diff --git a/changelog.html b/changelog.html index bc06a1988b..319fec0d25 100644 --- a/changelog.html +++ b/changelog.html @@ -5,16 +5,16 @@ - + - Bonfire Changelog — Bonfire v0.9.10-classic-beta.156 + Bonfire Changelog — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/classic.html b/classic.html index 0fe274d900..9ff02651aa 100644 --- a/classic.html +++ b/classic.html @@ -5,16 +5,16 @@ - + - Bonfire Classic — Bonfire v0.9.10-classic-beta.156 + Bonfire Classic — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/community.html b/community.html index 5e86a9f4ca..082038b2a8 100644 --- a/community.html +++ b/community.html @@ -5,16 +5,16 @@ - + - Bonfire Community — Bonfire v0.9.10-classic-beta.156 + Bonfire Community — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/cooperation.html b/cooperation.html index b90f82e8d1..c277730a9c 100644 --- a/cooperation.html +++ b/cooperation.html @@ -5,16 +5,16 @@ - + - Bonfire Cooperation — Bonfire v0.9.10-classic-beta.156 + Bonfire Cooperation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/coordination.html b/coordination.html index cd0cbfcf68..af15273c4f 100644 --- a/coordination.html +++ b/coordination.html @@ -5,16 +5,16 @@ - + - Bonfire Coordination — Bonfire v0.9.10-classic-beta.156 + Bonfire Coordination — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/create-a-new-extension.html b/create-a-new-extension.html index 3b6d581263..c0a3d1d404 100644 --- a/create-a-new-extension.html +++ b/create-a-new-extension.html @@ -5,16 +5,16 @@ - + - Create a new extension — Bonfire v0.9.10-classic-beta.156 + Create a new extension — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -146,7 +146,7 @@

    1. To start building your own extension, you can utilise our custom mix generator task. Simply navigate to the Bonfire app root folder in your terminal and type:
    just mix bonfire.extension.new *your_extension_name*

    This command creates a new directory in ./extensions named *your_extension_name*, complete with all the necessary files and scaffolding.

    1. Add your extension to ./config/deps.flavour.path (on a new line, it should look similar to your_extension_name = "extensions/your_extension_name") to enable it locally.

    2. Once your new extension is set up, you're ready to dive into coding. Consider these possible steps to enhance your extension:

    • Implement extension-specific fake functions for testing purposes.
    • Create extension-specific database migrations.
    • Add any dependencies you need to deps.git and/or deps.hex.
    • If your extension includes new pages, you need to link them in the main router.

    Info

    Bonfire's Phoenix router module is found in the bonfire extension. Refer to the Routing page to learn how to add new routes.

    1. After coding your initial features, create an empty repository on your preferred Git platform. Then, commit and push your local changes to make your work accessible and open for collaboration:
    git add .
     git commit -m "light my fire"
     git branch -M main
    -git remote add origin [your-remote-repository-url]
    +git remote add origin [your-remote-repository-url]
     git push -u origin main
    1. When you're ready for other people upstream to use your extension, add it to ./config/deps.git (including the branch name).

    And just like that, you've successfully created and prepared your first Bonfire extension and shared with the community 🔥

    diff --git a/create-a-new-page.html b/create-a-new-page.html index 01b9f4d80a..d1fb5c0602 100644 --- a/create-a-new-page.html +++ b/create-a-new-page.html @@ -5,16 +5,16 @@ - + - Create a new page — Bonfire v0.9.10-classic-beta.156 + Create a new page — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/deploy.html b/deploy.html index d72c11c2c8..c60f764964 100644 --- a/deploy.html +++ b/deploy.html @@ -5,16 +5,16 @@ - + - Hosting guide — Bonfire v0.9.10-classic-beta.156 + Hosting guide — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -255,13 +255,13 @@

    Config keys you should pay special attention to:

    -

    The app needs these environment variables to be configured in order to work.

    • FLAVOUR should reflect your chosen flavour
    • HOSTNAME (your domain name, eg: bonfire.example.com)
    • PUBLIC_PORT (usually 443)
    • MAIL_DOMAIN and MAIL_KEY and related keys to configure transactional email, for example set MAIL_BACKEND=mailgun and sign up at Mailgun and then configure the domain name and key (you may also need to set MAIL_BASE_URI if your domain is not setup in EU, as the default MAIL_BASE_URI is set as https://api.eu.mailgun.net/v3).
    • SMTP is supported as well, through the following env vars
      MAIL_SERVER (smtp domain of the mail server)
      -MAIL_DOMAIN (the bit after the @ in your email)
      +

      The app needs these environment variables to be configured in order to work.

      • FLAVOUR should reflect your chosen flavour
      • HOSTNAME (your domain name, eg: bonfire.example.com)
      • PUBLIC_PORT (usually 443)
      • MAIL_DOMAIN and MAIL_KEY and related keys to configure transactional email, for example set MAIL_BACKEND=mailgun and sign up at Mailgun and then configure the domain name and key (you may also need to set MAIL_BASE_URI if your domain is not setup in EU, as the default MAIL_BASE_URI is set as https://api.eu.mailgun.net/v3).
      • SMTP is supported as well, through the following env vars
        MAIL_SERVER (smtp domain of the mail server)
        +MAIL_DOMAIN (the bit after the @ in your email)
         MAIL_USER
         MAIL_PASSWORD
         MAIL_FROM
        -MAIL_PORT (optional)
        -MAIL_SSL (optional)
      • UPLOADS_S3_BUCKET and the related API key and secret for uploads. WARNING: If you want to store uploads in an object storage rather than directly on your server (which you probably want, to not run out of space), you need to configure that up front, otherwise URLs will break if you change it later. See config/runtime.exs for extra variables to set if you're not using the default service and region (which is Scaleway Paris).

      +MAIL_PORT (optional) +MAIL_SSL (optional)

    • UPLOADS_S3_BUCKET and the related API key and secret for uploads. WARNING: If you want to store uploads in an object storage rather than directly on your server (which you probably want, to not run out of space), you need to configure that up front, otherwise URLs will break if you change it later. See config/runtime.exs for extra variables to set if you're not using the default service and region (which is Scaleway Paris).

    @@ -298,14 +298,14 @@

    Troubleshooting

    -

    Some common issues that may arise during deployment and our suggestions for resolving them.

    WebSocket connections not establishing behind a reverse proxy

    If you are running Bonfire behind your own reverse proxy (e.g. nginx), you might experience issues with WebSocket connections not establishing. WebSocket connections require specific configuration to work, in nginx the following configuration is necessary for websockets to work:

    location /live/websocket {
    +

    Some common issues that may arise during deployment and our suggestions for resolving them.

    WebSocket connections not establishing behind a reverse proxy

    If you are running Bonfire behind your own reverse proxy (e.g. nginx), you might experience issues with WebSocket connections not establishing. WebSocket connections require specific configuration to work, in nginx the following configuration is necessary for websockets to work:

    location /live/websocket {
         proxy_pass http://127.0.0.1:4000;
         
         # these configurations are necessary to proxy WebSocket requests
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
    -}
    +
    }
    diff --git a/deps-classic.html b/deps-classic.html index ef2304b630..048d714ea5 100644 --- a/deps-classic.html +++ b/deps-classic.html @@ -5,16 +5,16 @@ - + - Classic — Bonfire v0.9.10-classic-beta.156 + Classic — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    @@ -141,12 +141,12 @@

    - diff --git a/deps-cooperation.html b/deps-cooperation.html index 778fd46a78..353c1725b8 100644 --- a/deps-cooperation.html +++ b/deps-cooperation.html @@ -5,16 +5,16 @@ - + - Cooperation — Bonfire v0.9.10-classic-beta.156 + Cooperation — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    diff --git a/design.html b/design.html index dfb2bbd0ed..05ff7a1db7 100644 --- a/design.html +++ b/design.html @@ -5,16 +5,16 @@ - + - Design Guidelines — Bonfire v0.9.10-classic-beta.156 + Design Guidelines — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/dist/search_data-C93A2972.js b/dist/search_data-C93A2972.js deleted file mode 100644 index 4c45166975..0000000000 --- a/dist/search_data-C93A2972.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"Bonfire.Data.AccessControl.Acl","doc":"Conceptually, a complete list of all permissions for everybody.\nIn practice, it's a partial specification, and anything not\nexplicitly granted is assumed to be denied.\n\nCan be reused to secure multiple objects, thus exists independently\nof any object.","ref":"Bonfire.Data.AccessControl.Acl.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Circle","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Controlled","doc":"An object is linked to one or more `Acl`s by the `Controlled` multimixin, which pairs an object ID with an ACL ID. Because it is a multimixin, a given object can have multiple ACLs applied. In the case of overlap, permissions are combined with `false` being prioritised.","ref":"Bonfire.Data.AccessControl.Controlled.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Encircle","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Grant","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.InstanceAdmin","doc":"A mixin for superpowers","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.changeset/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#changeset/3"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.get/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.put/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Stereotyped","doc":"A marker that identifies special context-dependent semantics to the system.","ref":"Bonfire.Data.AccessControl.Stereotyped.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Verb","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Actor","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.changeset/2","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#changeset/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Actor.Migration","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.create_actor_table/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#create_actor_table/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.create_actor_table/1","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#create_actor_table/1"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.Migration.drop_actor_table/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#drop_actor_table/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.migrate_actor/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#migrate_actor/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.migrate_actor/1","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#migrate_actor/1"},{"type":"module","title":"Bonfire.Data.ActivityPub.Peer","doc":"Federated instances","ref":"Bonfire.Data.ActivityPub.Peer.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.changeset/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#changeset/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Peered","doc":"Federated actors or objects","ref":"Bonfire.Data.ActivityPub.Peered.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.changeset/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#changeset/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#put/3"},{"type":"module","title":"Bonfire.Data.Assort.Ranked","doc":"A reusable table to link child or related items and also rank sibling items.\n\nUsage (for global ranking, otherwise you should specify scope):\n```\n{:ok, first} = Bonfire.Data.Assort.Ranked.changeset(%{item_id: \"01FGTH48ZZD08ADBHQ260KYJHW\"}) |> repo().insert\nsecond = Bonfire.Data.Assort.Ranked.changeset(%{item_id: \"01FGTH0N3YPBS5MNNAEAEVV54J\"}) |> repo().insert\n\nimport Ecto.Query\nBonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all\n\nfirst |> Bonfire.Data.Assort.Ranked.changeset(%{rank_set: :last}) |> repo().update\n\nBonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all\n```","ref":"Bonfire.Data.Assort.Ranked.html"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.changeset/2","doc":"","ref":"Bonfire.Data.Assort.Ranked.html#changeset/2"},{"type":"module","title":"Bonfire.Data.Assort.Ranked.Migration","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_ranked_table/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_ranked_table/0"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_ranked_table/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_ranked_table/1"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_unique_index/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_unique_index/1"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.Migration.drop_ranked_table/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#drop_ranked_table/0"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.Migration.drop_unique_index/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#drop_unique_index/1"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.migrate_ranked/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#migrate_ranked/0"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.migrate_ranked/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#migrate_ranked/1"},{"type":"module","title":"Bonfire.Data.Edges.Edge","doc":"","ref":"Bonfire.Data.Edges.Edge.html"},{"type":"function","title":"Bonfire.Data.Edges.Edge.changeset/2","doc":"","ref":"Bonfire.Data.Edges.Edge.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Edges.Edge.delete/2","doc":"","ref":"Bonfire.Data.Edges.Edge.html#delete/2"},{"type":"function","title":"Bonfire.Data.Edges.Edge.get/3","doc":"","ref":"Bonfire.Data.Edges.Edge.html#get/3"},{"type":"function","title":"Bonfire.Data.Edges.Edge.put/3","doc":"","ref":"Bonfire.Data.Edges.Edge.html#put/3"},{"type":"module","title":"Bonfire.Data.Edges.EdgeTotal","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.changeset/2","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.delete/2","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#delete/2"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.get/3","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#get/3"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.put/3","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Account","doc":"An account is an identity for authentication purposes. An account\nhas one or more credentials with which it may identify.","ref":"Bonfire.Data.Identity.Account.html"},{"type":"function","title":"Bonfire.Data.Identity.Account.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Account.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Account.delete/2","doc":"","ref":"Bonfire.Data.Identity.Account.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Account.get/3","doc":"","ref":"Bonfire.Data.Identity.Account.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Account.put/3","doc":"","ref":"Bonfire.Data.Identity.Account.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Accounted","doc":"A mixin for an account ID, indicating ownership\n\nPrimarily used for Users.","ref":"Bonfire.Data.Identity.Accounted.html"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.delete/2","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.get/3","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.put/3","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Alias","doc":"","ref":"Bonfire.Data.Identity.Alias.html"},{"type":"function","title":"Bonfire.Data.Identity.Alias.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Alias.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Alias.delete/2","doc":"","ref":"Bonfire.Data.Identity.Alias.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Alias.get/3","doc":"","ref":"Bonfire.Data.Identity.Alias.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Alias.put/3","doc":"","ref":"Bonfire.Data.Identity.Alias.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.AuthSecondFactor","doc":"A mixin that stores a second factor secret to authenticate an account.","ref":"Bonfire.Data.Identity.AuthSecondFactor.html"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.changeset/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.delete/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.get/3","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.put/3","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.valid_totp?/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#valid_totp?/2"},{"type":"module","title":"Bonfire.Data.Identity.CareClosure","doc":"A recursive view of all entities taken care of by their root entities.\n\nReally, really do not query this without providing a branch_id.","ref":"Bonfire.Data.Identity.CareClosure.html"},{"type":"function","title":"Bonfire.Data.Identity.CareClosure.by_branch/1","doc":"","ref":"Bonfire.Data.Identity.CareClosure.html#by_branch/1"},{"type":"module","title":"Bonfire.Data.Identity.Caretaker","doc":"The entity responsible for something. In practice, it means that\nsomething is deleted when its caretaker is deleted.\n\nYou can think of it as being like the creator, except:\na) You can give it away.\nb) Objects can take care of arbitrary objects, such as e.g. custom\n ACLs created to permit people mentioned special permissions","ref":"Bonfire.Data.Identity.Caretaker.html"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.delete/2","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.get/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.put/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Character","doc":"A username mixin that denies reuse of the same or similar usernames\neven when the username has been deleted.","ref":"Bonfire.Data.Identity.Character.html"},{"type":"function","title":"Bonfire.Data.Identity.Character.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.changeset_basic/2","doc":"","ref":"Bonfire.Data.Identity.Character.html#changeset_basic/2"},{"type":"function","title":"Bonfire.Data.Identity.Character.delete/2","doc":"","ref":"Bonfire.Data.Identity.Character.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Character.get/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.hash/1","doc":"","ref":"Bonfire.Data.Identity.Character.html#hash/1"},{"type":"function","title":"Bonfire.Data.Identity.Character.put/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.uniform/1","doc":"","ref":"Bonfire.Data.Identity.Character.html#uniform/1"},{"type":"module","title":"Bonfire.Data.Identity.Credential","doc":"A Mixin that provides a password for local login.","ref":"Bonfire.Data.Identity.Credential.html"},{"type":"function","title":"Bonfire.Data.Identity.Credential.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.check_password/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#check_password/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.confirmation_changeset/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#confirmation_changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.delete/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.dummy_check/0","doc":"","ref":"Bonfire.Data.Identity.Credential.html#dummy_check/0"},{"type":"function","title":"Bonfire.Data.Identity.Credential.get/3","doc":"","ref":"Bonfire.Data.Identity.Credential.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Credential.hash_password/1","doc":"","ref":"Bonfire.Data.Identity.Credential.html#hash_password/1"},{"type":"function","title":"Bonfire.Data.Identity.Credential.put/3","doc":"","ref":"Bonfire.Data.Identity.Credential.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Credential.Migration","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.create_credential_table/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#create_credential_table/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.create_credential_table/1","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#create_credential_table/1"},{"type":"function","title":"Bonfire.Data.Identity.Credential.Migration.drop_credential_table/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#drop_credential_table/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.migrate_credential/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#migrate_credential/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.migrate_credential/1","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#migrate_credential/1"},{"type":"module","title":"Bonfire.Data.Identity.Email","doc":"","ref":"Bonfire.Data.Identity.Email.html"},{"type":"function","title":"Bonfire.Data.Identity.Email.changeset/3","doc":"Options:\n email_regex: Regexp.t (default very minimal validation)\n must_confirm?: bool (default true)","ref":"Bonfire.Data.Identity.Email.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.confirm/1","doc":"Changeset function. Marks the user's email as confirmed and removes\ntheir confirmation token.","ref":"Bonfire.Data.Identity.Email.html#confirm/1"},{"type":"function","title":"Bonfire.Data.Identity.Email.delete/2","doc":"","ref":"Bonfire.Data.Identity.Email.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.get/3","doc":"","ref":"Bonfire.Data.Identity.Email.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.may_confirm?/2","doc":"","ref":"Bonfire.Data.Identity.Email.html#may_confirm?/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.may_request_confirm_email?/2","doc":"Checks whether the user should be able to request a confirm email","ref":"Bonfire.Data.Identity.Email.html#may_request_confirm_email?/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.put/3","doc":"","ref":"Bonfire.Data.Identity.Email.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.put_token/1","doc":"Changeset function. Unconditionally sets the user as unconfirmed,\ngenerates a confirmation token and puts an expiry on it determined\nby the `:confirm_duration` config key (default one day).","ref":"Bonfire.Data.Identity.Email.html#put_token/1"},{"type":"function","title":"Bonfire.Data.Identity.Email.should_request_or_refresh?/2","doc":"Checks whether the user should request a new confirmation token or refresh it","ref":"Bonfire.Data.Identity.Email.html#should_request_or_refresh?/2"},{"type":"type","title":"Bonfire.Data.Identity.Email.t/0","doc":"","ref":"Bonfire.Data.Identity.Email.html#t:t/0"},{"type":"module","title":"Bonfire.Data.Identity.ExtraInfo","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.changeset/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.delete/2","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.get/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.put/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Named","doc":"","ref":"Bonfire.Data.Identity.Named.html"},{"type":"function","title":"Bonfire.Data.Identity.Named.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Named.delete/2","doc":"","ref":"Bonfire.Data.Identity.Named.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Named.get/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Named.normalize_name/1","doc":"","ref":"Bonfire.Data.Identity.Named.html#normalize_name/1"},{"type":"function","title":"Bonfire.Data.Identity.Named.put/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Self","doc":"","ref":"Bonfire.Data.Identity.Self.html"},{"type":"function","title":"Bonfire.Data.Identity.Self.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Self.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Self.delete/2","doc":"","ref":"Bonfire.Data.Identity.Self.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Self.get/3","doc":"","ref":"Bonfire.Data.Identity.Self.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Self.put/3","doc":"","ref":"Bonfire.Data.Identity.Self.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Settings","doc":"A mixin that stores settings (of the instance, account, user, etc) as an Erlang Term (typically a map or keyword list) encoded to binary.","ref":"Bonfire.Data.Identity.Settings.html"},{"type":"function","title":"Bonfire.Data.Identity.Settings.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Settings.delete/2","doc":"","ref":"Bonfire.Data.Identity.Settings.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Settings.get/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Settings.put/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.SettingsJSONSerdeData","doc":"A custom Ecto type (based on `EctoSparkles.JSONSerdeData`) for handling the serialization of arbitrary data types stored as JSON data in the database. Requires the underlying DB field to be a map / JSONB field.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.cast/1","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#cast/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#cast/2"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.dump/1","doc":"Converting the data structure to a JSON binary for storage.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#dump/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.embed_as/1","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#embed_as/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.equal?/2","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#equal?/2"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.load/1","doc":"Convert the JSON binary value from the database back to the desired term.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#load/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.type/0","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#type/0"},{"type":"module","title":"Bonfire.Data.Identity.User","doc":"A persona. A person (account) may have more than one user, but this\nis not exposed publicly (except to local instance administrators),\nso it is as if they are different people.","ref":"Bonfire.Data.Identity.User.html"},{"type":"function","title":"Bonfire.Data.Identity.User.changeset/2","doc":"","ref":"Bonfire.Data.Identity.User.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.User.delete/2","doc":"","ref":"Bonfire.Data.Identity.User.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.User.get/3","doc":"","ref":"Bonfire.Data.Identity.User.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.User.maybe_redact/1","doc":"","ref":"Bonfire.Data.Identity.User.html#maybe_redact/1"},{"type":"function","title":"Bonfire.Data.Identity.User.put/3","doc":"","ref":"Bonfire.Data.Identity.User.html#put/3"},{"type":"module","title":"Bonfire.Data.SharedUser","doc":"A mixin for shared user personas (which multiple accounts can use)","ref":"Bonfire.Data.SharedUser.html"},{"type":"function","title":"Bonfire.Data.SharedUser.changeset/2","doc":"","ref":"Bonfire.Data.SharedUser.html#changeset/2"},{"type":"function","title":"Bonfire.Data.SharedUser.delete/2","doc":"","ref":"Bonfire.Data.SharedUser.html#delete/2"},{"type":"function","title":"Bonfire.Data.SharedUser.get/3","doc":"","ref":"Bonfire.Data.SharedUser.html#get/3"},{"type":"function","title":"Bonfire.Data.SharedUser.put/3","doc":"","ref":"Bonfire.Data.SharedUser.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.APActivity","doc":"","ref":"Bonfire.Data.Social.APActivity.html"},{"type":"function","title":"Bonfire.Data.Social.APActivity.changeset/2","doc":"","ref":"Bonfire.Data.Social.APActivity.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.APActivity.delete/2","doc":"","ref":"Bonfire.Data.Social.APActivity.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.APActivity.get/3","doc":"","ref":"Bonfire.Data.Social.APActivity.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.APActivity.put/3","doc":"","ref":"Bonfire.Data.Social.APActivity.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Activity","doc":"","ref":"Bonfire.Data.Social.Activity.html"},{"type":"function","title":"Bonfire.Data.Social.Activity.changeset/2","doc":"","ref":"Bonfire.Data.Social.Activity.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Activity.delete/2","doc":"","ref":"Bonfire.Data.Social.Activity.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Activity.get/3","doc":"","ref":"Bonfire.Data.Social.Activity.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Activity.put/3","doc":"","ref":"Bonfire.Data.Social.Activity.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Bookmark","doc":"","ref":"Bonfire.Data.Social.Bookmark.html"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.changeset/2","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.delete/2","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.get/3","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.put/3","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Boost","doc":"","ref":"Bonfire.Data.Social.Boost.html"},{"type":"function","title":"Bonfire.Data.Social.Boost.changeset/2","doc":"","ref":"Bonfire.Data.Social.Boost.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Boost.delete/2","doc":"","ref":"Bonfire.Data.Social.Boost.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Boost.get/3","doc":"","ref":"Bonfire.Data.Social.Boost.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Boost.put/3","doc":"","ref":"Bonfire.Data.Social.Boost.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Created","doc":"","ref":"Bonfire.Data.Social.Created.html"},{"type":"function","title":"Bonfire.Data.Social.Created.changeset/2","doc":"","ref":"Bonfire.Data.Social.Created.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Created.delete/2","doc":"","ref":"Bonfire.Data.Social.Created.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Created.get/3","doc":"","ref":"Bonfire.Data.Social.Created.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Created.put/3","doc":"","ref":"Bonfire.Data.Social.Created.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Emoji","doc":"","ref":"Bonfire.Data.Social.Emoji.html"},{"type":"function","title":"Bonfire.Data.Social.Emoji.changeset/2","doc":"","ref":"Bonfire.Data.Social.Emoji.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Emoji.delete/2","doc":"","ref":"Bonfire.Data.Social.Emoji.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Emoji.get/3","doc":"","ref":"Bonfire.Data.Social.Emoji.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Emoji.put/3","doc":"","ref":"Bonfire.Data.Social.Emoji.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Feed","doc":"","ref":"Bonfire.Data.Social.Feed.html"},{"type":"function","title":"Bonfire.Data.Social.Feed.changeset/2","doc":"","ref":"Bonfire.Data.Social.Feed.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Feed.delete/2","doc":"","ref":"Bonfire.Data.Social.Feed.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Feed.get/3","doc":"","ref":"Bonfire.Data.Social.Feed.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Feed.put/3","doc":"","ref":"Bonfire.Data.Social.Feed.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.FeedPublish","doc":"A multimixin for an activity/object appearing in a feed.\n\nA quite interesting thing about this model is that `feed`\nreferences `Pointer`, so it isn't only things of type `Feed` that it can\nappear in, they are just an obvious choice.","ref":"Bonfire.Data.Social.FeedPublish.html"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.changeset/2","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.delete/2","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.get/3","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.put/3","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Flag","doc":"","ref":"Bonfire.Data.Social.Flag.html"},{"type":"function","title":"Bonfire.Data.Social.Flag.changeset/2","doc":"","ref":"Bonfire.Data.Social.Flag.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Flag.delete/2","doc":"","ref":"Bonfire.Data.Social.Flag.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Flag.get/3","doc":"","ref":"Bonfire.Data.Social.Flag.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Flag.put/3","doc":"","ref":"Bonfire.Data.Social.Flag.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Follow","doc":"","ref":"Bonfire.Data.Social.Follow.html"},{"type":"function","title":"Bonfire.Data.Social.Follow.changeset/2","doc":"","ref":"Bonfire.Data.Social.Follow.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Follow.delete/2","doc":"","ref":"Bonfire.Data.Social.Follow.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Follow.get/3","doc":"","ref":"Bonfire.Data.Social.Follow.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Follow.put/3","doc":"","ref":"Bonfire.Data.Social.Follow.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Like","doc":"","ref":"Bonfire.Data.Social.Like.html"},{"type":"function","title":"Bonfire.Data.Social.Like.changeset/2","doc":"","ref":"Bonfire.Data.Social.Like.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Like.delete/2","doc":"","ref":"Bonfire.Data.Social.Like.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Like.get/3","doc":"","ref":"Bonfire.Data.Social.Like.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Like.put/3","doc":"","ref":"Bonfire.Data.Social.Like.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Message","doc":"","ref":"Bonfire.Data.Social.Message.html"},{"type":"function","title":"Bonfire.Data.Social.Message.changeset/2","doc":"","ref":"Bonfire.Data.Social.Message.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Message.delete/2","doc":"","ref":"Bonfire.Data.Social.Message.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Message.get/3","doc":"","ref":"Bonfire.Data.Social.Message.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Message.put/3","doc":"","ref":"Bonfire.Data.Social.Message.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Pin","doc":"","ref":"Bonfire.Data.Social.Pin.html"},{"type":"function","title":"Bonfire.Data.Social.Pin.changeset/2","doc":"","ref":"Bonfire.Data.Social.Pin.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Pin.delete/2","doc":"","ref":"Bonfire.Data.Social.Pin.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Pin.get/3","doc":"","ref":"Bonfire.Data.Social.Pin.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Pin.put/3","doc":"","ref":"Bonfire.Data.Social.Pin.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Post","doc":"","ref":"Bonfire.Data.Social.Post.html"},{"type":"function","title":"Bonfire.Data.Social.Post.changeset/2","doc":"","ref":"Bonfire.Data.Social.Post.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Post.delete/2","doc":"","ref":"Bonfire.Data.Social.Post.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Post.get/3","doc":"","ref":"Bonfire.Data.Social.Post.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Post.put/3","doc":"","ref":"Bonfire.Data.Social.Post.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.PostContent","doc":"","ref":"Bonfire.Data.Social.PostContent.html"},{"type":"function","title":"Bonfire.Data.Social.PostContent.changeset/2","doc":"","ref":"Bonfire.Data.Social.PostContent.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.PostContent.delete/2","doc":"","ref":"Bonfire.Data.Social.PostContent.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.PostContent.get/3","doc":"","ref":"Bonfire.Data.Social.PostContent.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.PostContent.put/3","doc":"","ref":"Bonfire.Data.Social.PostContent.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Profile","doc":"","ref":"Bonfire.Data.Social.Profile.html"},{"type":"function","title":"Bonfire.Data.Social.Profile.changeset/2","doc":"","ref":"Bonfire.Data.Social.Profile.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Profile.delete/2","doc":"","ref":"Bonfire.Data.Social.Profile.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Profile.get/3","doc":"","ref":"Bonfire.Data.Social.Profile.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Profile.put/3","doc":"","ref":"Bonfire.Data.Social.Profile.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Replied","doc":"","ref":"Bonfire.Data.Social.Replied.html"},{"type":"function","title":"Bonfire.Data.Social.Replied.ancestor_ids/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#ancestor_ids/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.ancestors/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#ancestors/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.arrange/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#arrange/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.build_child/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#build_child/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.changeset/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.children/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#children/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.delete/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.depth/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#depth/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.descendants/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#descendants/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.get/3","doc":"","ref":"Bonfire.Data.Social.Replied.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Replied.make_child_of/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#make_child_of/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.parent/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#parent/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.parent_id/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#parent_id/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.path/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#path/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.path_ids/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#path_ids/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.put/3","doc":"","ref":"Bonfire.Data.Social.Replied.html#put/3"},{"type":"function","title":"Bonfire.Data.Social.Replied.root/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.root?/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root?/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.root_id/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root_id/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.siblings/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#siblings/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.subtree/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#subtree/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.where_depth/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#where_depth/2"},{"type":"module","title":"Bonfire.Data.Social.Request","doc":"","ref":"Bonfire.Data.Social.Request.html"},{"type":"function","title":"Bonfire.Data.Social.Request.changeset/2","doc":"","ref":"Bonfire.Data.Social.Request.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Request.delete/2","doc":"","ref":"Bonfire.Data.Social.Request.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Request.get/3","doc":"","ref":"Bonfire.Data.Social.Request.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Request.put/3","doc":"","ref":"Bonfire.Data.Social.Request.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Seen","doc":"Track seen/unseen (similar to read/unread, but only indicates that it was displayed in a feed or other listing for the user, not that they actually read it) status of things (usually an `Activity`)","ref":"Bonfire.Data.Social.Seen.html"},{"type":"function","title":"Bonfire.Data.Social.Seen.changeset/2","doc":"","ref":"Bonfire.Data.Social.Seen.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Seen.delete/2","doc":"","ref":"Bonfire.Data.Social.Seen.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Seen.get/3","doc":"","ref":"Bonfire.Data.Social.Seen.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Seen.put/3","doc":"","ref":"Bonfire.Data.Social.Seen.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Sensitive","doc":"","ref":"Bonfire.Data.Social.Sensitive.html"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.changeset/2","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.delete/2","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.get/3","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.put/3","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#put/3"},{"type":"module","title":"Bonfire.UI.Common","doc":"A library of common utils and helpers used across Bonfire extensions\n\n- Many common functions for web UIs \n- Common and generic re-usable components\n- Etc","ref":"Bonfire.UI.Common.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Common","doc":"","ref":"Bonfire.UI.Common.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Common","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Common.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Common.assign_error/3","doc":"","ref":"Bonfire.UI.Common.html#assign_error/3"},{"type":"function","title":"Bonfire.UI.Common.assign_flash/5","doc":"","ref":"Bonfire.UI.Common.html#assign_flash/5"},{"type":"function","title":"Bonfire.UI.Common.assign_generic/2","doc":"","ref":"Bonfire.UI.Common.html#assign_generic/2"},{"type":"function","title":"Bonfire.UI.Common.assign_generic/3","doc":"","ref":"Bonfire.UI.Common.html#assign_generic/3"},{"type":"function","title":"Bonfire.UI.Common.assign_generic_global/2","doc":"","ref":"Bonfire.UI.Common.html#assign_generic_global/2"},{"type":"function","title":"Bonfire.UI.Common.assign_global/2","doc":"","ref":"Bonfire.UI.Common.html#assign_global/2"},{"type":"function","title":"Bonfire.UI.Common.assign_global/3","doc":"","ref":"Bonfire.UI.Common.html#assign_global/3"},{"type":"function","title":"Bonfire.UI.Common.assigns_clean/1","doc":"","ref":"Bonfire.UI.Common.html#assigns_clean/1"},{"type":"function","title":"Bonfire.UI.Common.assigns_merge/2","doc":"","ref":"Bonfire.UI.Common.html#assigns_merge/2"},{"type":"function","title":"Bonfire.UI.Common.assigns_merge/3","doc":"","ref":"Bonfire.UI.Common.html#assigns_merge/3"},{"type":"function","title":"Bonfire.UI.Common.assigns_minimal/1","doc":"","ref":"Bonfire.UI.Common.html#assigns_minimal/1"},{"type":"function","title":"Bonfire.UI.Common.assigns_subscribe/2","doc":"","ref":"Bonfire.UI.Common.html#assigns_subscribe/2"},{"type":"function","title":"Bonfire.UI.Common.batch_update_many_async/3","doc":"","ref":"Bonfire.UI.Common.html#batch_update_many_async/3"},{"type":"function","title":"Bonfire.UI.Common.batch_update_many_async/4","doc":"","ref":"Bonfire.UI.Common.html#batch_update_many_async/4"},{"type":"function","title":"Bonfire.UI.Common.can?/4","doc":"","ref":"Bonfire.UI.Common.html#can?/4"},{"type":"function","title":"Bonfire.UI.Common.cast_public/2","doc":"Warning: this will set assigns for any/all users who subscribe to them. You want to `cast_self/2` instead if dealing with user-specific actions or private data.","ref":"Bonfire.UI.Common.html#cast_public/2"},{"type":"function","title":"Bonfire.UI.Common.cast_self/2","doc":"","ref":"Bonfire.UI.Common.html#cast_self/2"},{"type":"function","title":"Bonfire.UI.Common.copy_go/1","doc":"copies the `go` param into a query string, if any","ref":"Bonfire.UI.Common.html#copy_go/1"},{"type":"function","title":"Bonfire.UI.Common.current_url/3","doc":"","ref":"Bonfire.UI.Common.html#current_url/3"},{"type":"function","title":"Bonfire.UI.Common.current_user_or_remote_interaction/3","doc":"","ref":"Bonfire.UI.Common.html#current_user_or_remote_interaction/3"},{"type":"function","title":"Bonfire.UI.Common.declared_extension/0","doc":"","ref":"Bonfire.UI.Common.html#declared_extension/0"},{"type":"function","title":"Bonfire.UI.Common.go_query/1","doc":"Generate a query string adding a `go` redirection path to the URI (for redirecting somewhere after auth flows).\nIt is recommended to use `set_go_after/2` where possible instead.","ref":"Bonfire.UI.Common.html#go_query/1"},{"type":"function","title":"Bonfire.UI.Common.hero_icons_list/0","doc":"","ref":"Bonfire.UI.Common.html#hero_icons_list/0"},{"type":"macro","title":"Bonfire.UI.Common.live_aliases/5","doc":"","ref":"Bonfire.UI.Common.html#live_aliases/5"},{"type":"function","title":"Bonfire.UI.Common.live_render_component/2","doc":"Special LiveView helper function which allows loading LiveComponents in regular Phoenix views: `live_render_component(@conn, MyLiveComponent)`","ref":"Bonfire.UI.Common.html#live_render_component/2"},{"type":"function","title":"Bonfire.UI.Common.live_render_with_conn/2","doc":"","ref":"Bonfire.UI.Common.html#live_render_with_conn/2"},{"type":"function","title":"Bonfire.UI.Common.live_upload_files/5","doc":"","ref":"Bonfire.UI.Common.html#live_upload_files/5"},{"type":"function","title":"Bonfire.UI.Common.markdown/1","doc":"","ref":"Bonfire.UI.Common.html#markdown/1"},{"type":"function","title":"Bonfire.UI.Common.maybe_apply_or_ret/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_apply_or_ret/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_assign/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_assign/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_assign_context/2","doc":"","ref":"Bonfire.UI.Common.html#maybe_assign_context/2"},{"type":"function","title":"Bonfire.UI.Common.maybe_component/2","doc":"","ref":"Bonfire.UI.Common.html#maybe_component/2"},{"type":"function","title":"Bonfire.UI.Common.maybe_consume_uploaded_entries/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_consume_uploaded_entries/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_consume_uploaded_entry/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_consume_uploaded_entry/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_cute_gif/0","doc":"","ref":"Bonfire.UI.Common.html#maybe_cute_gif/0"},{"type":"function","title":"Bonfire.UI.Common.maybe_last_sentry_event_id/0","doc":"","ref":"Bonfire.UI.Common.html#maybe_last_sentry_event_id/0"},{"type":"function","title":"Bonfire.UI.Common.maybe_push_event/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_push_event/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_send_update/4","doc":"","ref":"Bonfire.UI.Common.html#maybe_send_update/4"},{"type":"function","title":"Bonfire.UI.Common.maybe_stream_insert/4","doc":"Inserts one or many items in an existing stream.\nSee `Phoenix.LiveView.stream_insert/4` for opts.","ref":"Bonfire.UI.Common.html#maybe_stream_insert/4"},{"type":"function","title":"Bonfire.UI.Common.opts_for_update_many_async/2","doc":"","ref":"Bonfire.UI.Common.html#opts_for_update_many_async/2"},{"type":"function","title":"Bonfire.UI.Common.patch_to/3","doc":"","ref":"Bonfire.UI.Common.html#patch_to/3"},{"type":"function","title":"Bonfire.UI.Common.path_fallback/2","doc":"","ref":"Bonfire.UI.Common.html#path_fallback/2"},{"type":"function","title":"Bonfire.UI.Common.redirect_self/1","doc":"","ref":"Bonfire.UI.Common.html#redirect_self/1"},{"type":"function","title":"Bonfire.UI.Common.redirect_to/3","doc":"","ref":"Bonfire.UI.Common.html#redirect_to/3"},{"type":"function","title":"Bonfire.UI.Common.redirect_to_previous_go/4","doc":"","ref":"Bonfire.UI.Common.html#redirect_to_previous_go/4"},{"type":"macro","title":"Bonfire.UI.Common.render_sface_or_native/1","doc":"","ref":"Bonfire.UI.Common.html#render_sface_or_native/1"},{"type":"function","title":"Bonfire.UI.Common.rich/2","doc":"","ref":"Bonfire.UI.Common.html#rich/2"},{"type":"function","title":"Bonfire.UI.Common.self_subscribe/2","doc":"Subscribe to assigns targeted at the current account/user","ref":"Bonfire.UI.Common.html#self_subscribe/2"},{"type":"function","title":"Bonfire.UI.Common.send_self/2","doc":"","ref":"Bonfire.UI.Common.html#send_self/2"},{"type":"function","title":"Bonfire.UI.Common.send_self_global/2","doc":"","ref":"Bonfire.UI.Common.html#send_self_global/2"},{"type":"function","title":"Bonfire.UI.Common.set_go_after/2","doc":"Save a `go` redirection path in the session (for redirecting somewhere after auth flows)","ref":"Bonfire.UI.Common.html#set_go_after/2"},{"type":"function","title":"Bonfire.UI.Common.socket_connected?/1","doc":"Checks if the socket is connected.","ref":"Bonfire.UI.Common.html#socket_connected?/1"},{"type":"function","title":"Examples - Bonfire.UI.Common.socket_connected?/1","doc":"iex> socket_connected?(%{socket_connected?: true})\n true\n\n iex> socket_connected?(%{socket_connected?: false})\n false\n\n iex> socket_connected?(%{__context__: %{socket_connected?: true}})\n true\n \n iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: 1})\n true\n\n iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: nil})\n false","ref":"Bonfire.UI.Common.html#socket_connected?/1-examples"},{"type":"function","title":"Bonfire.UI.Common.templated/2","doc":"","ref":"Bonfire.UI.Common.html#templated/2"},{"type":"function","title":"Bonfire.UI.Common.templated_or_remote_markdown/2","doc":"","ref":"Bonfire.UI.Common.html#templated_or_remote_markdown/2"},{"type":"function","title":"Bonfire.UI.Common.the_object/1","doc":"","ref":"Bonfire.UI.Common.html#the_object/1"},{"type":"function","title":"Bonfire.UI.Common.undead_mount/2","doc":"Run a function and expects tuple.\nIf anything else is returned, like an error, a flash message is shown to the user.","ref":"Bonfire.UI.Common.html#undead_mount/2"},{"type":"function","title":"Bonfire.UI.Common.undead_on_mount/2","doc":"","ref":"Bonfire.UI.Common.html#undead_on_mount/2"},{"type":"function","title":"Bonfire.UI.Common.undead_render/2","doc":"","ref":"Bonfire.UI.Common.html#undead_render/2"},{"type":"function","title":"Bonfire.UI.Common.undead_update/2","doc":"","ref":"Bonfire.UI.Common.html#undead_update/2"},{"type":"function","title":"Bonfire.UI.Common.update_many_async/2","doc":"","ref":"Bonfire.UI.Common.html#update_many_async/2"},{"type":"function","title":"Bonfire.UI.Common.update_many_async/3","doc":"","ref":"Bonfire.UI.Common.html#update_many_async/3"},{"type":"module","title":"Bonfire.UI.Common.ComponentID","doc":"","ref":"Bonfire.UI.Common.ComponentID.html"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.new/3","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#new/3"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.send_assigns/5","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#send_assigns/5"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.send_updates/4","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#send_updates/4"},{"type":"module","title":"Bonfire.UI.Common.Endpoint.LiveReload","doc":"","ref":"Bonfire.UI.Common.Endpoint.LiveReload.html"},{"type":"module","title":"Bonfire.UI.Common.EndpointTemplate","doc":"","ref":"Bonfire.UI.Common.EndpointTemplate.html"},{"type":"function","title":"Bonfire.UI.Common.EndpointTemplate.session_options/0","doc":"","ref":"Bonfire.UI.Common.EndpointTemplate.html#session_options/0"},{"type":"module","title":"Bonfire.UI.Common.ErrorHandling","doc":"","ref":"Bonfire.UI.Common.ErrorHandling.html"},{"type":"function","title":"Bonfire.UI.Common.ErrorHandling.undead/3","doc":"","ref":"Bonfire.UI.Common.ErrorHandling.html#undead/3"},{"type":"module","title":"Bonfire.UI.Common.ErrorHelpers","doc":"Conveniences for translating and building error messages.","ref":"Bonfire.UI.Common.ErrorHelpers.html"},{"type":"function","title":"Bonfire.UI.Common.ErrorHelpers.error_tag/2","doc":"Generates tag for inlined form input errors.\n# TODO: use `Surface.Components.Form.ErrorTag` instead","ref":"Bonfire.UI.Common.ErrorHelpers.html#error_tag/2"},{"type":"function","title":"Bonfire.UI.Common.ErrorHelpers.translate_error/1","doc":"Translates an error message using gettext.","ref":"Bonfire.UI.Common.ErrorHelpers.html#translate_error/1"},{"type":"module","title":"Bonfire.UI.Common.ErrorReportingPlug","doc":"","ref":"Bonfire.UI.Common.ErrorReportingPlug.html"},{"type":"module","title":"Bonfire.UI.Common.LiveHandlers","doc":"usage examples:\n\n`phx-submit=\"Bonfire.Posts:post\"` will be routed to `Bonfire.Posts.LiveHandler.handle_event(\"post\", ...`\n\n`PubSub.broadcast(feed_id, {{Bonfire.Social.Feeds, :new_activity}, activity})` will be routed to `Bonfire.Social.Feeds.LiveHandler.handle_info({:new_activity, activity}, ...`\n\n`href=\"?Bonfire.Social.Feeds[after]=<%= e(@page_info, :end_cursor, nil) %>\"` will be routed to `Bonfire.Social.Feeds.LiveHandler.handle_params(%{\"after\" => cursor_after} ...`","ref":"Bonfire.UI.Common.LiveHandlers.html"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.assign_attrs/2","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#assign_attrs/2"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_event/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_event/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_info/4","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_info/4"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_params/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_params/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_progress/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_progress/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.maybe_from_json/1","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#maybe_from_json/1"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.mod_delegate/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#mod_delegate/5"},{"type":"macro","title":"Bonfire.UI.Common.LiveHandlers.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs","doc":"Like a plug, but for a liveview","ref":"Bonfire.UI.Common.LivePlugs.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.maybe_send_persistent_assigns/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.html#maybe_send_persistent_assigns/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Csrf","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Csrf.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Csrf.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Helpers","doc":"Like a plug, but for a liveview","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Helpers.assign_default_params/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html#assign_default_params/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Helpers.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Locale","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.assign_put_locale/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#assign_put_locale/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.assign_put_locale/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#assign_put_locale/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.default/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#default/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.StaticChanged","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.StaticChanged.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.StaticChanged.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.call/2","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.init/1","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.maybe_make_request_path_static/2","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#maybe_make_request_path_static/2"},{"type":"module","title":"Bonfire.UI.Common.Modularity.DeclareHelpers","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html"},{"type":"function","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.component_props/1","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#component_props/1"},{"type":"function","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.component_type/1","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#component_type/1"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_module_optional/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_module_optional/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_nav_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_nav_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_nav_link/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_nav_link/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings/3","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings/3"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_nav_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_nav_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_nav_link/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_nav_link/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_widget/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_widget/2"},{"type":"module","title":"Bonfire.UI.Common.MultiTenancyPlug","doc":"","ref":"Bonfire.UI.Common.MultiTenancyPlug.html"},{"type":"module","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html#sigil_p/2"},{"type":"behaviour","title":"Bonfire.UI.Common.NavModule","doc":"Add items to extensions' navigation sidebar.","ref":"Bonfire.UI.Common.NavModule.html"},{"type":"function","title":"Bonfire.UI.Common.NavModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.NavModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.UI.Common.NavModule.declared_nav/0","doc":"Declares a nav module, with links or nav components","ref":"Bonfire.UI.Common.NavModule.html#c:declared_nav/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.modules/0","doc":"","ref":"Bonfire.UI.Common.NavModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav/0","doc":"Load all navs","ref":"Bonfire.UI.Common.NavModule.html#nav/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav/1","doc":"Get navs for an extension","ref":"Bonfire.UI.Common.NavModule.html#nav/1"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav_function_error/2","doc":"","ref":"Bonfire.UI.Common.NavModule.html#nav_function_error/2"},{"type":"module","title":"Bonfire.UI.Common.Notifications","doc":"","ref":"Bonfire.UI.Common.Notifications.html"},{"type":"function","title":"Bonfire.UI.Common.Notifications.assign_notification/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#assign_notification/2"},{"type":"function","title":"Bonfire.UI.Common.Notifications.handle_event/3","doc":"","ref":"Bonfire.UI.Common.Notifications.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.Notifications.handle_info/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#handle_info/2"},{"type":"function","title":"Bonfire.UI.Common.Notifications.notify_feeds/5","doc":"","ref":"Bonfire.UI.Common.Notifications.html#notify_feeds/5"},{"type":"function","title":"Bonfire.UI.Common.Notifications.notify_me/4","doc":"","ref":"Bonfire.UI.Common.Notifications.html#notify_me/4"},{"type":"function","title":"Bonfire.UI.Common.Notifications.receive_flash/3","doc":"","ref":"Bonfire.UI.Common.Notifications.html#receive_flash/3"},{"type":"function","title":"Bonfire.UI.Common.Notifications.receive_notification/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#receive_notification/2"},{"type":"macro","title":"Bonfire.UI.Common.Notifications.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Common.PlugProtect","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.allow_action/3","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#allow_action/3"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.block_action/3","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#block_action/3"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.call/2","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.init/1","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#init/1"},{"type":"module","title":"Bonfire.UI.Common.Plugs.ActivityPub","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.call/2","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.init/1","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.maybe_redirect/1","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#maybe_redirect/1"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.with_headers/3","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#with_headers/3"},{"type":"module","title":"Bonfire.UI.Common.Presence","doc":"WIP for tracking online users. Used by `PersistentLive`","ref":"Bonfire.UI.Common.Presence.html"},{"type":"function","title":"Bonfire.UI.Common.Presence.child_spec/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#child_spec/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.fetch/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#fetch/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.fetchers_pids/0","doc":"","ref":"Bonfire.UI.Common.Presence.html#fetchers_pids/0"},{"type":"function","title":"Bonfire.UI.Common.Presence.get_by_key/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#get_by_key/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.handle_info/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#handle_info/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.list/0","doc":"","ref":"Bonfire.UI.Common.Presence.html#list/0"},{"type":"function","title":"Bonfire.UI.Common.Presence.list/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#list/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.list_and_maybe_subscribe_to_presence/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#list_and_maybe_subscribe_to_presence/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.present!/2","doc":"Join a user to the list of those who are present","ref":"Bonfire.UI.Common.Presence.html#present!/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.present?/2","doc":"Check if a given user (or the current user) is in the list of those who are present","ref":"Bonfire.UI.Common.Presence.html#present?/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.present_meta/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#present_meta/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.track/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#track/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.track/4","doc":"","ref":"Bonfire.UI.Common.Presence.html#track/4"},{"type":"function","title":"Bonfire.UI.Common.Presence.untrack/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#untrack/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.untrack/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#untrack/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.update/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#update/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.update/4","doc":"","ref":"Bonfire.UI.Common.Presence.html#update/4"},{"type":"module","title":"Bonfire.UI.Common.PreviewContentLive","doc":"A special 'modal' for previewing objects from a feed without redirecting to a new view (so we can go back to where we were in the feed)","ref":"Bonfire.UI.Common.PreviewContentLive.html"},{"type":"module","title":"Properties - Bonfire.UI.Common.PreviewContentLive","doc":"* **id** *:string, required: true* - The id of the live component (required by LiveView for stateful components).\n\n* **source_inspector_attrs** *:map, default: %{}*\n* **title_text** *:string, default: nil* - The title of the modal. Only used if no title slot is passed.\n* **title_class** *:css_class, default: nil* - The classes of the title of the modal\n* **show** *:boolean, default: false* - Force modal to be open\n* **no_header** *:boolean, default: false* - Optional prop to hide the header at the top of the modal\n* **modal_class** *:string, default: nil* - The classes of the modal.\n* **modal_assigns** *:any, default: []* - Additional assigns for the modal\n\n* **opts** *:keyword, default: []* - Additional attributes to add onto the modal wrapper","ref":"Bonfire.UI.Common.PreviewContentLive.html#module-properties"},{"type":"module","title":"Slots - Bonfire.UI.Common.PreviewContentLive","doc":"* **default, arg: [:autocomplete]** - Slots for the contents of the modal, title, buttons...\n\n* **open_btn**\n* **action_btns**\n* **cancel_btn**\n* **title**\n* **extra_contents**","ref":"Bonfire.UI.Common.PreviewContentLive.html#module-slots"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.handle_event/3","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.mount/1","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#mount/1"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.render/1","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#render/1"},{"type":"macro","title":"Bonfire.UI.Common.PreviewContentLive.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.update/2","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#update/2"},{"type":"module","title":"Bonfire.UI.Common.ReusableModalLive","doc":"The classic **modal**","ref":"Bonfire.UI.Common.ReusableModalLive.html"},{"type":"module","title":"Properties - Bonfire.UI.Common.ReusableModalLive","doc":"* **id** *:string, required: true* - The id of the live component (required by LiveView for stateful components).\n\n* **source_inspector_attrs** *:map, default: %{}*\n* **title_text** *:string, default: nil* - The title of the modal. Only used if no title slot is passed.\n* **image_preview** *:boolean, default: false* - If the modal is a preview of an image, set this to true.\n* **title_class** *:css_class, default: nil* - The classes of the title of the modal\n* **modal_class** *:css_class, default: \"\"* - The classes of the modal.\n* **wrapper_class** *:css_class, default: nil* - The classes of the modal wrapper.\n* **action_btns_wrapper_class** *:css_class, default: nil* - The classes around the action/submit button(s) on the modal\n* **cancel_btn_class** *:css_class, default: nil* - The classes of the close/cancel button on the modal. Only used if no close_btn slot is passed.\n* **cancel_label** *:string, default: nil*\n* **show** *:boolean, default: false* - Force modal to be open\n* **form_opts** *:map, default: %{}*\n* **no_actions** *:boolean, default: false* - Optional prop to hide the actions at the bottom of the modal\n* **no_header** *:boolean, default: false* - Optional prop to hide the header at the top of the modal\n* **no_backdrop** *:boolean, default: false*\n* **opts** *:keyword, default: []* - Additional attributes to add onto the modal wrapper\n\n* **autocomplete** *:list, default: []*","ref":"Bonfire.UI.Common.ReusableModalLive.html#module-properties"},{"type":"module","title":"Slots - Bonfire.UI.Common.ReusableModalLive","doc":"* **open_btn, arg: [autocomplete: :list, value: :any]** - Slots for the contents of the modal, title, buttons...\n\n* **action_btns**\n* **cancel_btn**\n* **title**\n* **default, arg: [autocomplete: :list, value: :any]**","ref":"Bonfire.UI.Common.ReusableModalLive.html#module-slots"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.default_assigns/0","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#default_assigns/0"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.handle_event/3","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.mount/1","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#mount/1"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.render/1","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#render/1"},{"type":"macro","title":"Bonfire.UI.Common.ReusableModalLive.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.update/2","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#update/2"},{"type":"module","title":"Bonfire.UI.Common.Routes","doc":"","ref":"Bonfire.UI.Common.Routes.html"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_authed/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_authed/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_guest/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_guest/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_shared/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_shared/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.gon_js_config/0","doc":"Config keys to make available in JS (via Phoenix Gon lib)","ref":"Bonfire.UI.Common.Routes.html#gon_js_config/0"},{"type":"module","title":"Bonfire.UI.Common.SEO","doc":"","ref":"Bonfire.UI.Common.SEO.html"},{"type":"function","title":"Bonfire.UI.Common.SEO.config/0","doc":"Get configuration for SEO.\n\nconfig/0 will return all SEO config\nconfig/1 with SEO domain atom will return that domain's config","ref":"Bonfire.UI.Common.SEO.html#config/0"},{"type":"function","title":"Bonfire.UI.Common.SEO.open_graph_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#open_graph_config/1"},{"type":"function","title":"Bonfire.UI.Common.SEO.site_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#site_config/1"},{"type":"function","title":"Bonfire.UI.Common.SEO.twitter_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#twitter_config/1"},{"type":"module","title":"Bonfire.UI.Common.SEOImage","doc":"","ref":"Bonfire.UI.Common.SEOImage.html"},{"type":"function","title":"Bonfire.UI.Common.SEOImage.generate_path/6","doc":"","ref":"Bonfire.UI.Common.SEOImage.html#generate_path/6"},{"type":"behaviour","title":"Bonfire.UI.Common.SettingsModule","doc":"Settings nav & components","ref":"Bonfire.UI.Common.SettingsModule.html"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#app_modules/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.component_function_error/2","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#component_function_error/2"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.components/0","doc":"Load all components at once","ref":"Bonfire.UI.Common.SettingsModule.html#components/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.components/1","doc":"Load components for an extension","ref":"Bonfire.UI.Common.SettingsModule.html#components/1"},{"type":"callback","title":"Bonfire.UI.Common.SettingsModule.declared_component/0","doc":"Declares a component component","ref":"Bonfire.UI.Common.SettingsModule.html#c:declared_component/0"},{"type":"callback","title":"Bonfire.UI.Common.SettingsModule.declared_nav/0","doc":"Declares a nav module, with links or nav components","ref":"Bonfire.UI.Common.SettingsModule.html#c:declared_nav/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.extension_has_components?/2","doc":"List extensions that have settings component(s)","ref":"Bonfire.UI.Common.SettingsModule.html#extension_has_components?/2"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules/0","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules_component/1","doc":"Get components identified by their module","ref":"Bonfire.UI.Common.SettingsModule.html#modules_component/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules_nav/1","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#modules_nav/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav/0","doc":"Load all navs","ref":"Bonfire.UI.Common.SettingsModule.html#nav/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav/1","doc":"Get navs for an extension","ref":"Bonfire.UI.Common.SettingsModule.html#nav/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav_function_error/2","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#nav_function_error/2"},{"type":"module","title":"Bonfire.UI.Common.SmartInput.LiveHandler","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.active_smart_input_component/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#active_smart_input_component/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.active_smart_input_components/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#active_smart_input_components/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.activity_type_or_reply/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#activity_type_or_reply/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.all_smart_input_components/0","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#all_smart_input_components/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.assign_open/2","doc":"Open the composer by setting assigns","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#assign_open/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.close_smart_input/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#close_smart_input/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.confirm_close_smart_input/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#confirm_close_smart_input/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.max_length/0","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#max_length/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maximize/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maximize/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maybe_from_json/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maybe_from_json/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maybe_from_json_string/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maybe_from_json_string/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.minimize/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#minimize/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open_type/4","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open_type/4"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open_with_text_suggestion/3","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open_with_text_suggestion/3"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.replace_input_next_time/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#replace_input_next_time/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.reply_to_param/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#reply_to_param/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.reset_input/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#reset_input/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.set/2","doc":"Set assigns in the smart input from anywhere in the app (whether using a live component or sticky live view)","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#set/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.set_smart_input_text/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#set_smart_input_text/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.show_main/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#show_main/2"},{"type":"macro","title":"Bonfire.UI.Common.SmartInput.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.smart_input_name/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#smart_input_name/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.switch_smart_input_type/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#switch_smart_input_type/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.toggle_expanded/4","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#toggle_expanded/4"},{"type":"behaviour","title":"Bonfire.UI.Common.SmartInputModule","doc":"Find a smart input module via the object type(s) it can create, or vice versa. Backed by a global cache of known smart input modules.\n\nTo add a module to this list, you should declare `@behaviour Bonfire.UI.Common.SmartInputModule` in it and define a `smart_input_module/0` function which returns a list of object types that it can create.\n\nExample:\n```\n@behaviour Bonfire.UI.Common.SmartInputModule\ndef smart_input_module, do: [:page, Bonfire.Pages.Page]\n```\n\nYou can then open the smart input composer / object creator using that declared type, for example:\n```\n \n```","ref":"Bonfire.UI.Common.SmartInputModule.html"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.SmartInputModule.html#app_modules/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.modules/0","doc":"","ref":"Bonfire.UI.Common.SmartInputModule.html#modules/0"},{"type":"callback","title":"Bonfire.UI.Common.SmartInputModule.smart_input_module/0","doc":"Declares a smart input module","ref":"Bonfire.UI.Common.SmartInputModule.html#c:smart_input_module/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.smart_input_modules_types/0","doc":"Returns a list of smart input modules and the object type(s) it can create, and vice versa.","ref":"Bonfire.UI.Common.SmartInputModule.html#smart_input_modules_types/0"},{"type":"module","title":"Bonfire.UI.Common.StaticGenerator","doc":"Static-site generator which can take a list of URLs served by the current Phoenix server and output static HTML for them","ref":"Bonfire.UI.Common.StaticGenerator.html"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.base_path/0","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#base_path/0"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.batch/0","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#batch/0"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.file_exists_age/1","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#file_exists_age/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.file_exists_not_expired/1","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#file_exists_not_expired/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.generate/2","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#generate/2"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.get/3","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#get/3"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.maybe_generate/2","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#maybe_generate/2"},{"type":"module","title":"Bonfire.UI.Common.StaticGeneratorPlug","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.call/2","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.init/1","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.make_request_path_static/2","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#make_request_path_static/2"},{"type":"module","title":"Bonfire.UI.Common.Testing.Helpers","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_field_error/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_field_error/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_field_good/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_field_good/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash_kind/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash_kind/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash_message/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash_message/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_form_field_error/3","doc":"Helper function to test errors in form fields. Compatible with most recent versions of phoenix, unlike deprecated\nassert_field_error.","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_form_field_error/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_form_field_good/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_form_field_good/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/0","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/0"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_account!/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_account!/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_admin!/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_admin!/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_user!/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_user!/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_user_and_conn!/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_user_and_conn!/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fancy_fake_user!/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fancy_fake_user!/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fancy_fake_user_on_test_instance/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fancy_fake_user_on_test_instance/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_flash/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_flash/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_form_error/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_form_error/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_form_field_error/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_form_field_error/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_attr/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_attr/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_click/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_click/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_live/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_live/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_redirect/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_redirect/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_response/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_response/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_submit/4","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_submit/4"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_pubsub_wait/1","doc":"Wait for the LiveView to receive any queued PubSub broadcasts","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_pubsub_wait/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_sockets_disconnect/1","doc":"Disconnect all LiveViews associated with current user or account","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_sockets_disconnect/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_view_stop/1","doc":"Stop a specific LiveView","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_view_stop/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.qualifiers_to_input_name/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#qualifiers_to_input_name/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.render_stateful/3","doc":"Render stateful Surface or LiveView components","ref":"Bonfire.UI.Common.Testing.Helpers.html#render_stateful/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.render_stateless/3","doc":"Render stateless Surface or LiveView components","ref":"Bonfire.UI.Common.Testing.Helpers.html#render_stateless/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.session_conn/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#session_conn/1"},{"type":"behaviour","title":"Bonfire.UI.Common.WidgetModule","doc":"Widgets: components that can be added to the dashboard or sidebards","ref":"Bonfire.UI.Common.WidgetModule.html"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.UI.Common.WidgetModule.declared_widget/0","doc":"Declares a widget component","ref":"Bonfire.UI.Common.WidgetModule.html#c:declared_widget/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.modules/0","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widget/1","doc":"Get a widget identified by module","ref":"Bonfire.UI.Common.WidgetModule.html#widget/1"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widget_function_error/2","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#widget_function_error/2"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widgets/0","doc":"Load all widgets at once","ref":"Bonfire.UI.Common.WidgetModule.html#widgets/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widgets/1","doc":"Load widgets for an extension","ref":"Bonfire.UI.Common.WidgetModule.html#widgets/1"},{"type":"module","title":"Bonfire.UI.Coordination","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Coordination.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Coordination","doc":"","ref":"Bonfire.UI.Coordination.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Coordination","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Coordination.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Coordination.mailer/0","doc":"","ref":"Bonfire.UI.Coordination.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Coordination.remote_tag_id/0","doc":"","ref":"Bonfire.UI.Coordination.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.UI.Coordination.remote_tag_prefix/0","doc":"","ref":"Bonfire.UI.Coordination.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.UI.Coordination.repo/0","doc":"","ref":"Bonfire.UI.Coordination.html#repo/0"},{"type":"module","title":"Bonfire.UI.Coordination.FeedLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.Routes","doc":"","ref":"Bonfire.UI.Coordination.Routes.html"},{"type":"function","title":"Bonfire.UI.Coordination.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Coordination.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Coordination.TaskLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.TasksLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.TodoLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Groups","doc":"Pages and UI components for groups in Bonfire.\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Groups.html"},{"type":"module","title":"Roadmap - Bonfire.UI.Groups","doc":"[Group Milestone](https://github.com/bonfire-networks/bonfire-app/milestone/33)","ref":"Bonfire.UI.Groups.html#module-roadmap"},{"type":"module","title":"Sponsors - Bonfire.UI.Groups","doc":"[Nlnet](https://nlnet.nl/project/Bonfire-FederatedGroups/index.html) | [Become a sponsor](https://opencollective.com/bonfire-networks)","ref":"Bonfire.UI.Groups.html#module-sponsors"},{"type":"module","title":"📖 Documentation - Bonfire.UI.Groups","doc":"* [Website](https://bonfirenetworks.org) \n* [Set up an instance](docs/DEPLOY.md) - for testing and evaluation only!\n* [Hacking on Bonfire](docs/HACKING.md) \n* [Code documentation](https://doc.bonfirenetworks.org/api-reference.html#content) \n* [Community chat](https://matrix.to/#/%23bonfire-networks:matrix.org)","ref":"Bonfire.UI.Groups.html#module-documentation"},{"type":"module","title":"Copyright and License - Bonfire.UI.Groups","doc":"Copyright (c) 2020-2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Groups.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.UI.Groups.LiveHandler","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Groups.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Groups.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Groups.Routes","doc":"","ref":"Bonfire.UI.Groups.Routes.html"},{"type":"function","title":"Bonfire.UI.Groups.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Groups.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Groups.RuntimeConfig","doc":"","ref":"Bonfire.UI.Groups.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Groups.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Groups.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Groups.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Groups.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Kanban","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for a kanban app","ref":"Bonfire.UI.Kanban.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Kanban","doc":"","ref":"Bonfire.UI.Kanban.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Kanban","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Kanban.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Kanban.mailer/0","doc":"","ref":"Bonfire.UI.Kanban.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Kanban.remote_tag_id/0","doc":"","ref":"Bonfire.UI.Kanban.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.UI.Kanban.remote_tag_prefix/0","doc":"","ref":"Bonfire.UI.Kanban.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.UI.Kanban.repo/0","doc":"","ref":"Bonfire.UI.Kanban.html#repo/0"},{"type":"module","title":"Bonfire.UI.Kanban.BoardLive.GraphQL","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Kanban.HomeLive.GraphQL","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Kanban.Routes","doc":"","ref":"Bonfire.UI.Kanban.Routes.html"},{"type":"function","title":"Bonfire.UI.Kanban.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Kanban.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Me","doc":"![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Me](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) for functionality around accounts, users, profiles, authentication, etc.\n\nThis extension is meant to be used by other extensions like [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me), which provide logic for the UI to work with.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Me.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Me.html"},{"type":"module","title":"Stack - Bonfire.UI.Me","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Me.html#module-stack"},{"type":"module","title":"Scaffolding - Bonfire.UI.Me","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Me.html#module-scaffolding"},{"type":"module","title":"Other resources - Bonfire.UI.Me","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Me.html#module-other-resources"},{"type":"module","title":"Copyright and License - Bonfire.UI.Me","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Me.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Me.mailer/0","doc":"","ref":"Bonfire.UI.Me.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Me.repo/0","doc":"","ref":"Bonfire.UI.Me.html#repo/0"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.AccountRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AccountRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AccountRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.AdminRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AdminRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AdminRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.get_current/2","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#get_current/2"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.UserRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.UserRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.UserRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.Plugs.AccountRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AccountRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AccountRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.AdminRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AdminRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AdminRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.GuestOnly","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.GuestOnly.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.GuestOnly.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.UserRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.UserRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.UserRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Routes","doc":"","ref":"Bonfire.UI.Me.Routes.html"},{"type":"module","title":"Bonfire.UI.Me.RuntimeConfig","doc":"","ref":"Bonfire.UI.Me.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Me.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Me.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Me.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Me.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Messages.Routes","doc":"","ref":"Bonfire.UI.Messages.Routes.html"},{"type":"function","title":"Bonfire.UI.Messages.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Messages.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Messages.RuntimeConfig","doc":"","ref":"Bonfire.UI.Messages.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Messages.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Messages.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Messages.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Messages.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Moderation.RuntimeConfig","doc":"","ref":"Bonfire.UI.Moderation.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Moderation.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Moderation.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Moderation.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Moderation.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Posts.Routes","doc":"","ref":"Bonfire.UI.Posts.Routes.html"},{"type":"function","title":"Bonfire.UI.Posts.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Posts.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Posts.RuntimeConfig","doc":"","ref":"Bonfire.UI.Posts.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Posts.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Posts.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Posts.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Posts.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Reactions.Routes","doc":"","ref":"Bonfire.UI.Reactions.Routes.html"},{"type":"function","title":"Bonfire.UI.Reactions.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Reactions.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Reactions.RuntimeConfig","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.declared_extension/0","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#declared_extension/0"},{"type":"module","title":"Bonfire.UI.Reflow.Integration","doc":"","ref":"Bonfire.UI.Reflow.Integration.html"},{"type":"function","title":"Bonfire.UI.Reflow.Integration.mailer/0","doc":"","ref":"Bonfire.UI.Reflow.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Reflow.Integration.repo/0","doc":"","ref":"Bonfire.UI.Reflow.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.Routes","doc":"","ref":"Bonfire.UI.Reflow.Routes.html"},{"type":"function","title":"Bonfire.UI.Reflow.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Reflow.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Social.Benchmark","doc":"","ref":"Bonfire.UI.Social.Benchmark.html"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_backend/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_backend/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_full_backend/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_full_backend/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_full_get/1","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_full_get/1"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_page/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_page/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_queries_without_benchee/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_queries_without_benchee/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_query_methods/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_query_methods/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_render_page/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_render_page/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.live_feed/1","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#live_feed/1"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.misc/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#misc/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.render_feed/2","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#render_feed/2"},{"type":"module","title":"Bonfire.UI.Social.Graph.RuntimeConfig","doc":"","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Social.Graph.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Social.Graph.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Social.Integration","doc":"","ref":"Bonfire.UI.Social.Integration.html"},{"type":"function","title":"Bonfire.UI.Social.Integration.mailer/0","doc":"","ref":"Bonfire.UI.Social.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Social.Integration.repo/0","doc":"","ref":"Bonfire.UI.Social.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.Social.LivePush","doc":"Handles pushing activities (via PubSub) to active feeds and notifications","ref":"Bonfire.UI.Social.LivePush.html"},{"type":"function","title":"Bonfire.UI.Social.LivePush.hide_activity/2","doc":"","ref":"Bonfire.UI.Social.LivePush.html#hide_activity/2"},{"type":"function","title":"Bonfire.UI.Social.LivePush.notify/2","doc":"","ref":"Bonfire.UI.Social.LivePush.html#notify/2"},{"type":"function","title":"Bonfire.UI.Social.LivePush.notify/4","doc":"","ref":"Bonfire.UI.Social.LivePush.html#notify/4"},{"type":"function","title":"Bonfire.UI.Social.LivePush.notify_of_message/4","doc":"","ref":"Bonfire.UI.Social.LivePush.html#notify_of_message/4"},{"type":"function","title":"Bonfire.UI.Social.LivePush.notify_users/4","doc":"Sends a notification about an activity to a list of users, excluding the author/subject","ref":"Bonfire.UI.Social.LivePush.html#notify_users/4"},{"type":"function","title":"Bonfire.UI.Social.LivePush.prepare_activity/2","doc":"","ref":"Bonfire.UI.Social.LivePush.html#prepare_activity/2"},{"type":"function","title":"Bonfire.UI.Social.LivePush.push_activity/3","doc":"Receives an activity with a nested object, or vice versa, uses PubSub to pushes to feeds and optionally notifications","ref":"Bonfire.UI.Social.LivePush.html#push_activity/3"},{"type":"function","title":"Bonfire.UI.Social.LivePush.push_activity_object/4","doc":"Receives an activity *and* object, uses PubSub to pushes to feeds and optionally notifications, and returns an Activity.","ref":"Bonfire.UI.Social.LivePush.html#push_activity_object/4"},{"type":"module","title":"Bonfire.UI.Social.Routes","doc":"","ref":"Bonfire.UI.Social.Routes.html"},{"type":"function","title":"Bonfire.UI.Social.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Social.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Social.RuntimeConfig","doc":"","ref":"Bonfire.UI.Social.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Social.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Social.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Social.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Social.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Topics","doc":"","ref":"Bonfire.UI.Topics.html"},{"type":"module","title":"Bonfire.UI.Topics.LiveHandler","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Topics.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Topics.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Topics.Routes","doc":"","ref":"Bonfire.UI.Topics.Routes.html"},{"type":"function","title":"Bonfire.UI.Topics.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Topics.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Topics.RuntimeConfig","doc":"","ref":"Bonfire.UI.Topics.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Topics.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Topics.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Topics.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Topics.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateUnitForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateUnitForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateUnitForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.Integration","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.declared_extension/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.mailer/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.repo/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.RuntimeConfig","doc":"","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#process/2"},{"type":"module","title":"AnimalAvatarGenerator","doc":"Generate SVG avatars from a string seed. It should always return the same avatar for the corresponding seed.\n\nBased on https://www.npmjs.com/package/animal-avatar-generator (translated to Elixir, mostly by ChatGPT)","ref":"AnimalAvatarGenerator.html"},{"type":"function","title":"AnimalAvatarGenerator.avatar/2","doc":"","ref":"AnimalAvatarGenerator.html#avatar/2"},{"type":"function","title":"AnimalAvatarGenerator.avatar_face/2","doc":"","ref":"AnimalAvatarGenerator.html#avatar_face/2"},{"type":"function","title":"AnimalAvatarGenerator.brows/0","doc":"","ref":"AnimalAvatarGenerator.html#brows/0"},{"type":"function","title":"AnimalAvatarGenerator.clamp/3","doc":"","ref":"AnimalAvatarGenerator.html#clamp/3"},{"type":"function","title":"AnimalAvatarGenerator.create_background/3","doc":"","ref":"AnimalAvatarGenerator.html#create_background/3"},{"type":"function","title":"AnimalAvatarGenerator.create_blackout/1","doc":"","ref":"AnimalAvatarGenerator.html#create_blackout/1"},{"type":"function","title":"AnimalAvatarGenerator.create_svg/2","doc":"","ref":"AnimalAvatarGenerator.html#create_svg/2"},{"type":"function","title":"AnimalAvatarGenerator.darken/2","doc":"","ref":"AnimalAvatarGenerator.html#darken/2"},{"type":"function","title":"AnimalAvatarGenerator.ears/0","doc":"","ref":"AnimalAvatarGenerator.html#ears/0"},{"type":"function","title":"AnimalAvatarGenerator.empty_shape/0","doc":"","ref":"AnimalAvatarGenerator.html#empty_shape/0"},{"type":"function","title":"AnimalAvatarGenerator.eyes/0","doc":"","ref":"AnimalAvatarGenerator.html#eyes/0"},{"type":"function","title":"AnimalAvatarGenerator.faces/0","doc":"","ref":"AnimalAvatarGenerator.html#faces/0"},{"type":"function","title":"AnimalAvatarGenerator.hairs/0","doc":"","ref":"AnimalAvatarGenerator.html#hairs/0"},{"type":"function","title":"AnimalAvatarGenerator.muzzles/0","doc":"","ref":"AnimalAvatarGenerator.html#muzzles/0"},{"type":"function","title":"AnimalAvatarGenerator.patterns/0","doc":"","ref":"AnimalAvatarGenerator.html#patterns/0"},{"type":"module","title":"Arrows","doc":"A handful of (mostly) arrow macros with superpowers.","ref":"Arrows.html"},{"type":"module","title":"Installation - Arrows","doc":"The package can be installed by adding `arrows` to your list of dependencies in `mix.exs`: \n\n```elixir\ndef deps do\n [\n {:arrows, \"~> 0.2.0\"}\n ]\nend\n```\n\nOr via git:\n```elixir\ndef deps do\n [\n {:arrows, git: \"https://github.com/bonfire-networks/arrows\", branch: \"main\"}\n ]\nend\n```","ref":"Arrows.html#module-installation"},{"type":"module","title":"Documentation - Arrows","doc":"The Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). \n\nHere is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where\n double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"Arrows.html#module-documentation"},{"type":"module","title":"Ok-pipe - Arrows","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.\n\n\nDocumentation can be found at [https://hexdocs.pm/arrows](https://hexdocs.pm/arrows).","ref":"Arrows.html#module-ok-pipe"},{"type":"macro","title":"Arrows.<~>/2","doc":"Like `||`, except with the logic applied by `~>`","ref":"Arrows.html#%3C~%3E/2"},{"type":"function","title":"Arrows.from_ok/1","doc":"","ref":"Arrows.html#from_ok/1"},{"type":"function","title":"Arrows.ok/1","doc":"","ref":"Arrows.html#ok/1"},{"type":"function","title":"Arrows.ok_or/2","doc":"","ref":"Arrows.html#ok_or/2"},{"type":"function","title":"Arrows.to_ok/1","doc":"","ref":"Arrows.html#to_ok/1"},{"type":"macro","title":"Arrows.|>/2","doc":"A more flexible drop-in replacement for the standard elixir pipe operator.\n\nSpecial features are unlocked when using the `...` (ellipsis) on the right hand side:\n\n* The right hand side need not be a function, it can be any expression containing the ellipsis.\n* The ellipsis will be replaced with the result of evaluating the hand side expression.\n* You may use the ellipsis multiple times and the left hand side will be calculated exactly once.\n\nYou can do crazy stuff with the ellipsis, but remember that people have to read it!","ref":"Arrows.html#%7C%3E/2"},{"type":"macro","title":"Arrows.|||/2","doc":"","ref":"Arrows.html#%7C%7C%7C/2"},{"type":"macro","title":"Arrows.~>/2","doc":"Like `OK.~>`","ref":"Arrows.html#~%3E/2"},{"type":"module","title":"EctoSparkles","doc":"Some helpers to sparkle on top of [Ecto](https://hexdocs.pm/ecto/Ecto.html) \n\n- [`EctoSparkles.proload/3`](#proload-documentation) and `EctoSparkles.join_preload/2` to join and preload associations with less verbosity\n- [`EctoSparkles.reusable_join/5`](#reusable_join-documentation) to avoid duplicating joins \n- `EctoSparkles.Migrator` to run migrations, rollbacks, etc in a release and `EctoSparkles.AutoMigrator` to automatically run them at startup.\n- `EctoSparkles.DataMigration`: a behaviour implemented for data migrations (generally backfills).\n- `EctoSparkles.Log` to log slow or possible N+1 queries with telemetry (showing stacktraces)\n- `EctoSparkles.Changesets.Errors` to generate readable errors for changesets\n\nNOTE: you need to put something like `config :ecto_sparkles, :otp_app, :your_otp_app_name` in your app's config.\n\n\n## `proload` documentation\n\nA macro which tells Ecto to perform a join and preload of associations.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\n\nYou can make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see examples below).","ref":"EctoSparkles.html"},{"type":"module","title":"Examples using standard Ecto - EctoSparkles","doc":"```\n query\n |> join(:left, [o, activity: activity], assoc(:object), as: :object)\n |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})\n```\n\nEcto requires calling three different functions for this operation: `Query.join/4`, `Query.assoc/3` and `Query.preload/2`. \n\nHere's another example:\n\n```\n Invoice\n |> join(:left, [i], assoc(i, :customer), as: :customer)\n |> join(:left, [i], assoc(i, :lines), as: :lines)\n |> preload([lines: v, customers: c], lines: v, customer: c)\n```","ref":"EctoSparkles.html#module-examples-using-standard-ecto"},{"type":"module","title":"Example using proload - EctoSparkles","doc":"With `proload`, you can accomplish this with just one line of code:\n\n```\nproload(query, activity: [:object])\n```\n\nAnd for the other example:\n```\nproload(Invoice, [:customer, :lines])\n```\n\nAs a bonus, it automatically makes use of `reusable_join` so calling it multiple times with the same association has no ill effects.","ref":"EctoSparkles.html#module-example-using-proload"},{"type":"module","title":"Example using join_preload - EctoSparkles","doc":"`join_preload` is `proload`'s sister macro with a slightly different syntax:\n\n```\n join_preload(query, [:activity, :object])\n```\n\nand:\n```\n Invoice\n |> join_preload(:customer)\n |> join_preload(:lines)\n```\n\n\n## `reusable_join` documentation\n\nA macro similar to `Ecto.Query.join/{4,5}`, but can be called multiple times \nwith the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, its mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#module-example-using-join_preload"},{"type":"module","title":"Creating reusable joins - EctoSparkles","doc":"```elixir\nquery\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_a)\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_b)\n```","ref":"EctoSparkles.html#module-creating-reusable-joins"},{"type":"module","title":"Copyright - EctoSparkles","doc":"- Copyright (c) 2021 Bonfire developers\n- Copyright (c) 2020 Up Learn\n- Copyright (c) 2019 Joshua Nussbaum \n\n- `join_preload` was originally forked from [Ecto.Preloader](https://github.com/joshnuss/ecto_preloader), licensed under WTFPL)\n- `reusable_join` was originally forked from [QueryElf](https://gitlab.com/up-learn-uk/query-elf), licensed under Apache License Version 2.0\n- original code licensed under Apache License Version 2.0","ref":"EctoSparkles.html#module-copyright"},{"type":"macro","title":"EctoSparkles.join_preload/2","doc":"`join_preload` is a helper for preloading associations using joins.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\nYou could make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see example below).\n\nWith `EctoSparkles`, you can accomplish this with just one line of code.","ref":"EctoSparkles.html#join_preload/2"},{"type":"macro","title":"Example using just Ecto - EctoSparkles.join_preload/2","doc":"```\nimport Ecto.Query\nInvoice\n|> join(:left, [i], assoc(i, :customer), as: :customer)\n|> join(:left, [i, c], assoc(c, :account), as: :account)\n|> join(:left, [i], assoc(i, :lines), as: :lines)\n|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]})\n|> Repo.all()\n```","ref":"EctoSparkles.html#join_preload/2-example-using-just-ecto"},{"type":"macro","title":"Example using `join_preload` - EctoSparkles.join_preload/2","doc":"```\nimport EctoSparkles\nInvoice\n|> join_preload([:customer, :account])\n|> join_preload([:lines])\n|> Repo.all()\n```","ref":"EctoSparkles.html#join_preload/2-example-using-join_preload"},{"type":"macro","title":"EctoSparkles.proload/3","doc":"AKA `join_preload++`. It's more powerful, but it does it with more (and different!) syntax.\n\ne.g.\n```\nproload(query, activity: [\n :verb, :boost_count, :like_count, :replied,\n # relations under object will have their aliases prefixed with object_, i.e.\n # :object_message, :object_post, :object_post_content\n # the original names will still be used for the associations.\n object: {\"object_\", [:message, :post, :post_content]}\n])\n```","ref":"EctoSparkles.html#proload/3"},{"type":"macro","title":"EctoSparkles.reusable_join/5","doc":"`reusable_join` is similar to `Ecto.Query.join/{4,5}`, but can be called multiple times with the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, it is mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#reusable_join/5"},{"type":"module","title":"EctoSparkles.AutoMigrator","doc":"Runs ecto migrations automatically on startup (add this to your app's supervision tree)","ref":"EctoSparkles.AutoMigrator.html"},{"type":"function","title":"EctoSparkles.AutoMigrator.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"EctoSparkles.AutoMigrator.html#child_spec/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.init/1","doc":"","ref":"EctoSparkles.AutoMigrator.html#init/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.start_link/1","doc":"","ref":"EctoSparkles.AutoMigrator.html#start_link/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.startup_migrations/0","doc":"","ref":"EctoSparkles.AutoMigrator.html#startup_migrations/0"},{"type":"module","title":"EctoSparkles.Changesets.Errors","doc":"","ref":"EctoSparkles.Changesets.Errors.html"},{"type":"function","title":"EctoSparkles.Changesets.Errors.changeset_errors_string/2","doc":"","ref":"EctoSparkles.Changesets.Errors.html#changeset_errors_string/2"},{"type":"function","title":"EctoSparkles.Changesets.Errors.error/2","doc":"","ref":"EctoSparkles.Changesets.Errors.html#error/2"},{"type":"behaviour","title":"EctoSparkles.DataMigration","doc":"A behaviour implemented by our data migrations (generally backfills).\n\nBased on [A microframework for backfill migrations in Elixir's Ecto](https://tylerayoung.com/2023/08/13/migrations/), in turn based on David Bernheisel's [template for deterministic backfills](https://fly.io/phoenix-files/backfilling-data/#batching-deterministic-data).\n\nA data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. `priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs`):\n\n```elixir\ndefmodule MyApp.Repo.Migrations.BackfillOnboardingStep do\n alias EctoSparkles.DataMigration\n use DataMigration\n \n @impl DataMigration\n def base_query do\n # NOTE: This works in cases where:\n # 1. The data can be queried with a condition that not longer applies after the migration ran, so you can repeatedly query the data and update the data until the query result is empty. For example, if a column is currently null and will be updated to not be null, then you can query for the null records and pick up where you left off.\n # 2. The migration is written in such a way that it can be ran several times on the same data without causing data loss or duplication (or crashing).\n\n from(u in \"users\", # Notice how we do not use Ecto schemas here.\n where: is_nil(u.onboarding_step),\n select: %{id: u.id}\n )\n end\n\n @impl DataMigration\n def config do\n %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}\n end\n\n @impl DataMigration\n def migrate(results) do\n Enum.each(results, fn %{id: user_id} ->\n # hooks into a context module, which is more likely to be kept up to date as the app evolves, to avoid having to update old migrations\n user_id\n |> MyApp.Users.set_onboarding_step!()\n end)\n end\nend\n```","ref":"EctoSparkles.DataMigration.html"},{"type":"callback","title":"EctoSparkles.DataMigration.base_query/0","doc":"The core of the query you want to use to SELECT a map of your data.\nThe `DataMigration.Runner` will take care of limiting this to a batch size, ordering\nit by row ID, and restricting it to rows you haven't yet handled.\nThe query *must* select a map, and that map must have an `:id` key for the\nmigration runner to reference as the last-modified row in your table.","ref":"EctoSparkles.DataMigration.html#c:base_query/0"},{"type":"callback","title":"EctoSparkles.DataMigration.config/0","doc":"","ref":"EctoSparkles.DataMigration.html#c:config/0"},{"type":"callback","title":"EctoSparkles.DataMigration.migrate/1","doc":"The callback to operate on a result set from your query.\nImplementers should `raise` an error if you're unable to process the batch.","ref":"EctoSparkles.DataMigration.html#c:migrate/1"},{"type":"module","title":"EctoSparkles.DataMigration.Config","doc":"Configuration for a `DataMigration` behaviour module, used by the `DataMigration.Runner`.\n\nbatch size: how many elements from your table to migrate at a time. \n\nthrottle time: the amount of downtime the runner should sleep between batches.\n\nasync: Whether to run the migration in an async process, meaning the execution of the rest of the migrations (and the app startup if you're auto-migrating on start) won't be delayed. WARNING: this means the migration will be marked as done as soon as it starts, so if the process is interrupted it won't be re-run automatically.\n\nfirst_id: The very first ID when sorting UUIDs in ascending order. If you use integer IDs instead, this would be 0.","ref":"EctoSparkles.DataMigration.Config.html"},{"type":"module","title":"EctoSparkles.DataMigration.Runner","doc":"Runs a `DataMigration`","ref":"EctoSparkles.DataMigration.Runner.html"},{"type":"function","title":"EctoSparkles.DataMigration.Runner.run/1","doc":"","ref":"EctoSparkles.DataMigration.Runner.html#run/1"},{"type":"module","title":"EctoSparkles.ErlangTermBinary","doc":"A custom Ecto type for handling the serialization of arbitrary\ndata types stored as binary data in the database. Requires the\nunderlying DB field to be a binary.","ref":"EctoSparkles.ErlangTermBinary.html"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.cast/1","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#cast/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"EctoSparkles.ErlangTermBinary.html#cast/2"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.dump/1","doc":"Converting the data structure to binary for storage.","ref":"EctoSparkles.ErlangTermBinary.html#dump/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.embed_as/1","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#embed_as/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.equal?/2","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#equal?/2"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.load/1","doc":"Convert the raw binary value from the database back to\nthe desired term.\n\nUses `Plug.Crypto.non_executable_binary_to_term/2` - a restricted version of `:erlang.binary_to_term/2` that forbids executable terms, such as anonymous functions.\n\nThis function restricts atoms, with the [:safe] option set, so only existing (and loaded) atoms will be deserialized.","ref":"EctoSparkles.ErlangTermBinary.html#load/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.type/0","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#type/0"},{"type":"module","title":"EctoSparkles.JSONSerdeData","doc":"A custom Ecto type for handling the serialization of arbitrary data types stored as JSON data in the database. Requires the underlying DB field to be a map / JSONB field.","ref":"EctoSparkles.JSONSerdeData.html"},{"type":"function","title":"EctoSparkles.JSONSerdeData.cast/1","doc":"","ref":"EctoSparkles.JSONSerdeData.html#cast/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"EctoSparkles.JSONSerdeData.html#cast/2"},{"type":"function","title":"EctoSparkles.JSONSerdeData.dump/1","doc":"Converting the data structure to a JSON binary for storage.","ref":"EctoSparkles.JSONSerdeData.html#dump/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.embed_as/1","doc":"","ref":"EctoSparkles.JSONSerdeData.html#embed_as/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.equal?/2","doc":"","ref":"EctoSparkles.JSONSerdeData.html#equal?/2"},{"type":"function","title":"EctoSparkles.JSONSerdeData.load/1","doc":"Convert the JSON binary value from the database back to the desired term.","ref":"EctoSparkles.JSONSerdeData.html#load/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.type/0","doc":"","ref":"EctoSparkles.JSONSerdeData.html#type/0"},{"type":"module","title":"EctoSparkles.Log","doc":"Log Ecto queries, and output warnings for slow or possible n+1 queries\n\nTo set up, simply add `EctoSparkles.Log.setup(YourApp.Repo)` in your app's main `Application.start/2` module.","ref":"EctoSparkles.Log.html"},{"type":"function","title":"EctoSparkles.Log.check_if_n_plus_1/1","doc":"","ref":"EctoSparkles.Log.html#check_if_n_plus_1/1"},{"type":"function","title":"EctoSparkles.Log.format_log/4","doc":"","ref":"EctoSparkles.Log.html#format_log/4"},{"type":"function","title":"EctoSparkles.Log.handle_event/4","doc":"","ref":"EctoSparkles.Log.html#handle_event/4"},{"type":"function","title":"EctoSparkles.Log.inline_params/3","doc":"","ref":"EctoSparkles.Log.html#inline_params/3"},{"type":"function","title":"EctoSparkles.Log.log_query/4","doc":"","ref":"EctoSparkles.Log.html#log_query/4"},{"type":"function","title":"EctoSparkles.Log.setup/1","doc":"","ref":"EctoSparkles.Log.html#setup/1"},{"type":"module","title":"EctoSparkles.Migrator","doc":"","ref":"EctoSparkles.Migrator.html"},{"type":"function","title":"EctoSparkles.Migrator.create/0","doc":"","ref":"EctoSparkles.Migrator.html#create/0"},{"type":"function","title":"EctoSparkles.Migrator.create/2","doc":"","ref":"EctoSparkles.Migrator.html#create/2"},{"type":"function","title":"EctoSparkles.Migrator.migrate/0","doc":"","ref":"EctoSparkles.Migrator.html#migrate/0"},{"type":"function","title":"EctoSparkles.Migrator.migrate/1","doc":"","ref":"EctoSparkles.Migrator.html#migrate/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback/2","doc":"","ref":"EctoSparkles.Migrator.html#rollback/2"},{"type":"function","title":"EctoSparkles.Migrator.rollback_all/0","doc":"","ref":"EctoSparkles.Migrator.html#rollback_all/0"},{"type":"function","title":"EctoSparkles.Migrator.rollback_all/1","doc":"","ref":"EctoSparkles.Migrator.html#rollback_all/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback_to/1","doc":"","ref":"EctoSparkles.Migrator.html#rollback_to/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback_to/2","doc":"","ref":"EctoSparkles.Migrator.html#rollback_to/2"},{"type":"function","title":"EctoSparkles.Migrator.status/0","doc":"Print the migration status for configured Repos' migrations.","ref":"EctoSparkles.Migrator.html#status/0"},{"type":"module","title":"EctoSparkles.NPlus1Detector","doc":"Checks a query against the previous one and increments counter of collisions or swaps previous query with the last one.","ref":"EctoSparkles.NPlus1Detector.html"},{"type":"function","title":"EctoSparkles.NPlus1Detector.check/1","doc":"","ref":"EctoSparkles.NPlus1Detector.html#check/1"},{"type":"function","title":"EctoSparkles.NPlus1Detector.do_check/2","doc":"","ref":"EctoSparkles.NPlus1Detector.html#do_check/2"},{"type":"module","title":"EctoSparkles.SanitiseStrings","doc":"Provides functions for sanitising input on `Ecto.Changeset` string fields.","ref":"EctoSparkles.SanitiseStrings.html"},{"type":"function","title":"EctoSparkles.SanitiseStrings.clean_html/2","doc":"","ref":"EctoSparkles.SanitiseStrings.html#clean_html/2"},{"type":"function","title":"EctoSparkles.SanitiseStrings.sanitise_strings/2","doc":"","ref":"EctoSparkles.SanitiseStrings.html#sanitise_strings/2"},{"type":"function","title":"EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"Sanitises all changes in the given changeset that apply to field which are of the `:string` `Ecto` type.\n\nBy default it uses the `HtmlSanitizeEx.strip_tags/1` function on any change that satisfies all of the following conditions:\n1. The field associated with the change is of the type `:string`.\n2. The field associated with the change is not in the blacklisted_fields list of `opts` as defined using the `:except` key in `opts`.\nNote that this function will change the value in the `:changes` map of an\n`%Ecto.Changeset{}` struct if the given changes are sanitized.","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2"},{"type":"function","title":"Examples - EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"iex> attrs = %{string_field: \" Bad \"}\n iex> result_changeset =\n ...> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.strip_all_tags()\n iex> result_changeset.changes\n %{string_field: \"Bad\"}\nFields can be exempted from sanitization via the `:except` option.\n iex> attrs = %{string_field: \" Bad \"}\n iex> result_changeset =\n ...> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])\n iex> result_changeset.changes\n %{string_field: \" Bad \"}","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2-examples"},{"type":"function","title":"You can also specify a specific scrubber (by passing a function as reference): - EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"ies> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2-you-can-also-specify-a-specific-scrubber-by-passing-a-function-as-reference"},{"type":"module","title":"Exto","doc":"[![hex.pm](https://img.shields.io/hexpm/v/exto)](https://hex.pm/packages/exto)\n[hexdocs](https://hexdocs.pm/exto)\n\n`Exto` provides configuration-driven Ecto schema extensibility","ref":"Exto.html"},{"type":"module","title":"Usage - Exto","doc":"","ref":"Exto.html#module-usage"},{"type":"module","title":"Example Schema - Exto","doc":"```elixir\ndefmodule My.Schema do\n use Ecto.Schema\n import Exto, only: [flex_schema: 1]\n\n schema \"my_table\" do\n field :name, :string # just normal schema things\n flex_schema(:my_app) # boom! give me the stuff\n end\nend\n```\n\nOr if you want the `Access` protocol to be auto-implemented on the struct (because [the reasoning](https://hexdocs.pm/elixir/Access.html#module-maps-and-structs) for not having it on structs doesn't apply as much when using Exto), you can pull in the `Accessible` library by simply using `use Exto` instead of `import Exto`.","ref":"Exto.html#module-example-schema"},{"type":"module","title":"Example configuration - Exto","doc":"```elixir\nconfig :my_app, My.Schema,\n belongs_to: [\n foo: Foo, # belongs_to :foo, Foo\n bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer\n ],\n field: [\n foo: :string, # field :foo, :string\n bar: {:integer, default: 4}, # field :foo, :integer, default: 4\n ],\n has_one: [\n foo: Foo, # has_one :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id\n ]\n has_many: [\n foo: Foo, # has_many :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id\n ]\n many_to_many: [\n foo: Foo, # many_to_many :foo, Foo\n bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar\n ]\n```\n\nThis example won't work very well because it is redefining `foo` and `bar` 5 times, but you get the point.\n\nReading of configuration is done during compile time. The relations will be baked in during compilation, thus:\n\n* Do not expect this to work in runtime config.\n* You will need to rebuild all dependencies which use this macro when you change their configuration.","ref":"Exto.html#module-example-configuration"},{"type":"module","title":"Copyright and License - Exto","doc":"Copyright (c) 2020 Exto Contributors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Exto.html#module-copyright-and-license"},{"type":"macro","title":"Exto.flex_schema/1","doc":"Adds additional associations dynamically based on the config found under the name of the current module for the given OTP application. \n\nEach key maps to an Ecto.Schema function:\n\n* `belongs_to`\n* `field`\n* `has_many`\n* `has_one`\n* `many_to_many`\n\nEach of these keys should map to a keyword list where the key is the name of the field or association and the value is one of:\n\n* A type\n* A tuple of type and options (keyword list)","ref":"Exto.html#flex_schema/1"},{"type":"module","title":"Needle","doc":"> One foreign key to rule them all and in the darkness, bind them. - Gandalf, paraphrased.\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle)](https://hex.pm/packages/needle)\n[hexdocs](https://hexdocs.pm/needle)","ref":"Needle.html"},{"type":"module","title":"Intro - Needle","doc":"Bonfire uses the excellent PostgreSQL database for most data storage. PostgreSQL allows us to make a wide range of queries and to make them relatively fast while upholding data integrity guarantees.\n\nPostgres is a relational schema-led database - it expects you to pre-define tables and the fields in each table (represented in tabular form, i.e. as a collection of tables with each table consisting of a set of rows and columns). Fields can contain data or a reference to a row in another table. \n\nThis usually means that a field containing a reference has to be pre-defined with a foreign key pointing to a specific field (typically a primary key, like an ID column) *in a specific table*. \n\nA simple example would be a blogging app, which might have a `post` table with `author` field that references the `user` table.\n\nA social network, by contrast, is actually a graph of objects. Objects need to be able to refer to other objects by their ID without knowing their type. \n\nA simple example would be likes, you might have a `likes` table with `liked_post_id` field that references the `post` table. But you don't just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add `liked_video_id`, `liked_image_id`, etc?\n\nWe needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Needle`.\n\nThis guide is a brief introduction to Needle. It assumes some foundational knowledge:\n\n* Basic understanding of how relational databases like Postgresql work, in particular:\n * Tables being made up of fields.\n * What a primary key is and why it's useful.\n * Foreign keys and relationships between tables (1 to 1, 1 to Many, Many to 1, Many to Many).\n * Views as virtual tables backed by a SQL query.\n\n* Basic understanding of Elixir (enough to follow the examples).\n* Basic working knowledge of the [Ecto](https://hexdocs.pm/ecto/Ecto.html) database library (schema and migration definitions)","ref":"Needle.html#module-intro"},{"type":"module","title":"What is Needle? - Needle","doc":"A means of foreign keying many tables in one field. Designed for highly interlinked data in highly dynamic schemata where tracking all the foreign keys is neither desired nor practical.\n\n> A universal foreign key is actually a hard problem. Many approaches are on offer with a variety of tradeoffs. If plugging into Bonfire's Needle-based core extensions isn't a requirement for you (i.e. you don't need to put things into feeds or use boundaries for access-control) should carefully consider a variety of approaches rather than just blindly adopting the one that fitted our project's needs the best!","ref":"Needle.html#module-what-is-needle"},{"type":"module","title":"Identifying objects - the UID type - Needle","doc":"All referenceable objects in the system have a unique ID (primary key) whose type is the `Needle.UID`. `UUIDv7` and [ULIDs](https://github.com/ulid/spec) are a lot like standard `UUID` in that you can generate unique ones independently of the database. It's also a little different, being made up of two parts:\n\n* The current timestamp, to millisecond precision.\n* Strong random padding for uniqueness.\n\nThis means that it naturally sorts by time to the millisecond (close enough for us), giving us a performance advantage compared to queries ordered by a separate creation datetime field (by contrast, UUIDv4 is randomly distributed).\n\nIf you've only worked with integer primary keys before, you are probably used to letting the database dispense an ID for you. With `ULID` (or `UUID`), IDs can be known *before* they are stored, greatly easing the process of storing a graph of data and allowing us to do more of the preparation work outside of a transaction for increased performance.\n\nIn PostgreSQL, we actually store `UUIDv7` and `ULID`s as `UUID` columns, thanks to both being the same size (and the lack of specific column types shipping with postgresql). You mostly will not notice this because it's handled for you, but there are a few places it can come up:\n\n* Ecto debug and error output may show either binary values or UUID-formatted values.\n* Hand-written SQL may need to convert table IDs to the `UUID` format before use.","ref":"Needle.html#module-identifying-objects-the-uid-type"},{"type":"module","title":"It's just a table - Needle","doc":"The `Needle` system is mostly based around a single table represented by the `Needle.Pointer` schema with the following fields:\n\n* `id` (UID) - the database-wide unique id for the object, primary key.\n* `table_id` (UID) - identifies the type of the object, references `Needle.Table`.\n* `deleted_at` (timestamp, default: `null`) - when the object was deleted.\n\nEvery object that is stored in the system will have a record in this table. It may also have records in other tables (handy for storing more than 3 fields about the object!).\n\nA `Table` is a record of a table that may be linked to by a pointer. A `Pointer` is a pointer ID and a table ID.\nWith these two ingredients, we can construct a means of pointing to any table that has a `Table` entry.\n\nBut don't worry about `Needle.Table` for now, just know that every object type will have a record there so `Needle.Pointer.table_id` can reference it.","ref":"Needle.html#module-it-s-just-a-table"},{"type":"module","title":"Installation - Needle","doc":"Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.InitPointers do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up(), do: inits(:up)\n def down(), do: inits(:down)\n\n defp inits(dir) do\n init_pointers_ulid_extra(dir) # this one is optional but recommended\n init_pointers(dir) # this one is not optional\n end\nend\n```\n\n> Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.","ref":"Needle.html#module-installation"},{"type":"module","title":"Declaring Object Types - Needle","doc":"","ref":"Needle.html#module-declaring-object-types"},{"type":"module","title":"Picking a table id - Needle","doc":"The first step to declaring a new type is picking a unique table ID in UID format. \n\nYou could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.\n\nFor example, the ID for the `Feed` table is: `1TFEEDS0NTHES0V1S0FM0RTA1S`, which can be read as \"It feeds on the souls of mortals\". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:\n\n* The alphabet is [Crockford's Base32](https://en.wikipedia.org/wiki/Base32#Crockford's_Base32).\n* They must be 26 characters in length.\n* The first character must be a digit in the range 0-7.\n\nTo help you with this, the `Needle.UID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:\n\n```\niex(1)> Needle.UID.synthesise!(\"itfeedsonthesouls\")\n\n11:20:28.299 [error] Too short, need 9 chars.\n:ok\niex(2)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortalsandothers\")\n\n11:20:31.819 [warn] Too long, chopping off last 9 chars\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(3)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortals\")\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(4)> Needle.UID.synthesise!(\"gtfeedsonthesoulsofmortals\")\n\n11:21:03.268 [warn] First character must be a digit in the range 0-7, replacing with 7\n\"7TFEEDS0NTHES0V1S0FM0RTA1S\"\n```","ref":"Needle.html#module-picking-a-table-id"},{"type":"module","title":"Virtual pointables (\"virtuals\") - Needle","doc":"`Needle.Virtual` is the simplest and most common type of object. Here's a definition of block:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block do\n\n use Needle.Virtual,\n otp_app: :bonfire_data_social,\n table_id: \"310CK1NGSTVFFAV01DSSEE1NG1\",\n source: \"bonfire_data_social_block\"\n\n alias Bonfire.Data.Edges.Edge\n\n virtual_schema do\n has_one :edge, Edge, foreign_key: :id\n end\nend\n```\n\nIt should look quite similar to a mixin definition, except that we `use` `Needle.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.\n\nThe primary limitation of a virtual is that you cannot put extra fields on it. This also means that `belongs_to` is not generally permitted because it results in adding a field, while `has_one` and `has_many` work just fine as they do not cause the creation of fields in the schema.\n\nThis is not usually a problem, as extra fields can be put into [mixins](mixins-storing-data-about-objects) or [multimixins](#multimixins) as appropriate.\n\nIn all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.\n\n> Under the hood, a virtual has a writable view (in the above example, called `bonfire_data_social_block`). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the `pointers` table for you transparently. When you delete from the view, the corresponding `pointers` entry is marked deleted for you.\n\n> Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).","ref":"Needle.html#module-virtual-pointables-virtuals"},{"type":"module","title":"Pointables - Needle","doc":"The other, lesser used, type of object is called the `Needle.Pointable`. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.\n\n> When a record is inserted into a pointable table, a copy is made in the `pointers` table for you transparently. When you delete from the table, the the corresponding `pointers` entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.\n\nPointables pay for this flexibility by being slightly more expensive than virtuals:\n\n* Records must be inserted into/deleted from two tables (the pointable's table and the `pointers` table).\n* The pointable table needs its own primary key index.\n\nThe choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.\n\nHere is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity do\n\n use Needle.Pointable,\n otp_app: :bonfire_data_social,\n table_id: \"30NF1REAPACTTAB1ENVMBER0NE\",\n source: \"bonfire_data_social_apactivity\"\n\n pointable_schema do\n field :json, :map\n end\nend\n```\n\n\n> As you can see, to declare a pointable schema, we start by using `Needle.Pointable`, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.\n\n> We then call `pointable_schema` and define any fields we wish to put directly in the table. For the most part, `pointable_schema` is like Ecto's `schema` macro, except you do not provide the table name and let it handle the primary key.\n\n> If for some reason you wished to turn ID autogeneration off, you could pass `autogenerate: false` to the options provided when using `Needle.Pointable`.","ref":"Needle.html#module-pointables"},{"type":"module","title":"Adding re-usable fields - Needle","doc":"","ref":"Needle.html#module-adding-re-usable-fields"},{"type":"module","title":"Mixins - storing data about objects - Needle","doc":"Mixins are tables which contain extra information on behalf of objects. Each object can choose to\nrecord or not record information for each mixin. Sample mixins include:\n\n* user profile (containing a name, location and summary)\n* post content (containing the title, summary, and/or html body of a post or message)\n* created (containing the id of the object creator)\n\nIn this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.\n\nMixins are just tables too! The only requirement is they have a `UID` primary key which references `Needle.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro). \n\nHere is a sample mixin definition for a user profile:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_profile\"\n\n mixin_schema do\n field :name, :string\n field :summary, :string\n field :website, :string\n field :location, :string\n end\nend\n```\n\n> Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.\n\nAside from `use`ing `Needle.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of\n`schema`, pretty similar to a standard Ecto schema, right? \n\nThe arguments to `use Needle.Mixin` are:\n\n* `otp_app`: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)\n* `source`: the underlying table name to use in the database\n\nWe will cover dynamic configuration later. For now, you can use the OTP app that includes the module.","ref":"Needle.html#module-mixins-storing-data-about-objects"},{"type":"module","title":"Multimixins - Needle","doc":"Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.\n\nFor this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Needle.Pointer` and at least one other field which will collectively be unique.\n\nAn example multimixin is used for publishing an item to feeds:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_feed_publish\"\n\n alias Needle.Pointer\n\n mixin_schema do\n belongs_to :feed, Pointer, primary_key: true\n end\nend\n```\n\nNotice that this looks very similar to defining a mixin. Indeed, the only difference is the `primary_key: true` in this line, which adds a second field to the compound primary key.\nThis results in ecto recording a compound primary key of `(id, feed_id)` for the schema (the id is added for you as with regular mixins).","ref":"Needle.html#module-multimixins"},{"type":"module","title":"Writing Migrations - Needle","doc":"Migrations are typically included along with the schemas as public APIs you can call within your project's migrations.","ref":"Needle.html#module-writing-migrations"},{"type":"module","title":"Virtuals - Needle","doc":"Most virtuals are incredibly simple to migrate for:\n\n```elixir\ndefmodule Bonfire.Data.Social.Post.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Post\n\n def migrate_post(), do: migrate_virtual(Post)\n\nend\n```\n\nIf you need to do more work, it can be a little trickier. Here's an example for `block`, which also creates a unique index on another table:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n import Bonfire.Data.Edges.Edge.Migration\n alias Bonfire.Data.Social.Block\n\n def migrate_block_view(), do: migrate_virtual(Block)\n\n def migrate_block_unique_index(), do: migrate_type_unique_index(Block)\n\n def migrate_block(dir \\\\ direction())\n\n def migrate_block(:up) do\n migrate_block_view()\n migrate_block_unique_index()\n end\n\n def migrate_block(:down) do\n migrate_block_unique_index()\n migrate_block_view()\n end\n\nend\n```\n\nNotice how we have to write our `up` and `down` versions separately to get the correct ordering of operations.","ref":"Needle.html#module-virtuals"},{"type":"module","title":"Pointables - Needle","doc":"Migration example for a `Pointable`:\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity.Migration do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.APActivity\n\n defp make_apactivity_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do\n Ecto.Migration.add :json, :jsonb\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_apactivity_table, do: make_apactivity_table([])\n defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)\n\n def drop_apactivity_table(), do: drop_pointable_table(APActivity)\n\n defp maa(:up), do: make_apactivity_table([])\n defp maa(:down) do\n quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()\n end\n\n defmacro migrate_apactivity() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(maa(:up)),\n else: unquote(maa(:down))\n end\n end\n\nend\n```\n\nAs you can see, this `Pointable` migration a little trickier to define than a `Virtual` because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Greeting do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up() do\n create_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\") do\n add :greeting, :text, null: false\n end\n end\n\n def down() do\n drop_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\")\n end\nend\n```\n\n> As you can see, it's pretty similar to defining a regular migration, except you use `create_pointable_table` and\n`drop_pointable_table`. Notice that our sentinel UID makes an appearance again here. It's *very* important that these match what we declared in the schema.","ref":"Needle.html#module-pointables"},{"type":"module","title":"Mixins - Needle","doc":"Mixins look much like pointables:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Profile\n\n # create_profile_table/{0,1}\n\n defp make_profile_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do\n Ecto.Migration.add :name, :text\n Ecto.Migration.add :summary, :text\n Ecto.Migration.add :website, :text\n Ecto.Migration.add :location, :text\n Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)\n Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_profile_table(), do: make_profile_table([])\n defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)\n\n # drop_profile_table/0\n\n def drop_profile_table(), do: drop_mixin_table(Profile)\n\n # migrate_profile/{0,1}\n\n defp mp(:up), do: make_profile_table([])\n\n defp mp(:down) do\n quote do\n Bonfire.Data.Social.Profile.Migration.drop_profile_table()\n end\n end\n\n defmacro migrate_profile() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mp(:up)),\n else: unquote(mp(:down))\n end\n end\n\nend\n```","ref":"Needle.html#module-mixins"},{"type":"module","title":"Multimixins - Needle","doc":"Similar to mixins:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.FeedPublish\n\n @feed_publish_table FeedPublish.__schema__(:source)\n\n # create_feed_publish_table/{0,1}\n\n defp make_feed_publish_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do\n Ecto.Migration.add :feed_id,\n Needle.Migration.strong_pointer(), primary_key: true\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_feed_publish_table(), do: make_feed_publish_table([])\n defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body)\n\n def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish)\n\n def migrate_feed_publish_feed_index(dir \\\\ direction(), opts \\\\ [])\n def migrate_feed_publish_feed_index(:up, opts),\n do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts))\n def migrate_feed_publish_feed_index(:down, opts),\n do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts))\n\n defp mf(:up) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table()\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n end\n end\n\n defp mf(:down) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table()\n end\n end\n\n defmacro migrate_feed_publish() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mf(:up)),\n else: unquote(mf(:down))\n end\n end\n\n defmacro migrate_feed_publish(dir), do: mf(dir)\n\nend\n```","ref":"Needle.html#module-multimixins"},{"type":"module","title":"More examples - Needle","doc":"Take a look at a few of the migrations in our data libraries. Between them, they cover most\nscenarios by now:\n\n* [bonfire_data_social](https://github.com/bonfire-networks/bonfire_data_social/)\n* [bonfire_data_access_control](https://github.com/bonfire-networks/bonfire_data_access_control/)\n* [bonfire_data_identity](https://github.com/bonfire-networks/bonfire_data_identity/)\n* [bonfire_data_edges](https://github.com/bonfire-networks/bonfire_data_edges/) (feat. bonus triggers)\n\nIf you want to know exactly what's happening, you may want to read the code for\n[Needle.Migration](https://github.com/bonfire-networks/needle/blob/main/lib/migration.ex).","ref":"Needle.html#module-more-examples"},{"type":"module","title":"Configuration and overrides - Needle","doc":"Every pointable or mixin schema is overrideable with configuration\nduring compilation (this is why using them requires an `:otp_app` to\nbe specified). For example, we could override `Needle.Table` (which\nis a pointable table) thus:\n\n```elixir\nconfig :needle, Needle.Table, source: \"my_pointers_table\"\n```\n\nThe `table_id` is also configurable, but we don't recommend you change it.\n\nIn addition, all pointable and mixin schemas permit extension with [Exto](https://github.com/bonfire-networks/exto). See the `Exto`'s docs for more information about how to extend schemas via configuration. You will probably at the very least want to insert some `has_one` for mixins off your pointables.","ref":"Needle.html#module-configuration-and-overrides"},{"type":"module","title":"Referencing Pointables - Needle","doc":"Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically `belongs_to` with `Needle.Pointer`. The table in which we do this does not itself need to necessarily be a `Pointable`.\n\n```elixir\ndefmodule MyApp.Foo do\n\n use Ecto.Schema\n\n # regular ecto table, not pointable!\n schema \"hello\" do\n belongs_to :pointer, Needle.Pointer # who knows what it points to?\n end\nend\n```\n\nYou may choose to reference a specific schema rather than Pointer if it\nwill only point to a single table. If you do this, you must ensure\nthat the referenced record exists in that table in the normal\nway. There may be some performance benefit, we didn't benchmark it.\n\nThe migration is slightly more complex, we have to decide what type of\na pointer it is. Needle come in three categories:\n\n* A strong pointer is not nullable and is deleted when the object it\n points to is deleted.\n* A weak pointer is nullable and is nilified when the object it points\n to is deleted.\n* An unbreakable pointer will raise when you attempt to delete the\n object it points to.\n\n| Type | Nullable? | On Delete |\n|-------------|-----------|-------------|\n| Strong | No | Cascade |\n| Weak | Yes | Set Null |\n| Unbreakable | No | Raise |\n\nIn this case we will use a strong pointer, because we want it to be\ndeleted if the pointed object is deleted.\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Hello do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def change() do\n create_if_not_exists table(:hello) do\n add :pointer, strong_pointer(), null: false\n add :greeting, :text, null: false\n end\n end\nend\n```\n\nIf you are pointing to a specific table instead of pointer,\n`strong_pointer/1` allows you to pass the name of that module\n(`strong_pointer/0` calls this with `Needle.Pointer`).","ref":"Needle.html#module-referencing-pointables"},{"type":"module","title":"Dereferencing Pointables - Needle","doc":"It is common that even though you have a universal foreign key, you\nwill want to issue different queries based upon the type that is being\npointed to. For this reason, it is up to you to decide how to perform\nan onward query.\n\n`Needle.Pointers.schema/1` turns a `Pointer` into an Ecto schema module name\nyou can switch against. `Needle.Pointers.plan` breaks down a list of Needle\ninto a map of ids keyed by schema module. It is handy to define some\nfunctions in your (non-library) application that can load any type of\npointer in given contexts.","ref":"Needle.html#module-dereferencing-pointables"},{"type":"module","title":"Inserting data - Needle","doc":"","ref":"Needle.html#module-inserting-data"},{"type":"module","title":"Elixir-based logic - Needle","doc":"The practical result of needle is that it pushes a certain amount of\nvalidation and consistency logic back into elixir land. It is\ntherefore your elixir code's responsibility to ensure that data is\ninserted into the appropriate mixin tables when inserting a pointable\nobject and to manage deletions as appropriate.\n\nWhen assembling queries with mixin tables, pay careful attention to\nthe type of join you are performing. An inner join is explicitly\nasking not to be shown objects that do not have a record for that\nmixin. You quite possibly wanted to left join.","ref":"Needle.html#module-elixir-based-logic"},{"type":"module","title":"Querying Needle - Needle","doc":"Since `Pointer` has a table, you can use its `table_id` field to\nfilter by pointed type. `Needle.Tables.id!/1` (or `ids!/1` for a\nlist) can be used to obtain the IDs for a table or tables.","ref":"Needle.html#module-querying-needle"},{"type":"module","title":"Tradeoffs - Needle","doc":"All solutions to the universal primary key problem have tradeofs. Here\nare what we see as the deficiencies in our approach:\n\n1. It forces a UUIDv7 or ULID on you. This is great for us, but not\n everyone. They both expose a timestamp with millisecond precision. \n If the time of creation of a resource is sensitive information for\n your purposes, they may not going to be suitable for you.\n2. Ecto has no knowledge of the specialty of `Pointer`,\n e.g. `Repo.preload` does not work and you need to specify a join\n condition to join through a pointer. Use our functions or add extra\n associations with exto configuration.\n3. Dereferencing a list of needle requires a select query per table\n type that occurs in the input set.\n4. Reliance on user attention. You have to follow the instructions\n correctly to make the system work at all.\n5. There is likely some performance impact from postgres not\n understanding the relationships between the various tables\n properly. It's hard to gauge and we haven't even tried.\n\nThese are not likely to change. If you're going to pick\nthis library, do so in the full knowledge of the tradeoffs it makes.\n\nAlternatives include (I'm sure you can think of others):\n\n* Storing the table name in a second column alongside every foreign key.\n* A compound datatype of id and table name.\n* Byte/String manipulation tricks.\n* Evil SQL hacks based upon compile time configuration.\n\nWhile we have our gripes with this approach, once you've gotten the\nhang of using it, it works out pretty well for most purposes and it's\none of the simpler options to work with.","ref":"Needle.html#module-tradeoffs"},{"type":"module","title":"Copyright and License - Needle","doc":"Copyright (c) 2020 needle Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Needle.html#module-copyright-and-license"},{"type":"function","title":"Needle.is_needle?/2","doc":"","ref":"Needle.html#is_needle?/2"},{"type":"module","title":"Needle.Changesets","doc":"","ref":"Needle.Changesets.html"},{"type":"function","title":"Needle.Changesets.build_assoc/3","doc":"Like Ecto.build_assoc/3, but can work with a Changeset","ref":"Needle.Changesets.html#build_assoc/3"},{"type":"function","title":"Needle.Changesets.built?/1","doc":"True if the schema object's current state is `:built`","ref":"Needle.Changesets.html#built?/1"},{"type":"function","title":"Needle.Changesets.cast/3","doc":"Like `Ecto.Changeset.cast` but for Pointables, Virtuals and Mixins.\n\nIf a pointable or virtual, Generates an ID if one is not present.","ref":"Needle.Changesets.html#cast/3"},{"type":"function","title":"Needle.Changesets.cast_assoc/3","doc":"","ref":"Needle.Changesets.html#cast_assoc/3"},{"type":"function","title":"Needle.Changesets.cast_belongs_to/4","doc":"","ref":"Needle.Changesets.html#cast_belongs_to/4"},{"type":"function","title":"Needle.Changesets.cast_has_many/4","doc":"","ref":"Needle.Changesets.html#cast_has_many/4"},{"type":"function","title":"Needle.Changesets.cast_has_one/4","doc":"","ref":"Needle.Changesets.html#cast_has_one/4"},{"type":"function","title":"Needle.Changesets.config_for/3","doc":"","ref":"Needle.Changesets.html#config_for/3"},{"type":"function","title":"Needle.Changesets.deleted?/1","doc":"True if the schema object's current state is `:deleted`","ref":"Needle.Changesets.html#deleted?/1"},{"type":"function","title":"Needle.Changesets.get_field/2","doc":"","ref":"Needle.Changesets.html#get_field/2"},{"type":"function","title":"Needle.Changesets.insert_verb/1","doc":"","ref":"Needle.Changesets.html#insert_verb/1"},{"type":"function","title":"Needle.Changesets.loaded?/1","doc":"True if the schema object's current state is `:loaded`","ref":"Needle.Changesets.html#loaded?/1"},{"type":"function","title":"Needle.Changesets.merge_child_errors/1","doc":"","ref":"Needle.Changesets.html#merge_child_errors/1"},{"type":"function","title":"Needle.Changesets.put_assoc/3","doc":"Like `put_assoc!/3` but doesn't raise if the association doesn't exist","ref":"Needle.Changesets.html#put_assoc/3"},{"type":"function","title":"Needle.Changesets.put_assoc!/3","doc":"Like `Ecto.Changeset.put_assoc/3` but for Pointables, Virtuals and Mixins.\n\nCopies across keys where possible.","ref":"Needle.Changesets.html#put_assoc!/3"},{"type":"function","title":"Needle.Changesets.put_id_on_mixins/3","doc":"","ref":"Needle.Changesets.html#put_id_on_mixins/3"},{"type":"function","title":"Needle.Changesets.put_new_id/2","doc":"","ref":"Needle.Changesets.html#put_new_id/2"},{"type":"function","title":"Needle.Changesets.state/1","doc":"Returns the schema object's current state.","ref":"Needle.Changesets.html#state/1"},{"type":"function","title":"Needle.Changesets.update_data/2","doc":"","ref":"Needle.Changesets.html#update_data/2"},{"type":"function","title":"Needle.Changesets.valid?/1","doc":"true if the provided changeset or list of changesets is valid.","ref":"Needle.Changesets.html#valid?/1"},{"type":"module","title":"Needle.Form","doc":"","ref":"Needle.Form.html"},{"type":"macro","title":"Needle.Form.form_schema/1","doc":"","ref":"Needle.Form.html#form_schema/1"},{"type":"function","title":"Needle.Form.using/2","doc":"","ref":"Needle.Form.html#using/2"},{"type":"module","title":"Needle.Migration","doc":"Helpers for writing Pointer-aware migrations.","ref":"Needle.Migration.html"},{"type":"function","title":"Needle.Migration.add_is_not_deleted/1","doc":"","ref":"Needle.Migration.html#add_is_not_deleted/1"},{"type":"macro","title":"Needle.Migration.create_mixin_table/3","doc":"Creates a mixin table - one with a UID primary key and no trigger","ref":"Needle.Migration.html#create_mixin_table/3"},{"type":"macro","title":"Needle.Migration.create_pointable_table/2","doc":"Creates a pointable table along with its trigger.","ref":"Needle.Migration.html#create_pointable_table/2"},{"type":"macro","title":"Needle.Migration.create_pointable_table/3","doc":"","ref":"Needle.Migration.html#create_pointable_table/3"},{"type":"macro","title":"Needle.Migration.create_pointable_table/4","doc":"","ref":"Needle.Migration.html#create_pointable_table/4"},{"type":"macro","title":"Needle.Migration.create_random_table/3","doc":"Creates a random table - one with a UUID v4 primary key.","ref":"Needle.Migration.html#create_random_table/3"},{"type":"function","title":"Needle.Migration.create_virtual/1","doc":"","ref":"Needle.Migration.html#create_virtual/1"},{"type":"function","title":"Needle.Migration.create_virtual/2","doc":"","ref":"Needle.Migration.html#create_virtual/2"},{"type":"function","title":"Needle.Migration.create_virtual_trigger_function/0","doc":"","ref":"Needle.Migration.html#create_virtual_trigger_function/0"},{"type":"function","title":"Needle.Migration.drop_mixin_table/1","doc":"Drops a mixin table.","ref":"Needle.Migration.html#drop_mixin_table/1"},{"type":"function","title":"Needle.Migration.drop_pointable_table/1","doc":"Drops a pointable table","ref":"Needle.Migration.html#drop_pointable_table/1"},{"type":"function","title":"Needle.Migration.drop_pointable_table/2","doc":"","ref":"Needle.Migration.html#drop_pointable_table/2"},{"type":"function","title":"Needle.Migration.drop_random_table/1","doc":"Drops a random table.","ref":"Needle.Migration.html#drop_random_table/1"},{"type":"function","title":"Needle.Migration.drop_table/1","doc":"","ref":"Needle.Migration.html#drop_table/1"},{"type":"function","title":"Needle.Migration.drop_virtual/1","doc":"","ref":"Needle.Migration.html#drop_virtual/1"},{"type":"function","title":"Needle.Migration.drop_virtual/2","doc":"","ref":"Needle.Migration.html#drop_virtual/2"},{"type":"function","title":"Needle.Migration.init_pointers/0","doc":"When migrating up: initialises the pointers database.\nWhen migrating down: deinitialises the pointers database.","ref":"Needle.Migration.html#init_pointers/0"},{"type":"function","title":"Needle.Migration.init_pointers/1","doc":"Given `:up`: initialises the pointers database.\nGiven `:down`: deinitialises the pointers database.","ref":"Needle.Migration.html#init_pointers/1"},{"type":"function","title":"Needle.Migration.init_pointers_ulid_extra/0","doc":"","ref":"Needle.Migration.html#init_pointers_ulid_extra/0"},{"type":"function","title":"Needle.Migration.migrate_virtual/1","doc":"","ref":"Needle.Migration.html#migrate_virtual/1"},{"type":"function","title":"Needle.Migration.migrate_virtual/2","doc":"","ref":"Needle.Migration.html#migrate_virtual/2"},{"type":"function","title":"Needle.Migration.migrate_virtual/3","doc":"","ref":"Needle.Migration.html#migrate_virtual/3"},{"type":"function","title":"Needle.Migration.pointer/2","doc":"Creates a strong, weak or unbreakable pointer depending on `type`.","ref":"Needle.Migration.html#pointer/2"},{"type":"function","title":"Needle.Migration.strong_pointer/1","doc":"A reference to a pointer for use with `add/3`. A strong pointer will\nbe deleted when the thing it's pointing to is deleted.","ref":"Needle.Migration.html#strong_pointer/1"},{"type":"function","title":"Needle.Migration.unbreakable_pointer/1","doc":"A reference to a pointer for use with `add/3`. An unbreakable\npointer will prevent the thing it's pointing to from being deleted.","ref":"Needle.Migration.html#unbreakable_pointer/1"},{"type":"function","title":"Needle.Migration.weak_pointer/1","doc":"A reference to a pointer for use with `add/3`. A weak pointer will\nbe set null when the thing it's pointing to is deleted.","ref":"Needle.Migration.html#weak_pointer/1"},{"type":"type","title":"Needle.Migration.pointer_type/0","doc":"","ref":"Needle.Migration.html#t:pointer_type/0"},{"type":"module","title":"Needle.Mixin","doc":"If a Pointer represents an object, mixins represent data about the object. Mixins collate optional\nadditional information about an object. Different types of object will typically make use of\ndifferent mixins. You can see these as aspects of the data if you like.\n\nA mixin table starts with an `id` column which references `Pointer` and forms the default primary\nkey. It is up to the user to choose which other fields go in the table, and thus what the mixin is for.\n\nUse of a mixin is typically through `has_one`:\n\n```\nhas_one :my_mixin, MyMixin, foreign_key: :id, references: :id\n```\n\nSometimes, the user may wish to add fields to the primary key by using the `primary_key: true`\noption to `add` in their migrations. This is permitted and in such case we call the resulting\nmixin a `multimixin`. Use becomes `has_many`:\n\n```\nhas_many :my_mixin, MyMixin, foreign_key: :id, references: :id\n```\n\nThus the choice of single or multi comes down to how many times you want to store that data for\nthe object. A user's profile naturally lends itself to a regular `single` mixin, whereas an\nobject's appearance in a feed would naturally lend itself to being a multimixin since the object\nmay appear in many feeds.","ref":"Needle.Mixin.html"},{"type":"module","title":"Declaring a mixin table type - Needle.Mixin","doc":"```\ndefmodule My.Mixin do\n\n use Needle.Mixin,\n otp_app: :my_app,\n source: \"postgres_table_name\"\n\n mixin_schema do\n field :is_awesome, :boolean\n end\nend\n```","ref":"Needle.Mixin.html#module-declaring-a-mixin-table-type"},{"type":"macro","title":"Needle.Mixin.mixin_schema/1","doc":"","ref":"Needle.Mixin.html#mixin_schema/1"},{"type":"function","title":"Needle.Mixin.using/2","doc":"","ref":"Needle.Mixin.html#using/2"},{"type":"exception","title":"Needle.NotFound","doc":"We could not find the requested object","ref":"Needle.NotFound.html"},{"type":"function","title":"Needle.NotFound.new/1","doc":"Creates a new NotFound","ref":"Needle.NotFound.html#new/1"},{"type":"type","title":"Needle.NotFound.t/0","doc":"","ref":"Needle.NotFound.html#t:t/0"},{"type":"module","title":"Needle.Pointable","doc":"Sets up an Ecto Schema for a Pointable table.","ref":"Needle.Pointable.html"},{"type":"module","title":"Sample Usage - Needle.Pointable","doc":"```\nuse Needle.Pointable,\n otp_app: :my_app, # your OTP application's name\n source: \"my_table\", # default name of table in database\n table_id: \"01EBTVSZJ6X02J01R1XWWPWGZW\" # unique UID to identify table\n\npointable_schema do\n # ... fields go here, if any\nend\n```","ref":"Needle.Pointable.html#module-sample-usage"},{"type":"module","title":"Overriding with configuration - Needle.Pointable","doc":"During `use` (i.e. compilation time), we will attempt to load\nconfiguration from the provided `:otp_app` under the key of the\ncurrent module. Any values provided here will override the defaults\nprovided to `use`. This allows you to configure them after the fact.\n\nAdditionally, pointables use `Exto`'s `flex_schema()`, so you can\nprovide additional configuration for those in the same place.\n\nI shall say it again because it's important: This happens at\n*compile time*. You must rebuild the app containing the pointable\nwhenever the configuration changes.","ref":"Needle.Pointable.html#module-overriding-with-configuration"},{"type":"module","title":"Introspection - Needle.Pointable","doc":"Defines a function `__pointers__/1` to introspect data. Recognised\nparameters:\n\n`:role` - `:pointable`\n`:table_id` - retrieves the UID id of the pointable table.\n`:otp_app` - retrieves the OTP application to which this belongs.","ref":"Needle.Pointable.html#module-introspection"},{"type":"macro","title":"Needle.Pointable.pointable_schema/1","doc":"","ref":"Needle.Pointable.html#pointable_schema/1"},{"type":"module","title":"Needle.Pointer","doc":"A Pointer is any object that can be referenced by its id.\n\nPointer is a simple table consisting of three fields:\n* id - the database-unique id for this pointer in UID format.\n* table_id - a type tag, references `Table`.\n* deleted_at - timestamp of when the object was deleted, null by default.\n\nTo reference `any` object, simply reference `Pointer`:\n\n```\nalias Needle.Pointer\nbelongs_to :object, Pointer\n```\n\nTo define a new object type there are two options, you should choose one:\n\n* `Virtual` - an object type with a view over `Pointer` limited by type.\n* `Pointable` - an object type with a table which is kept synchronised with `Pointer`.\n\nFor most purposes, you should use a `Virtual`. Pointable exists mostly to support existing code.\nThe major difference in practice is that you cannot add new fields to a virtual. Most of the time\nyou will want to store such extra fields in one or more mixins anyway so they may be reused.\n\nSee `Mixin` for more information about mixins.","ref":"Needle.Pointer.html"},{"type":"function","title":"Needle.Pointer.create/2","doc":"Changeset for creating a Pointer","ref":"Needle.Pointer.html#create/2"},{"type":"function","title":"Needle.Pointer.delete/2","doc":"","ref":"Needle.Pointer.html#delete/2"},{"type":"function","title":"Needle.Pointer.get/3","doc":"","ref":"Needle.Pointer.html#get/3"},{"type":"function","title":"Needle.Pointer.put/3","doc":"","ref":"Needle.Pointer.html#put/3"},{"type":"module","title":"Needle.Pointers","doc":"A context for working with Needle, a sort of global foreign key scheme.","ref":"Needle.Pointers.html"},{"type":"function","title":"Needle.Pointers.assert_points_to!/2","doc":"Return the provided pointer when it belongs to table queryable by the given table search term.","ref":"Needle.Pointers.html#assert_points_to!/2"},{"type":"function","title":"Needle.Pointers.cast!/1","doc":"Returns a Pointer, either the one provided or a synthesised one\npointing to the provided schema object. Does not hit the database or\ncause the pointer to be written to the database whatsoever.","ref":"Needle.Pointers.html#cast!/1"},{"type":"function","title":"Needle.Pointers.get_table_id!/1","doc":"","ref":"Needle.Pointers.html#get_table_id!/1"},{"type":"function","title":"Needle.Pointers.plan/1","doc":"Given a list of pointers which may or may have their pointed loaded,\nreturn a plan for preloading, a map of module name to set of loadable IDs.","ref":"Needle.Pointers.html#plan/1"},{"type":"function","title":"Needle.Pointers.query_base/1","doc":"Returns a basic query over non-deleted pointable objects in the system,\noptionally limited to one or more types.\n\nIf the type is set to a Pointable, Virtual or Mixin schema, records\nwill be selected from that schema directly. It is assumed this\nfilters deleted records by construction.\n\nOtherwise, will query from Pointer, filtering not is_nil(deleted_at)","ref":"Needle.Pointers.html#query_base/1"},{"type":"function","title":"Needle.Pointers.schema/1","doc":"","ref":"Needle.Pointers.html#schema/1"},{"type":"function","title":"Needle.Pointers.table/1","doc":"Looks up the table for a given pointer","ref":"Needle.Pointers.html#table/1"},{"type":"module","title":"Needle.Random","doc":"A securely randomly generated UUID keyed table. Not pointable.","ref":"Needle.Random.html"},{"type":"macro","title":"Needle.Random.random_schema/1","doc":"","ref":"Needle.Random.html#random_schema/1"},{"type":"function","title":"Needle.Random.using/2","doc":"","ref":"Needle.Random.html#using/2"},{"type":"module","title":"Needle.Table","doc":"One Table to rule them all. A record of a table participating in the\npointers abstraction - mandatory if participating.","ref":"Needle.Table.html"},{"type":"function","title":"Needle.Table.delete/2","doc":"","ref":"Needle.Table.html#delete/2"},{"type":"function","title":"Needle.Table.get/3","doc":"","ref":"Needle.Table.html#get/3"},{"type":"function","title":"Needle.Table.put/3","doc":"","ref":"Needle.Table.html#put/3"},{"type":"type","title":"Needle.Table.t/0","doc":"","ref":"Needle.Table.html#t:t/0"},{"type":"module","title":"Needle.Tables","doc":"A Global cache of Tables to be queried by their (Pointer) IDs, table\nnames or Ecto Schema module names.\n\nUse of the Table Service requires:\n\n1. You have run the migrations shipped with this library.\n2. You have started `Needle.Tables` before querying.\n3. All OTP applications with pointable Ecto Schemata to be added to the schema path.\n4. OTP 21.2 or greater, though we recommend using the most recent release available.\n\nWhile this module is a GenServer, it is only responsible for setup\nof the cache and then exits with :ignore having done so. It is not\nrecommended to restart the service as this will lead to a stop the\nworld garbage collection of all processes and the copying of the\nentire cache to each process that has queried it since its last\nlocal garbage collection.","ref":"Needle.Tables.html"},{"type":"function","title":"Needle.Tables.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Needle.Tables.html#child_spec/1"},{"type":"function","title":"Needle.Tables.data/0","doc":"","ref":"Needle.Tables.html#data/0"},{"type":"function","title":"Needle.Tables.id/1","doc":"Look up a table id by id, name or schema.","ref":"Needle.Tables.html#id/1"},{"type":"function","title":"Needle.Tables.id!/1","doc":"Look up a table id by id, name or schema, raise NotFound if not found.","ref":"Needle.Tables.html#id!/1"},{"type":"function","title":"Needle.Tables.ids!/1","doc":"Look up many ids at once, raise NotFound if any of them are not found","ref":"Needle.Tables.html#ids!/1"},{"type":"function","title":"Needle.Tables.mixin_modules/0","doc":"","ref":"Needle.Tables.html#mixin_modules/0"},{"type":"function","title":"Needle.Tables.schema/1","doc":"Look up a schema module by id, name or schema","ref":"Needle.Tables.html#schema/1"},{"type":"function","title":"Needle.Tables.schema!/1","doc":"Look up a schema module by id, name or schema, raise NotFound if not found","ref":"Needle.Tables.html#schema!/1"},{"type":"function","title":"Needle.Tables.schema?/1","doc":"","ref":"Needle.Tables.html#schema?/1"},{"type":"function","title":"Needle.Tables.schema_modules/0","doc":"","ref":"Needle.Tables.html#schema_modules/0"},{"type":"function","title":"Needle.Tables.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Needle.Tables.html#start_link/1"},{"type":"function","title":"Needle.Tables.table/1","doc":"Get a Table identified by name, id or module.","ref":"Needle.Tables.html#table/1"},{"type":"function","title":"Needle.Tables.table!/1","doc":"Look up a Table by name or id, raise NotFound if not found.","ref":"Needle.Tables.html#table!/1"},{"type":"type","title":"Needle.Tables.query/0","doc":"A query is either a table's (database) name or (Pointer) ID as a\nbinary or the name of its Ecto Schema Module as an atom.","ref":"Needle.Tables.html#t:query/0"},{"type":"module","title":"Needle.UID","doc":"[![hex.pm](https://img.shields.io/hexpm/v/needle_uid)](https://hex.pm/packages/needle_uid)\n[hexdocs](https://hexdocs.pm/needle_uid)\n\nHybrid prefixed UUIDv7 and ULID data type for Ecto (using [pride](https://github.com/bonfire-networks/pride) and [needle_ulid](https://github.com/bonfire-networks/needle_ulid))","ref":"Needle.UID.html"},{"type":"module","title":"Installation - Needle.UID","doc":"```elixir\n{:needle_uid, git: \"https://github.com/bonfire-networks/needle_uid\", branch: \"main\"}\n```","ref":"Needle.UID.html#module-installation"},{"type":"module","title":"Copyright and License - Needle.UID","doc":"Copyright (c) 2024 Bonfire contributors\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.UID.html#module-copyright-and-license"},{"type":"function","title":"Needle.UID.cast/2","doc":"Casts an encoded string to ID. Transforms outside data into runtime data.\n\nUsed to (potentially) convert your data into an internal normalized representation which will be part of your changesets. It also used for verifying that something is actually valid input data for your type.","ref":"Needle.UID.html#cast/2"},{"type":"function","title":"Needle.UID.cast!/2","doc":"Same as `cast/1` but raises `Ecto.CastError` on invalid arguments.","ref":"Needle.UID.html#cast!/2"},{"type":"function","title":"Needle.UID.dump/3","doc":"Converts an encoded ID into a binary. Used to get your data ready to be written to the database. Transforms anything (outside data or runtime data) into database column data","ref":"Needle.UID.html#dump/3"},{"type":"function","title":"Needle.UID.generate/1","doc":"","ref":"Needle.UID.html#generate/1"},{"type":"function","title":"Needle.UID.is_pride?/2","doc":"","ref":"Needle.UID.html#is_pride?/2"},{"type":"function","title":"Needle.UID.is_ulid?/1","doc":"Takes a string and returns true if it is a valid ULID (Universally Unique Lexicographically Sortable Identifier).","ref":"Needle.UID.html#is_ulid?/1"},{"type":"function","title":"Examples - Needle.UID.is_ulid?/1","doc":"iex> is_ulid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> is_ulid?(\"invalid_ulid\")\n false","ref":"Needle.UID.html#is_ulid?/1-examples"},{"type":"function","title":"Needle.UID.is_uuid?/2","doc":"Takes a string and returns true if it is a valid Object ID or Prefixed UUID (Universally Unique Identifier).","ref":"Needle.UID.html#is_uuid?/2"},{"type":"function","title":"Examples - Needle.UID.is_uuid?/2","doc":"iex> is_uuid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uuid?(\"test_3TUIKuXX5mNO2jSA41bsDx\")\n true\n\n iex> is_uuid?(\"invalid_uuid\")\n false","ref":"Needle.UID.html#is_uuid?/2-examples"},{"type":"function","title":"Needle.UID.load/3","doc":"Converts a binary ID into an encoded string. Transforms database column data into runtime data.","ref":"Needle.UID.html#load/3"},{"type":"function","title":"Needle.UID.synthesise!/1","doc":"translates alphanumerics into a sentinel ID value","ref":"Needle.UID.html#synthesise!/1"},{"type":"function","title":"Needle.UID.timestamp/1","doc":"Returns the timestamp of an encoded or unencoded UID","ref":"Needle.UID.html#timestamp/1"},{"type":"function","title":"Needle.UID.type/1","doc":"The underlying schema type.","ref":"Needle.UID.html#type/1"},{"type":"function","title":"Needle.UID.valid?/2","doc":"Takes a string and returns true if it is a valid UUID or ULID.","ref":"Needle.UID.html#valid?/2"},{"type":"function","title":"Examples - Needle.UID.valid?/2","doc":"iex> valid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> valid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uuid?(\"test_3TUIKuXX5mNO2jSA41bsDx\")\n true\n\n iex> valid?(\"invalid_id\")\n false","ref":"Needle.UID.html#valid?/2-examples"},{"type":"module","title":"Needle.ULID","doc":"[![hex.pm](https://img.shields.io/hexpm/v/needle_ulid)](https://hex.pm/packages/needle_ulid)\n[hexdocs](https://hexdocs.pm/needle_ulid)\n\nA ULID datatype and some postgres support for ULID operations (`min` and `max` functions and aggregates)\n\nOriginally forked from\n[ecto-ulid](https://github.com/TheRealReal/ecto-ulid) but the internals have been replaced with a dependency on [ex_ulid](https://github.com/omgnetwork/ex_ulid)","ref":"Needle.ULID.html"},{"type":"module","title":"Installation - Needle.ULID","doc":"```elixir\n{:needle_ulid, git: \"https://github.com/bonfire-networks/needle_ulid\", branch: \"main\"}\n```","ref":"Needle.ULID.html#module-installation"},{"type":"module","title":"Copyright and License - Needle.ULID","doc":"Copyright (c) 2021 Bonfire contributors.\nCopyright (c) 2018 The RealReal, Inc.\nCopyright (c) 2020 needle_ulid contributors.\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.ULID.html#module-copyright-and-license"},{"type":"function","title":"Needle.ULID.bingenerate/1","doc":"Generates a binary ULID.\n\nIf a value is provided for `timestamp`, the generated ULID will be for the provided timestamp.\nOtherwise, a ULID will be generated for the current time.\n\nArguments:\n\n* `timestamp`: A Unix timestamp with millisecond precision.","ref":"Needle.ULID.html#bingenerate/1"},{"type":"function","title":"Needle.ULID.bintimestamp/1","doc":"","ref":"Needle.ULID.html#bintimestamp/1"},{"type":"function","title":"Needle.ULID.cast/1","doc":"Casts a 26-byte encoded string to ULID or a 16-byte binary unchanged","ref":"Needle.ULID.html#cast/1"},{"type":"function","title":"Needle.ULID.cast!/1","doc":"Same as `cast/1` but raises `Ecto.CastError` on invalid arguments.","ref":"Needle.ULID.html#cast!/1"},{"type":"function","title":"Needle.ULID.decode/1","doc":"","ref":"Needle.ULID.html#decode/1"},{"type":"function","title":"Needle.ULID.dump/1","doc":"Converts a Crockford Base32 encoded ULID into a binary.","ref":"Needle.ULID.html#dump/1"},{"type":"function","title":"Needle.ULID.dump!/1","doc":"","ref":"Needle.ULID.html#dump!/1"},{"type":"function","title":"Needle.ULID.embed_as/1","doc":"","ref":"Needle.ULID.html#embed_as/1"},{"type":"function","title":"Needle.ULID.encode/2","doc":"","ref":"Needle.ULID.html#encode/2"},{"type":"function","title":"Needle.ULID.encoded_randomness/1","doc":"Returns the randomness portion of the encoded ulid","ref":"Needle.ULID.html#encoded_randomness/1"},{"type":"function","title":"Needle.ULID.encoded_timestamp/1","doc":"Returns the timestamp portion of the encoded ulid","ref":"Needle.ULID.html#encoded_timestamp/1"},{"type":"function","title":"Needle.ULID.equal?/2","doc":"","ref":"Needle.ULID.html#equal?/2"},{"type":"function","title":"Needle.ULID.generate/1","doc":"Generates a Crockford Base32 encoded ULID.\n\nIf a value is provided for `timestamp`, the generated ULID will be for the provided timestamp.\nOtherwise, a ULID will be generated for the current time.\n\nArguments:\n\n* `timestamp`: A Unix timestamp with millisecond precision.","ref":"Needle.ULID.html#generate/1"},{"type":"function","title":"Needle.ULID.load/1","doc":"Converts a binary ULID into a Crockford Base32 encoded string.","ref":"Needle.ULID.html#load/1"},{"type":"function","title":"Needle.ULID.synthesise!/1","doc":"translates alphanumerics into a sentinel ulid value","ref":"Needle.ULID.html#synthesise!/1"},{"type":"function","title":"Needle.ULID.timestamp/1","doc":"Returns the timestamp of an encoded or unencoded ULID","ref":"Needle.ULID.html#timestamp/1"},{"type":"function","title":"Needle.ULID.type/0","doc":"The underlying schema type.","ref":"Needle.ULID.html#type/0"},{"type":"function","title":"Needle.ULID.valid?/1","doc":"","ref":"Needle.ULID.html#valid?/1"},{"type":"module","title":"Needle.ULID.Migration","doc":"","ref":"Needle.ULID.Migration.html"},{"type":"function","title":"Needle.ULID.Migration.init_pointers_ulid_extra/0","doc":"","ref":"Needle.ULID.Migration.html#init_pointers_ulid_extra/0"},{"type":"function","title":"Needle.ULID.Migration.init_pointers_ulid_extra/1","doc":"","ref":"Needle.ULID.Migration.html#init_pointers_ulid_extra/1"},{"type":"module","title":"Needle.Unpointable","doc":"Has a UID primary key but is not pointable.","ref":"Needle.Unpointable.html"},{"type":"macro","title":"Needle.Unpointable.unpointable_schema/1","doc":"","ref":"Needle.Unpointable.html#unpointable_schema/1"},{"type":"function","title":"Needle.Unpointable.using/2","doc":"","ref":"Needle.Unpointable.html#using/2"},{"type":"module","title":"Needle.Virtual","doc":"Sets up an Ecto Schema for a Virtual Pointable\n\nVirtual Pointables (or just `virtuals`) are like pointables with no\nadditional columns, except instead of being backed by a table they\nare backed by a view. This is more efficient of resources but only\nworks when there are no additional columns to add.\n\nIf you need to add columns to the schema, you should use a pointable.","ref":"Needle.Virtual.html"},{"type":"module","title":"Sample Usage - Needle.Virtual","doc":"```\nuse Needle.Virtual,\n otp_app: :my_app, # your OTP application's name\n source: \"my_table\", # default name of view in database\n table_id: \"01EBTVSZJ6X02J01R1XWWPWGZW\" # valid UID to identify virtual\n\nvirtual_schema do\n # ... `has_one`, `has_many`, or *virtual* fields ONLY go here.\nend\n```","ref":"Needle.Virtual.html#module-sample-usage"},{"type":"module","title":"Overriding with configuration - Needle.Virtual","doc":"During `use` (i.e. compilation time), we will attempt to load\nconfiguration from the provided `:otp_app` under the key of the\ncurrent module. Any values provided here will override the defaults\nprovided to `use`. This allows you to configure them after the fact.\n\nAdditionally, pointables use `Exto`'s `flex_schema()`, so you can\nprovide additional configuration for those in the same place. Unlike\na regular pointable, you should not add additional\n(non-virtual) fields, but it is permitted to add `has_one` /\n`has_many` associations.\n\nI shall say it again because it's important: This happens at\n*compile time*. You must rebuild the app containing the pointable\nwhenever the configuration changes.","ref":"Needle.Virtual.html#module-overriding-with-configuration"},{"type":"module","title":"Introspection - Needle.Virtual","doc":"Defines a function `__pointers__/1` to introspect data. Recognised\nparameters:\n\n`:role` - `:virtual`.\n`:table_id` - retrieves the UID id of the virtual.\n`:otp_app` - retrieves the OTP application to which this belongs.","ref":"Needle.Virtual.html#module-introspection"},{"type":"macro","title":"Needle.Virtual.virtual_schema/1","doc":"","ref":"Needle.Virtual.html#virtual_schema/1"},{"type":"module","title":"Releaser.Git","doc":"","ref":"Releaser.Git.html"},{"type":"function","title":"Releaser.Git.add_commit_and_tag/1","doc":"This module contains some git-specific functionality","ref":"Releaser.Git.html#add_commit_and_tag/1"},{"type":"module","title":"Releaser.Publish","doc":"","ref":"Releaser.Publish.html"},{"type":"function","title":"Releaser.Publish.publish!/0","doc":"","ref":"Releaser.Publish.html#publish!/0"},{"type":"module","title":"Releaser.Tests","doc":"","ref":"Releaser.Tests.html"},{"type":"function","title":"Releaser.Tests.run_tests!/0","doc":"","ref":"Releaser.Tests.html#run_tests!/0"},{"type":"module","title":"Releaser.VersionUtils","doc":"","ref":"Releaser.VersionUtils.html"},{"type":"function","title":"Releaser.VersionUtils.bump_major/1","doc":"Some utilities to get and set version numbers in the `mix.exs` file\nand to programmatically transform version numbers.\nMaybe the `bump_*` functions should be in the standard library?\nThis script doesn't support pre-release versions or versions with build information.","ref":"Releaser.VersionUtils.html#bump_major/1"},{"type":"function","title":"Releaser.VersionUtils.bump_minor/1","doc":"","ref":"Releaser.VersionUtils.html#bump_minor/1"},{"type":"function","title":"Releaser.VersionUtils.bump_patch/1","doc":"","ref":"Releaser.VersionUtils.html#bump_patch/1"},{"type":"function","title":"Releaser.VersionUtils.bump_pre/2","doc":"","ref":"Releaser.VersionUtils.html#bump_pre/2"},{"type":"function","title":"Releaser.VersionUtils.get_version/1","doc":"","ref":"Releaser.VersionUtils.html#get_version/1"},{"type":"function","title":"Releaser.VersionUtils.set_version/2","doc":"","ref":"Releaser.VersionUtils.html#set_version/2"},{"type":"function","title":"Releaser.VersionUtils.update_version/2","doc":"","ref":"Releaser.VersionUtils.html#update_version/2"},{"type":"function","title":"Releaser.VersionUtils.version_to_string/1","doc":"","ref":"Releaser.VersionUtils.html#version_to_string/1"},{"type":"module","title":"Untangle","doc":"Logging/inspecting data, and timing functions, with code location information.","ref":"Untangle.html"},{"type":"module","title":"Logging/inspecting - Untangle","doc":"`Untangle` provides alternatives for `IO.inspect` and the macros in Elixir's `Logger` to output code location information. It also provides a polyfill for `dbg` which was introduce in Elixir 1.14\n\n![screenshot](priv/screenshot.png \"Screenshot showing sample logs (shown when running the library tests)\")\n\nThe first argument is `inspect`ed and the second argument (if provided) is used as a label:\n\n```\n> import Untangle\nUntangle\n> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\n> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change `warn` or `info` for `debug` if you only need it during development :-)","ref":"Untangle.html#module-logging-inspecting"},{"type":"module","title":"Timing functions - Untangle","doc":"You can decorate functions to measure and log their execution time:\n\n```\nuse Untangle\n\n@decorate time()\ndef fun(), do: :stuff\n```\n\nwill output something like `[info] Time to run MyModule.fun/0: 1 ms`","ref":"Untangle.html#module-timing-functions"},{"type":"module","title":"Installation - Untangle","doc":"If [available in Hex](https://hex.pm/docs/publish), the package can be installed\nby adding `untangle` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [\n {:untangle, \"~> 0.3\"}\n ]\nend\n```\n\n# Configure as default `dbg/2` handler","ref":"Untangle.html#module-installation"},{"type":"module","title":"In config/config.exs - Untangle","doc":"`config :elixir, :dbg_callback, {Untangle, :custom_dbg, []}`\n\n# Docs\n\nThe docs can be found at [https://hexdocs.pm/untangle](https://hexdocs.pm/untangle).","ref":"Untangle.html#module-in-config-config-exs"},{"type":"module","title":"Copyright and License - Untangle","doc":"Copyright (c) 2022 Bonfire contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Untangle.html#module-copyright-and-license"},{"type":"function","title":"Untangle.custom_dbg/3","doc":"Custom backend for `Kernel.dbg/2`.\nThis function provides a backend for `Kernel.dbg/2`.\nThis function:\n * may log or print information about the given `env`\n * may log or print information about `code` and its returned value (using `opts` to inspect terms)\n * returns the value returned by evaluating `code`","ref":"Untangle.html#custom_dbg/3"},{"type":"macro","title":"Untangle.debug/3","doc":"Like `dump`, but for logging at debug level","ref":"Untangle.html#debug/3"},{"type":"macro","title":"Untangle.dump/3","doc":"IO.inspect but outputs to Logger with position information, an optional label and configured not to truncate output too much.","ref":"Untangle.html#dump/3"},{"type":"macro","title":"Untangle.error/3","doc":"Similar to `dump`, but for logging at error level, and returns an error tuple:\n- an error tuple with the label, if any\n- an error tuple with the passed value otherwise\n\n```\niex> error(:value)\n### [error] :value\n{:error, :value}\n\niex> error({:error, :value})\n### [error] :value\n{:error, :value}\n\niex> error(:value, \"with label\")\n### [error] with label: :value\n{:error, \"with label\"}\n\niex> error({:error, :value}, \"with label\")\n### [error] with label: :value\n{:error, \"with label\"}\n```","ref":"Untangle.html#error/3"},{"type":"function","title":"Untangle.format_application_location/3","doc":"","ref":"Untangle.html#format_application_location/3"},{"type":"function","title":"Untangle.format_location/2","doc":"","ref":"Untangle.html#format_location/2"},{"type":"function","title":"Untangle.format_stacktrace/1","doc":"Formats the stacktrace.\n\nA stacktrace must be given as an argument. If not, the stacktrace\nis retrieved from `Process.info/2`.","ref":"Untangle.html#format_stacktrace/1"},{"type":"function","title":"Untangle.format_stacktrace_entry/1","doc":"Receives a stacktrace entry and formats it into a string.","ref":"Untangle.html#format_stacktrace_entry/1"},{"type":"function","title":"Untangle.format_stacktrace_label/2","doc":"","ref":"Untangle.html#format_stacktrace_label/2"},{"type":"function","title":"Untangle.format_stacktrace_sliced/3","doc":"","ref":"Untangle.html#format_stacktrace_sliced/3"},{"type":"macro","title":"Untangle.info/3","doc":"Like `dump`, but for logging at info level","ref":"Untangle.html#info/3"},{"type":"function","title":"Untangle.log_level?/1","doc":"","ref":"Untangle.html#log_level?/1"},{"type":"macro","title":"Untangle.maybe_dbg/3","doc":"Like `debug`, but will do nothing unless the `:debug` option is truthy","ref":"Untangle.html#maybe_dbg/3"},{"type":"macro","title":"Untangle.maybe_info/3","doc":"Like `maybe_dbg`, but requires the `:verbose` option to be set. Intended for large outputs.","ref":"Untangle.html#maybe_info/3"},{"type":"function","title":"Untangle.module_name/1","doc":"","ref":"Untangle.html#module_name/1"},{"type":"macro","title":"Untangle.smart/3","doc":"Tries to 'do what i mean'. Requires the `debug` option to be set regardless. If `verbose` is also\nset, will inspect else will attempt to print some (hopefully smaller) type-dependent summary of\nthe data (list length, map keys).","ref":"Untangle.html#smart/3"},{"type":"macro","title":"Untangle.warn/3","doc":"Like `dump`, but for logging at warn level","ref":"Untangle.html#warn/3"},{"type":"module","title":"Untangle.Time","doc":"","ref":"Untangle.Time.html"},{"type":"macro","title":"Untangle.Time.time/0","doc":"","ref":"Untangle.Time.html#time/0"},{"type":"function","title":"Untangle.Time.time/2","doc":"","ref":"Untangle.Time.html#time/2"},{"type":"module","title":"Voodoo","doc":"`Voodoo` is a drop-in replacement for the old-style Phoenix path helpers (before `Phoenix.VerifiedRoutes` was introduced) which is more convenient to use.","ref":"Voodoo.html"},{"type":"macro","title":"Voodoo.def_reverse_router/2","doc":"Generates a reverse router function with the given name based upon a\ncompiled(!) phoenix router module.\n\nMust be used outside of the router module, or else the router won't\nbe compiled yet and we won't be able to look up the routes.\n\nGenerated function wraps the existing phoenix helpers.\n\n```\ndefmodule MyAppWeb.Router do\n use MyAppWeb, :router\n # ...\nend\ndefmodule MyAppWeb.Router.Reverse do\n import Voodoo, only: [def_reverse_router: 2]\n def_reverse_router :path, for: MyAppWeb.Router\nend\n```","ref":"Voodoo.html#def_reverse_router/2"},{"type":"function","title":"Voodoo.router/1","doc":"Turns a Conn or Socket into the name of the router that routed it.","ref":"Voodoo.html#router/1"},{"type":"module","title":"Bonfire.API.GraphQL","doc":"","ref":"Bonfire.API.GraphQL.html"},{"type":"module","title":"GraphQL Introduction - Bonfire.API.GraphQL","doc":"Go to http://your-instance-url/api/ to start playing with the GraphQL API. The GraphiQL UI should autocomplete types, queries and mutations for you, and you can also explore the schema there.\n\nLet's start with a simple GraphQL thoeretical query:\n\n```graphql\nquery {\n greetings(limit: 10) {\n greeting\n to {\n name\n }\n }\n}\n```\n\nLet's break this apart:\n\n- `query {}` is how you retrieve information from GraphQL.\n- `greetings` is a `field` within the query.\n- `greetings` takes a `limit` argument, a positive integer.\n- `greetings` has two fields, `greeting` and `to`.\n- `to` has one `field`, `name`.\n\nThis query is asking for a list of (up to) 10 greetings and the people\nthey are for. Notice that the result of both `greetings` and `to` are\nmap/object structures with their own fields and that if the type has\nmultiple fields, we can select more than one field.\n\nHere is some possible data we could get returned\n\n```elixir\n%{greetings: [\n %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]}\n```\n\nWhere is the magic? Typically an object type will reside in its own\ntable in the database, so this query is actually querying two tables\nin one go. In fact, given a supporting schema, you can nest queries\narbitrarily and the backend will figure out how to run them.\n\nThe fact that you can represent arbitrarily complex queries puts quite\na lot of pressure on the backend to make it all efficient. This is\nstill a work in progress at this time.","ref":"Bonfire.API.GraphQL.html#module-graphql-introduction"},{"type":"module","title":"Absinthe Introduction - Bonfire.API.GraphQL","doc":"Every `field` is filled by a resolver. Let's take our existing query\nand define a schema for it in Absinthe's query DSL:\n\n```elixir\ndefmodule MyApp.Schema do\n # the schema macro language\n use Absinthe.Schema.Notation\n # where we will actually resolve the fields\n alias MyApp.Resolver\n\n # Our user object is pretty simple, just a name\n object :user do\n field :name, non_null(:string)\n end\n\n # This one is slightly more complicated, we have that nested `to`\n object :greeting do\n # the easy one\n field :greeting, non_null(:string)\n # the hard one. `edge` is the term for when we cross an object boundary.\n field :to, non_null(:user), do: resolve(&Resolver.to_edge/3)\n end\n\n # something to put our top level queries in, because they're just fields too!\n object :queries do\n field :greetings, non_null(list_of(non_null(:string))) do\n arg :limit, :integer # optional\n resolve &Resolver.greetings/2 # we need to manually process this one\n end\n end\n\nend\n```\n\nThere are a couple of interesting things about this:\n\n- Sprinklings of `not_null` to require that values be present (if you\n don't return them, absinthe will get upset).\n- Only two fields have explicit resolvers. Anything else will default\n to a map key lookup (which is more often than not what you want).\n- `greeting.to_edge` has a `/3` resolver and `queries.greetings` a\n `/2` resolver.\n\nTo understand the last one (and partially the middle one), we must\nunderstand how resolution works and what a parent is. The best way of\ndoing that is probably to look at the resolver code:\n\n```elixir\ndefmodule MyApp.Resolver do\n\n # For purposes of this, we will just fake the data out\n defp greetings_data() do\n [ %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]\n end\n\n # the /2 resolver takes only arguments (which in this case is just limit)\n # and an info (which we'll explain later)\n def greetings(%{limit: limit}, _info) when is_integer(limit) and limit > 0 do\n {:ok, Enum.take(greetings_data(), limit)} # absinthe expects an ok/error tuple\n end\n def greetings(_args, _info), do: {:ok, greetings_data()} # no limit\n\n # the /3 resolver takes an additional parent argument in first position.\n # `parent` here will be the `greeting` we are resolving `to` for.\n def to_edge(parent, args, info), do: Map.get(parent, :to)\n\nend\n```\n\nThe keen-eyed amongst you may have noticed I said the default resolver\nis a map lookup and our `to_edge/3` is a map lookup too, so\ntechnically we didn't need to write it. But then you wouldn't have an\nexample of a `/3` resolver! In most of the app, these will be querying\nfrom the database, not looking up in a constant.\n\nSo for every field, a resolver function is run. It defaults to a map\nlookup, but you can override it with `resolve/1`. It may or may not\nhave arguments. And all absinthe resolvers return an ok/error tuple.","ref":"Bonfire.API.GraphQL.html#module-absinthe-introduction"},{"type":"module","title":"Copyright and License - Bonfire.API.GraphQL","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.API.GraphQL.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or_not_permitted/1","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or_not_permitted/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_int_ulid_id/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_int_ulid_id/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_nonnegint/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_nonnegint/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_posint/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_posint/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_ulid/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_ulid/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_account/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_account/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_not_found/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_not_found/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_not_logged_in/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_not_logged_in/1"},{"type":"function","title":"Bonfire.API.GraphQL.empty_page/0","doc":"","ref":"Bonfire.API.GraphQL.html#empty_page/0"},{"type":"function","title":"Bonfire.API.GraphQL.equals_or/4","doc":"","ref":"Bonfire.API.GraphQL.html#equals_or/4"},{"type":"function","title":"Bonfire.API.GraphQL.equals_or_not_permitted/2","doc":"","ref":"Bonfire.API.GraphQL.html#equals_or_not_permitted/2"},{"type":"function","title":"Bonfire.API.GraphQL.full_page_opts/3","doc":"","ref":"Bonfire.API.GraphQL.html#full_page_opts/3"},{"type":"function","title":"Bonfire.API.GraphQL.guest_only/1","doc":"","ref":"Bonfire.API.GraphQL.html#guest_only/1"},{"type":"function","title":"Bonfire.API.GraphQL.in_list?/1","doc":"Are we in a list (recursively)?","ref":"Bonfire.API.GraphQL.html#in_list?/1"},{"type":"function","title":"Bonfire.API.GraphQL.invalid_credential/0","doc":"","ref":"Bonfire.API.GraphQL.html#invalid_credential/0"},{"type":"function","title":"Bonfire.API.GraphQL.is_authenticated/1","doc":"","ref":"Bonfire.API.GraphQL.html#is_authenticated/1"},{"type":"function","title":"Bonfire.API.GraphQL.limit_page_opts/2","doc":"","ref":"Bonfire.API.GraphQL.html#limit_page_opts/2"},{"type":"function","title":"Bonfire.API.GraphQL.list_depth/1","doc":"How many lists are we in (recursively)?","ref":"Bonfire.API.GraphQL.html#list_depth/1"},{"type":"function","title":"Bonfire.API.GraphQL.not_found/0","doc":"","ref":"Bonfire.API.GraphQL.html#not_found/0"},{"type":"function","title":"Bonfire.API.GraphQL.not_in_list_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#not_in_list_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.not_in_list_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#not_in_list_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.not_logged_in/0","doc":"","ref":"Bonfire.API.GraphQL.html#not_logged_in/0"},{"type":"function","title":"Bonfire.API.GraphQL.not_permitted/1","doc":"","ref":"Bonfire.API.GraphQL.html#not_permitted/1"},{"type":"function","title":"Bonfire.API.GraphQL.parent_name/1","doc":"","ref":"Bonfire.API.GraphQL.html#parent_name/1"},{"type":"function","title":"Bonfire.API.GraphQL.predicated/1","doc":"","ref":"Bonfire.API.GraphQL.html#predicated/1"},{"type":"function","title":"Bonfire.API.GraphQL.predicated/2","doc":"","ref":"Bonfire.API.GraphQL.html#predicated/2"},{"type":"function","title":"Bonfire.API.GraphQL.reproject/2","doc":"","ref":"Bonfire.API.GraphQL.html#reproject/2"},{"type":"function","title":"Bonfire.API.GraphQL.reverse_path/1","doc":"","ref":"Bonfire.API.GraphQL.html#reverse_path/1"},{"type":"function","title":"Bonfire.API.GraphQL.validate_cursor/2","doc":"","ref":"Bonfire.API.GraphQL.html#validate_cursor/2"},{"type":"function","title":"Bonfire.API.GraphQL.wanted/2","doc":"","ref":"Bonfire.API.GraphQL.html#wanted/2"},{"type":"module","title":"Bonfire.API.GraphQL.Auth","doc":"","ref":"Bonfire.API.GraphQL.Auth.html"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.account_by/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#account_by/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.build_context/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#build_context/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.login/3","doc":"Resolver for login mutation for Bonfire.API.GraphQL.CommonSchema","ref":"Bonfire.API.GraphQL.Auth.html#login/3"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.select_user/3","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#select_user/3"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.set_context_from_resolution/2","doc":"Puts the account/user data in Absinthe context (runs after on `login/3` resolver)","ref":"Bonfire.API.GraphQL.Auth.html#set_context_from_resolution/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.set_session_from_context/2","doc":"Sets session cookie based on the Absinthe context set in `set_context_from_resolution/2` (called from router's `absinthe_before_send/2` )","ref":"Bonfire.API.GraphQL.Auth.html#set_session_from_context/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.token_new/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#token_new/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.token_verify/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#token_verify/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.user_by/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#user_by/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.user_by/2","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#user_by/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.username/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#username/1"},{"type":"module","title":"Bonfire.API.GraphQL.CommonResolver","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.canonical_url_edge/3","doc":"Returns the canonical url for a thing or character","ref":"Bonfire.API.GraphQL.CommonResolver.html#canonical_url_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.context_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#context_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.context_edges/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#context_edges/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.created_at_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#created_at_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.delete/2","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#delete/2"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.display_username_edge/3","doc":"Returns the username for a character","ref":"Bonfire.API.GraphQL.CommonResolver.html#display_username_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.fetch_context_edge/2","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#fetch_context_edge/2"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.fetch_context_edges/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#fetch_context_edges/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_deleted_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_deleted_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_disabled_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_disabled_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_hidden_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_hidden_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_local_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_local_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_public_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_public_edge/3"},{"type":"module","title":"Bonfire.API.GraphQL.CommonSchema","doc":"","ref":"Bonfire.API.GraphQL.CommonSchema.html"},{"type":"module","title":"Bonfire.API.GraphQL.Cursor","doc":"","ref":"Bonfire.API.GraphQL.Cursor.html"},{"type":"module","title":"Bonfire.API.GraphQL.FetchFields","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchFields.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchFields.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.FetchPage","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchPage.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchPage.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.FetchPages","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchPages.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchPages.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Fields","doc":"","ref":"Bonfire.API.GraphQL.Fields.html"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.get/3","doc":"Returns the result corresponding to the given key, or the given default (or nil).","ref":"Bonfire.API.GraphQL.Fields.html#get/3"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.getter/2","doc":"Returns a post-batch callback function which calls get with the\nprovided key and optional default value (or nil).","ref":"Bonfire.API.GraphQL.Fields.html#getter/2"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.new/2","doc":"Creates a new Fields from the data and a grouping function","ref":"Bonfire.API.GraphQL.Fields.html#new/2"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.new/3","doc":"","ref":"Bonfire.API.GraphQL.Fields.html#new/3"},{"type":"type","title":"Bonfire.API.GraphQL.Fields.t/0","doc":"","ref":"Bonfire.API.GraphQL.Fields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.JSON","doc":"The Json scalar type allows arbitrary JSON values to be passed in and out.\nRequires `{ :jason, \"~> 1.1\" }` package: https://github.com/michalmuskala/jason","ref":"Bonfire.API.GraphQL.JSON.html"},{"type":"module","title":"Bonfire.API.GraphQL.MastoCompatible.Router","doc":"","ref":"Bonfire.API.GraphQL.MastoCompatible.Router.html"},{"type":"macro","title":"Bonfire.API.GraphQL.MastoCompatible.Router.include_masto_api/0","doc":"","ref":"Bonfire.API.GraphQL.MastoCompatible.Router.html#include_masto_api/0"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.collapse/1","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#collapse/1"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.collapse/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#collapse/2"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.Debug","doc":"","ref":"Bonfire.API.GraphQL.Middleware.Debug.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.Debug.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.Debug.html#call/2"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.RenderLists","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.RenderLists.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.RenderLists.collapse/1","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html#collapse/1"},{"type":"module","title":"Bonfire.API.GraphQL.Page","doc":"","ref":"Bonfire.API.GraphQL.Page.html"},{"type":"function","title":"Bonfire.API.GraphQL.Page.new/4","doc":"","ref":"Bonfire.API.GraphQL.Page.html#new/4"},{"type":"type","title":"Bonfire.API.GraphQL.Page.t/0","doc":"","ref":"Bonfire.API.GraphQL.Page.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.PageInfo","doc":"Information about this page's relation to a larger result set","ref":"Bonfire.API.GraphQL.PageInfo.html"},{"type":"function","title":"Bonfire.API.GraphQL.PageInfo.new/4","doc":"","ref":"Bonfire.API.GraphQL.PageInfo.html#new/4"},{"type":"type","title":"Bonfire.API.GraphQL.PageInfo.t/0","doc":"","ref":"Bonfire.API.GraphQL.PageInfo.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Pages","doc":"","ref":"Bonfire.API.GraphQL.Pages.html"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.get/2","doc":"Returns a Page for the given key, defaulting to an empty one","ref":"Bonfire.API.GraphQL.Pages.html#get/2"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.getter/1","doc":"Returns a post-batch callback (i.e. the third argument to batch/3)\nfor a key which calls get() with the callback param and the key","ref":"Bonfire.API.GraphQL.Pages.html#getter/1"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.new/4","doc":"Create a new pages from a data map, counts map, cursor function and page opts","ref":"Bonfire.API.GraphQL.Pages.html#new/4"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.new/5","doc":"Create a new Pages from some data rows, count rows and a\ngrouping key. Groups the data by the grouping key on insertion and\nturns the counts into a map ready for lookup on a per-row basis.\n\nNote: if the grouping key is not present in the returned data rows,\nthis function will crash. Our intuition is that this would mean an\nerror in the calling code, so we would rather raise it early.","ref":"Bonfire.API.GraphQL.Pages.html#new/5"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.counts/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:counts/0"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.data/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:data/0"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.t/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Pagination","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.connection_paginate/3","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#connection_paginate/3"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.page/7","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#page/7"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.page_all/7","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#page_all/7"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.pages/8","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#pages/8"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.pagination_args_filter/1","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#pagination_args_filter/1"},{"type":"module","title":"Bonfire.API.GraphQL.PlugPipelines","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html"},{"type":"function","title":"Bonfire.API.GraphQL.PlugPipelines.default_pipeline/2","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html#default_pipeline/2"},{"type":"function","title":"Bonfire.API.GraphQL.PlugPipelines.run/2","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html#run/2"},{"type":"module","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext","doc":"GraphQL Plug to add current user to the context","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html"},{"type":"function","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext.call/2","doc":"","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext.init/1","doc":"","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html#init/1"},{"type":"module","title":"Bonfire.API.GraphQL.QueryHelper","doc":"Helpful functions for preparing to query or test Absinthe applications.\n\nThese functions make it trivially easy to generate very large, comprehensive queries for our types in Absinthe that will resolve every field in that type (and any number of subtypes as well to a given level of depth)\n\nAdapted from https://github.com/devonestes/assertions (MIT license)","ref":"Bonfire.API.GraphQL.QueryHelper.html"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.apply_overrides/2","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#apply_overrides/2"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.camelize/1","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#camelize/1"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.do_format_fields/3","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#do_format_fields/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.document_for/4","doc":"Returns a document containing the fields in a type and any sub-types down to a limited depth of\nnesting (default `3`).\n\nThis is helpful for generating a document to use for testing your GraphQL API. This function\nwill always return all fields in the given type, ensuring that there aren't any accidental\nfields with resolver functions that aren't tested in at least some fashion.","ref":"Bonfire.API.GraphQL.QueryHelper.html#document_for/4"},{"type":"function","title":"Example - Bonfire.API.GraphQL.QueryHelper.document_for/4","doc":"iex> document_for(:user, 2)\n\n ```\n name\n age\n posts {\n title\n subtitle\n }\n comments {\n body\n }\n ```","ref":"Bonfire.API.GraphQL.QueryHelper.html#document_for/4-example"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.fields_for/3","doc":"Returns all fields in a type and any sub-types down to a limited depth of nesting (default `3`).\n\nThis is helpful for converting a struct or map into an expected response that is a bare map\nand which can be used in some of the other assertions below.","ref":"Bonfire.API.GraphQL.QueryHelper.html#fields_for/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.format_fields/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#format_fields/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.get_fields/3","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#get_fields/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.maybe_debug_api/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#maybe_debug_api/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.padding/1","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#padding/1"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.query_with_id/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#query_with_id/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.run_query_id/6","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#run_query_id/6"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveField","doc":"Encapsulates the flow for resolving a field in the absence of\nmultiple parents.","ref":"Bonfire.API.GraphQL.ResolveField.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveField.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveField.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveFields","doc":"Encapsulates the flow for resolving a field for potentially multiple\nparents.","ref":"Bonfire.API.GraphQL.ResolveFields.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveFields.default_getter/2","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#default_getter/2"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveFields.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.ResolveFields.getter/0","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#t:getter/0"},{"type":"type","title":"Bonfire.API.GraphQL.ResolveFields.t/0","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.ResolvePage","doc":"Encapsulates the flow of resolving a page in the presence of a\nsingle parent. We also currently use this as a stopgap while we\nfinish implementing some things, trading speed for correctness.","ref":"Bonfire.API.GraphQL.ResolvePage.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolvePage.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolvePage.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolvePages","doc":"Encapsulates the flow of resolving a page in the presence of a\nsingle parent. We also currently use this as a stopgap while we\nfinish implementing some things, trading speed for correctness.","ref":"Bonfire.API.GraphQL.ResolvePages.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolvePages.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolvePages.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveRootPage","doc":"Encapsulates the flow of resolving a page in the absence of parents.","ref":"Bonfire.API.GraphQL.ResolveRootPage.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveRootPage.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveRootPage.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.RestAdapter","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.endpoint/3","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#endpoint/3"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.error_fn/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#error_fn/2"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.return/4","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#return/4"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.success_fn/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#success_fn/2"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.transform_data/1","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#transform_data/1"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.transform_data/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#transform_data/2"},{"type":"module","title":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig.html"},{"type":"module","title":"Bonfire.API.GraphQL.Router","doc":"","ref":"Bonfire.API.GraphQL.Router.html"},{"type":"module","title":"Bonfire.API.GraphQL.SchemaPipelines","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaPipelines.pipeline/1","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html#pipeline/1"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaPipelines.run/2","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html#run/2"},{"type":"module","title":"Bonfire.API.GraphQL.SchemaUtils","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaUtils.context_types/0","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html#context_types/0"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaUtils.hydrations_merge/1","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html#hydrations_merge/1"},{"type":"module","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_binary/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_binary/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_boolean/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_boolean/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_created_at/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_created_at/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_cursor/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_cursor/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_cursors/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_cursors/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_datetime/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_datetime/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_datetime/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_datetime/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_display_username/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_display_username/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_email/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_email/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_eq/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_eq/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_field/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_field/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_float/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_float/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_int/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_int/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_invalid_credential/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_invalid_credential/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/0","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/0"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_location/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_location/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/4","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/4"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/5","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/5"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_non_neg/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_non_neg/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_found/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_found/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_logged_in/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_logged_in/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_permitted/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_permitted/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_object/4","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_object/4"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_optional/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_optional/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_optional_field/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_optional_field/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/0","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/0"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/6","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/6"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page_info/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page_info/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_pos/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_pos/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_ulid/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_ulid/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_updated_at/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_updated_at/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_url/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_url/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_username/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_username/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_uuid/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_uuid/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.uncamel_map/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#uncamel_map/1"},{"type":"module","title":"Bonfire.API.GraphQL.UserSocket","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.build_context_from_params/2","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#build_context_from_params/2"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.connect/2","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#connect/2"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.id/1","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#id/1"},{"type":"module","title":"Bonfire.Boundaries","doc":"Bonfire's boundaries framework provides a flexible way to control user access to specific actions and data. It ensures that users can only see and do what they're authorized to.\n\nYou can create custom groups of contacts (circles) and grant them specific permissions to interact with you and your content. They can help you take control of your online presence and ensure that your data is shared only with the people you want.\n\n> Boundaries are limits that you set for yourself or others to define what you're comfortable with.\n> These limits can be physical, like curtains or doors; digital, like sharing settings on social media; in writing, like codes of conduct; emotional, like feeling comfortable to take time for self-care; or mental, like choosing what you pay attention to. In Bonfire, boundaries can help limit the type of interactions that others may have with you or things you post.\n> Boundaries are important because they help you protect yourself, maintain your autonomy, and communicate your needs and expectations clearly.","ref":"Bonfire.Boundaries.html"},{"type":"module","title":"Glossary - Bonfire.Boundaries","doc":"| Term | Definition |\n| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **Subject** or **User** | An individual who interacts with the system. |\n| **[Circle](Bonfire.Boundaries.Circles.html)** | A categorization method for users, allowing users to group other users (e.g., colleagues, friends). |\n| **[Verb](Bonfire.Boundaries.Verbs.html)** | An action that a user can perform (e.g., read, reply). |\n| **Permission** | A value indicating whether an action is allowed (`true`), denied (`false`), or `nil`. |\n| **[Grant](Bonfire.Boundaries.Grants.html)** | Links a user or circle with a verb and permission. |\n| **[ACL](Bonfire.Boundaries.Acls.html)** | Access Control List, a collection of grants. Also called \"boundary\" or \"boundary preset\" in the app. |\n| **[Controlled](Bonfire.Boundaries.Controlleds.html)** | Links an object to one or more ACLs, to determine access based on the grants. |\n| **[Role](Bonfire.Boundaries.Roles.html)** | A group of verbs linked to a permission. |","ref":"Bonfire.Boundaries.html#module-glossary"},{"type":"module","title":"Users and Circles - Bonfire.Boundaries","doc":"Circles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.","ref":"Bonfire.Boundaries.html#module-users-and-circles"},{"type":"module","title":"Verbs - Bonfire.Boundaries","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.","ref":"Bonfire.Boundaries.html#module-verbs"},{"type":"module","title":"Permissions - Bonfire.Boundaries","doc":"A permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n- `true`: yes, the action is allowed\n- `false`: no, the action is explicitly denied (i.e. never permit)\n- `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed)","ref":"Bonfire.Boundaries.html#module-permissions"},{"type":"module","title":"Grants - Bonfire.Boundaries","doc":"A `Grant` links a `subject` (user or circle) with a `Verb` and a permission. It defines the access rights for a specific user or circle in relation to a particular action.","ref":"Bonfire.Boundaries.html#module-grants"},{"type":"module","title":"ACLs - Bonfire.Boundaries","doc":"An `Acl` is a list of `Grant`s used to define access permissions for objects.\n\nBecause a user could be in more than one circle and each circle may have a different permission, when a user attempts an action on an object, the system combines all relevant grants to determine the final permission. This combination prioritizes permissions as follows: `false > true > nil`, resulting in:\n\n| input | input | result |\n| :------ | :------ | :------ |\n| `nil` | `nil` | `nil` |\n| `nil` | `true` | `true` |\n| `nil` | `false` | `false` |\n| `true` | `nil` | `true` |\n| `true` | `true` | `true` |\n| `true` | `false` | `false` |\n| `false` | `nil` | `false` |\n| `false` | `true` | `false` |\n| `false` | `false` | `false` |\n\nIn simpler terms, a final permission is granted only if the combined result is `true`. Think of it as requiring an explicit \"yes\" for permission, while \"no\" always takes precedence. Notably, `nil` acts as a sort of \"weak no,\" it can be overridden by a `true` but not granting access on its own. This approach provides flexibility for implementing features like user blocking (`false` is crucial here).\n\nFor efficiency, `nil` is the assumed default and not stored in the database.","ref":"Bonfire.Boundaries.html#module-acls"},{"type":"module","title":"Controlled - Applying boundaries to an object - Bonfire.Boundaries","doc":"The `Controlled` [multimixin](./DATABASE.md#multimixins) link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described above.","ref":"Bonfire.Boundaries.html#module-controlled-applying-boundaries-to-an-object"},{"type":"module","title":"Roles - Bonfire.Boundaries","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.","ref":"Bonfire.Boundaries.html#module-roles"},{"type":"module","title":"Practical example: Surprise birthday party - Bonfire.Boundaries","doc":"Let's illustrate how boundaries work with a real-world example: planning a surprise party without the birthday girl finding out.","ref":"Bonfire.Boundaries.html#module-practical-example-surprise-birthday-party"},{"type":"module","title":"1. Setting up users - Bonfire.Boundaries","doc":"```elixir\niex> import Bonfire.Me.Fake\niex> organizer = fake_user!()\niex> birthday_girl = fake_user!()\niex> friends = [fake_user!(), fake_user!()]\niex> family = [fake_user!(), fake_user!()]\n```","ref":"Bonfire.Boundaries.html#module-1-setting-up-users"},{"type":"module","title":"2. Define your Circles - Bonfire.Boundaries","doc":"Organize users into relevant circles (friends and family).\n\n```elixir\niex> alias Bonfire.Boundaries.Circles\niex> {:ok, friends_circle} = Circles.create(organizer, %{named: %{name: \"friends\"}})\niex> Circles.add_to_circles(friends, friends_circle)\niex> Circles.is_encircled_by?(List.first(friends), friends_circle)\ntrue\niex> {:ok, family_circle} = Circles.create(organizer, %{named: %{name: \"family\"}})\niex> Circles.add_to_circles(family, family_circle)\n```","ref":"Bonfire.Boundaries.html#module-2-define-your-circles"},{"type":"module","title":"3. Create the ACL (boundary preset) - Bonfire.Boundaries","doc":"This boundary will control access to the surprise party plans.\n\n```elixir\niex> alias Bonfire.Boundaries.Acls\niex> {:ok, boundary} = Acls.simple_create(organizer, \"Surprise party\")\n```","ref":"Bonfire.Boundaries.html#module-3-create-the-acl-boundary-preset"},{"type":"module","title":"4. Grant permissions - Bonfire.Boundaries","doc":"Allow friends to discover, read, and respond to party plans, while family members can also edit details and send invitations.\n\n```elixir\niex> alias Bonfire.Boundaries.Grants\niex> Grants.grant(friends_circle.id, boundary.id, [:see, :read, :reply], true, current_user: organizer)\niex> Grants.grant(family_circle.id, boundary.id, [:see, :read, :reply, :edit, :invite], true, current_user: organizer)\n```\n\nPrevent the birthday person from accessing any party information.\n\n```elixir\niex> Grants.grant(birthday_girl.id, boundary.id, [:see, :read], false, current_user: organizer)\n```","ref":"Bonfire.Boundaries.html#module-4-grant-permissions"},{"type":"module","title":"5. Post about the party - Bonfire.Boundaries","doc":"```elixir\niex> alias Bonfire.Posts\niex> {:ok, party_plan} = Posts.publish(\n current_user: organizer,\n boundary: boundary.id,\n post_attrs: %{post_content: %{name: \"Surprise party!\"}})\n```","ref":"Bonfire.Boundaries.html#module-5-post-about-the-party"},{"type":"module","title":"6. Double-check applied boundaries - Bonfire.Boundaries","doc":"```elixir\niex> Boundaries.can?(List.first(friends).id, :read, party_plan.id)\ntrue\niex> Boundaries.can?(List.first(family).id, :invite, party_plan.id)\ntrue\niex> Boundaries.can?(birthday_girl.id, :see, party_plan.id)\nfalse\niex> Boundaries.load_pointer(party_plan.id, current_user: birthday_girl)\nnil\n```\n\nBy following these steps, the organizer can effectively manage access to ensure the birthday girl cannot see the party plans, while friends and family can.","ref":"Bonfire.Boundaries.html#module-6-double-check-applied-boundaries"},{"type":"module","title":"Copyright and License - Bonfire.Boundaries","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Boundaries.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Boundaries.acls_from_preset_boundary_names/1","doc":"Returns ACLs for a set of preset boundary names.","ref":"Bonfire.Boundaries.html#acls_from_preset_boundary_names/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.acls_from_preset_boundary_names/1","doc":"iex> Bonfire.Boundaries.acls_from_preset_boundary_names([\"public\"])","ref":"Bonfire.Boundaries.html#acls_from_preset_boundary_names/1-examples"},{"type":"function","title":"Bonfire.Boundaries.boundaries_normalise/1","doc":"Normalizes boundaries represented as text or list.","ref":"Bonfire.Boundaries.html#boundaries_normalise/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.boundaries_normalise/1","doc":"iex> Bonfire.Boundaries.boundaries_normalise(\"local,public\")\n [\"local\", \"public\"]\n\n iex> Bonfire.Boundaries.boundaries_normalise([\"local\", \"public\"])\n [\"local\", \"public\"]","ref":"Bonfire.Boundaries.html#boundaries_normalise/1-examples"},{"type":"function","title":"Bonfire.Boundaries.boundaries_or_default/2","doc":"Returns custom boundaries or a default set of boundaries to use","ref":"Bonfire.Boundaries.html#boundaries_or_default/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.boundaries_or_default/2","doc":"iex> Bonfire.Boundaries.boundaries_or_default([\"local\"])\n [\"local\"]\n\n iex> Bonfire.Boundaries.boundaries_or_default(nil, current_user: me)\n [{\"public\", \"Public\"}]","ref":"Bonfire.Boundaries.html#boundaries_or_default/2-examples"},{"type":"function","title":"Bonfire.Boundaries.can?/4","doc":"Checks if a subject has permission to conduct the specified action(s)/verb(s) on an object.","ref":"Bonfire.Boundaries.html#can?/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.can?/4","doc":"iex> Bonfire.Boundaries.can?(%User{id: 1}, [:see], %{id: 2})\n false","ref":"Bonfire.Boundaries.html#can?/4-examples"},{"type":"function","title":"Bonfire.Boundaries.default_boundaries/1","doc":"Returns default boundaries to use based on the provided context.","ref":"Bonfire.Boundaries.html#default_boundaries/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.default_boundaries/1","doc":"iex> Bonfire.Boundaries.default_boundaries()\n [{\"public\", \"Public\"}]\n\n iex> Bonfire.Boundaries.default_boundaries(current_user: me)\n [{\"local\", \"Local\"}]","ref":"Bonfire.Boundaries.html#default_boundaries/1-examples"},{"type":"function","title":"Bonfire.Boundaries.find_caretaker_stereotype/3","doc":"Finds a caretaker stereotype based on the specified caretaker and stereotype IDs.","ref":"Bonfire.Boundaries.html#find_caretaker_stereotype/3"},{"type":"function","title":"Bonfire.Boundaries.find_caretaker_stereotypes/3","doc":"Finds caretaker stereotypes based on the specified caretaker and stereotype IDs.","ref":"Bonfire.Boundaries.html#find_caretaker_stereotypes/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.find_caretaker_stereotypes/3","doc":"iex> Bonfire.Boundaries.find_caretaker_stereotypes(%User{id: 1}, [%{id: 2}])\n [%Needle.Pointer{id: 1}]","ref":"Bonfire.Boundaries.html#find_caretaker_stereotypes/3-examples"},{"type":"function","title":"Bonfire.Boundaries.list_grants_on/1","doc":"Lists grants for a given set of objects.","ref":"Bonfire.Boundaries.html#list_grants_on/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_grants_on/1","doc":"iex> Bonfire.Boundaries.list_grants_on([1, 2, 3])","ref":"Bonfire.Boundaries.html#list_grants_on/1-examples"},{"type":"function","title":"Bonfire.Boundaries.list_grants_on/2","doc":"Lists grants for a given set of objects and verbs.","ref":"Bonfire.Boundaries.html#list_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_grants_on/2","doc":"iex> Bonfire.Boundaries.list_grants_on([1, 2, 3], [:see, :read])","ref":"Bonfire.Boundaries.html#list_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.list_object_acls/2","doc":"Lists ACLs for a given object.","ref":"Bonfire.Boundaries.html#list_object_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_object_acls/2","doc":"iex> Bonfire.Boundaries.list_object_acls(%{id: 1})\n [%Bonfire.Data.AccessControl.Acl{id: 42}]","ref":"Bonfire.Boundaries.html#list_object_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.list_object_boundaries/2","doc":"Lists boundaries (ACLs and grants) for a given object \n\n iex> Bonfire.Boundaries.list_object_boundaries(%{id: 1})\n [%Bonfire.Data.AccessControl.Acl{id: 42, grants: [...]}]","ref":"Bonfire.Boundaries.html#list_object_boundaries/2"},{"type":"function","title":"Bonfire.Boundaries.load_pointer/2","doc":"Loads a pointer based on the permissions which are checked based on provided options.","ref":"Bonfire.Boundaries.html#load_pointer/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.load_pointer/2","doc":"iex> Bonfire.Boundaries.load_pointer(%{id: 1}, verbs: [:read], current_user: %{id: 2})\n %Needle.Pointer{id: 1}","ref":"Bonfire.Boundaries.html#load_pointer/2-examples"},{"type":"function","title":"Bonfire.Boundaries.load_pointers/2","doc":"Loads pointers based on boundaries (which are checked based on provided options) and returns a list of permitted pointers.","ref":"Bonfire.Boundaries.html#load_pointers/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.load_pointers/2","doc":"iex> Bonfire.Boundaries.load_pointers([%{id: 1}], verbs: [:read], current_user: %{id: 2})\n [%Needle.Pointer{id: 1}]","ref":"Bonfire.Boundaries.html#load_pointers/2-examples"},{"type":"function","title":"Bonfire.Boundaries.load_pointers!/2","doc":"Loads pointers based on boundaries (which are checked based on provided options) and raises an error if not all pointers are permitted.","ref":"Bonfire.Boundaries.html#load_pointers!/2"},{"type":"function","title":"Bonfire.Boundaries.pointer_permitted?/2","doc":"Checks if a pointer has permission based on the specified options.","ref":"Bonfire.Boundaries.html#pointer_permitted?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.pointer_permitted?/2","doc":"iex> Bonfire.Boundaries.pointer_permitted?(%{id: 1}, verbs: [:edit], current_user: %{id: 2})\n true","ref":"Bonfire.Boundaries.html#pointer_permitted?/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_boundary_from_acl/2","doc":"Converts an ACL to a preset boundary name based on the object type.","ref":"Bonfire.Boundaries.html#preset_boundary_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_boundary_from_acl/2","doc":"iex> Bonfire.Boundaries.preset_boundary_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1})\n {\"public\", \"Public\"}","ref":"Bonfire.Boundaries.html#preset_boundary_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_boundary_tuple_from_acl/2","doc":"Converts an ACL to a preset boundary tuple based on the object type.","ref":"Bonfire.Boundaries.html#preset_boundary_tuple_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_boundary_tuple_from_acl/2","doc":"iex> Bonfire.Boundaries.preset_boundary_tuple_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1})\n {\"public\", \"Public\"}\n\n iex> Bonfire.Boundaries.preset_boundary_tuple_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1}, :group)\n {\"open\", \"Open\"}","ref":"Bonfire.Boundaries.html#preset_boundary_tuple_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_name/2","doc":"Returns the name of a preset boundary given a list of boundaries or other boundary representation.","ref":"Bonfire.Boundaries.html#preset_name/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_name/2","doc":"iex> Bonfire.Boundaries.preset_name([\"admins\", \"mentions\"])\n \"admins\"\n\n iex> Bonfire.Boundaries.preset_name(\"public_remote\", true)\n \"public_remote\"","ref":"Bonfire.Boundaries.html#preset_name/2-examples"},{"type":"function","title":"Bonfire.Boundaries.set_boundaries/3","doc":"Sets or replace boundaries for a given object.","ref":"Bonfire.Boundaries.html#set_boundaries/3"},{"type":"function","title":"Set boundaries on a black object - Bonfire.Boundaries.set_boundaries/3","doc":"iex> Bonfire.Boundaries.set_boundaries(%User{id: 1}, %{id: 2}, [boundary: \"public\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.html#set_boundaries/3-set-boundaries-on-a-black-object"},{"type":"function","title":"Replace boundaries on an existing object that previously had a preset applied - Bonfire.Boundaries.set_boundaries/3","doc":"iex> Bonfire.Boundaries.set_boundaries(%User{id: 1}, %{id: 2}, [boundary: \"local\", remove_previous_preset: \"public\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.html#set_boundaries/3-replace-boundaries-on-an-existing-object-that-previously-had-a-preset-applied"},{"type":"function","title":"Bonfire.Boundaries.take_care_of!/2","doc":"Assigns the user as the caretaker of the given object or objects, replacing the existing caretaker, if any.","ref":"Bonfire.Boundaries.html#take_care_of!/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.take_care_of!/2","doc":"iex> Bonfire.Boundaries.take_care_of!([%{id: 1}], %{id: 2})\n [%{id: 1, caretaker: %{id: 1, caretaker_id: 2, caretaker: %{id: 2}}}]","ref":"Bonfire.Boundaries.html#take_care_of!/2-examples"},{"type":"function","title":"Bonfire.Boundaries.user_default_boundaries/0","doc":"Returns the default boundaries to be set for new users from config.","ref":"Bonfire.Boundaries.html#user_default_boundaries/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.user_default_boundaries/0","doc":"iex> Bonfire.Boundaries.user_default_boundaries()\n [{\"public\", \"Public\"}]","ref":"Bonfire.Boundaries.html#user_default_boundaries/0-examples"},{"type":"function","title":"Bonfire.Boundaries.users_grants_on/2","doc":"Lists grants for a given set of users on a set of objects.","ref":"Bonfire.Boundaries.html#users_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.users_grants_on/2","doc":"iex> Bonfire.Boundaries.users_grants_on([%{id: 1}], [%{id: 2}])","ref":"Bonfire.Boundaries.html#users_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.users_grants_on/3","doc":"Lists grants for a given set of users on a set of objects, filtered by verbs.","ref":"Bonfire.Boundaries.html#users_grants_on/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.users_grants_on/3","doc":"iex> Bonfire.Boundaries.users_grants_on([%{id: 1}], [%{id: 2}], [:see, :read])\n [%Bonfire.Boundaries.Summary{object_id: 2, subject_id: 1}]","ref":"Bonfire.Boundaries.html#users_grants_on/3-examples"},{"type":"module","title":"Bonfire.Boundaries.Acls","doc":"Provides functionality for managing Access Control Lists (ACLs) in the Bonfire system.\n\nAn `Acl` is a list of `Grant`s used to define access permissions for objects. It represents fully populated access control rules that can be reused. It can be used to secure multiple objects and exists independently of any object.\n\n> ACLs (also referred to as \"preset boundaries\") enable you to make a list of circles and users and then grant specific roles or permissions to each of those. For example, you might create a \"Fitness\" ACL and grant the \"Participate\" role to your gym buddies, allowing them to interact with your fitness-related content, while granting the \"Interact\" role to your family and friends, who can view and react to your posts but not comment on them.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Acl` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Acls.html"},{"type":"function","title":"Bonfire.Boundaries.Acls.acl_grants_to_tuples/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#acl_grants_to_tuples/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.acl_id/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#acl_id/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.acls/0","doc":"Returns a list of special built-in ACLs (e.g., guest, local, activity_pub).","ref":"Bonfire.Boundaries.Acls.html#acls/0"},{"type":"function","title":"Bonfire.Boundaries.Acls.acls_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#acls_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.base_acls_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#base_acls_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.built_in_ids/0","doc":"Returns a list of built-in ACL IDs.","ref":"Bonfire.Boundaries.Acls.html#built_in_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.built_in_ids/0","doc":"iex> Bonfire.Boundaries.Acls.built_in_ids()\n [\"BUILT_IN_ACL_ID1\", \"BUILT_IN_ACL_ID2\"]","ref":"Bonfire.Boundaries.Acls.html#built_in_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.cast/3","doc":"Casts ACLs (existing ones or creating some on-the-fly) and Controlled on an object.","ref":"Bonfire.Boundaries.Acls.html#cast/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.cast/3","doc":"iex> Bonfire.Boundaries.Acls.cast(changeset, creator, [boundary: \"local\"])","ref":"Bonfire.Boundaries.Acls.html#cast/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.changeset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#changeset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.create/2","doc":"Creates a new ACL.","ref":"Bonfire.Boundaries.Acls.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.create/2","doc":"iex> Bonfire.Boundaries.Acls.create(%{named: %{name: \"New ACL\"}}, current_user: user)\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.default_exclude_ids/1","doc":"Returns a list of default IDs to exclude from queries.","ref":"Bonfire.Boundaries.Acls.html#default_exclude_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.default_exclude_ids/1","doc":"iex> Bonfire.Boundaries.Acls.default_exclude_ids()\n [\"2HEYS11ENCEDMES0CAN0TSEEME\", \"7HECVST0MAC1F0RAN0BJECTETC\", \"71MAYADM1N1STERMY0WNSTVFFS\", \"0H0STEDCANTSEE0RD0ANYTH1NG\", \"1S11ENCEDTHEMS0CAN0TP1NGME\"]","ref":"Bonfire.Boundaries.Acls.html#default_exclude_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.delete/2","doc":"Fully delete the ACL, including permissions/grants and controlled information. This will affect all objects previously shared with this ACL.","ref":"Bonfire.Boundaries.Acls.html#delete/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.edit/3","doc":"Edits an existing ACL.","ref":"Bonfire.Boundaries.Acls.html#edit/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.edit/3","doc":"iex> Bonfire.Boundaries.Acls.edit(acl_id, user, %{name: \"Updated ACL\"})\n\n iex> Bonfire.Boundaries.Acls.edit(%Acl{}, user, %{name: \"Updated ACL\"})","ref":"Bonfire.Boundaries.Acls.html#edit/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.exclude_stereotypes/1","doc":"Returns a list of stereotype IDs to exclude from queries.","ref":"Bonfire.Boundaries.Acls.html#exclude_stereotypes/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.exclude_stereotypes/1","doc":"iex> Bonfire.Boundaries.Acls.exclude_stereotypes()\n [\"2HEYS11ENCEDMES0CAN0TSEEME\", \"7HECVST0MAC1F0RAN0BJECTETC\"]\n\n iex> Bonfire.Boundaries.Acls.exclude_stereotypes(false)\n [\"2HEYS11ENCEDMES0CAN0TSEEME\"]","ref":"Bonfire.Boundaries.Acls.html#exclude_stereotypes/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get/1","doc":"Retrieves an ACL by its slug.","ref":"Bonfire.Boundaries.Acls.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get/1","doc":"iex> Bonfire.Boundaries.Acls.get(:instance_care)\n\n iex> Bonfire.Boundaries.Acls.get(:non_existent)\n nil","ref":"Bonfire.Boundaries.Acls.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get!/1","doc":"Retrieves an ACL by its slug, raising an error if not found.","ref":"Bonfire.Boundaries.Acls.html#get!/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_for_caretaker/3","doc":"Retrieves an ACL for a caretaker.","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get_for_caretaker/3","doc":"iex> Bonfire.Boundaries.Acls.get_for_caretaker(\"ACL_ID\", user)\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_for_caretaker_q/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker_q/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_id/1","doc":"Retrieves an ACL ID by its slug.","ref":"Bonfire.Boundaries.Acls.html#get_id/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get_id/1","doc":"iex> Bonfire.Boundaries.Acls.get_id(:instance_care)\n \"01SETT1NGSF0R10CA11NSTANCE\"\n\n iex> Bonfire.Boundaries.Acls.get_id(:non_existent)\n nil","ref":"Bonfire.Boundaries.Acls.html#get_id/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_id!/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_id!/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_object_custom_acl/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_object_custom_acl/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_or_create_object_custom_acl/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_or_create_object_custom_acl/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.grant_tuples_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#grant_tuples_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_built_in?/1","doc":"Checks if an ACL is built-in.","ref":"Bonfire.Boundaries.Acls.html#is_built_in?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_built_in?/1","doc":"iex> Bonfire.Boundaries.Acls.is_built_in?(\"BUILT_IN_ACL_ID\")\n true\n\n iex> Bonfire.Boundaries.Acls.is_built_in?(\"CUSTOM_ACL_ID\")\n false","ref":"Bonfire.Boundaries.Acls.html#is_built_in?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_object_custom?/1","doc":"Checks if an ACL is a custom ACL for an object.","ref":"Bonfire.Boundaries.Acls.html#is_object_custom?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_object_custom?/1","doc":"iex> Bonfire.Boundaries.Acls.is_object_custom?(%Acl{stereotyped: %{stereotype_id: \"CUSTOM_ACL_ID\"}})\n true\n\n iex> Bonfire.Boundaries.Acls.is_object_custom?(%Acl{})\n false","ref":"Bonfire.Boundaries.Acls.html#is_object_custom?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_stereotype?/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#is_stereotype?/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_stereotyped?/1","doc":"Checks if an ACL is stereotyped.","ref":"Bonfire.Boundaries.Acls.html#is_stereotyped?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_stereotyped?/1","doc":"iex> Bonfire.Boundaries.Acls.is_stereotyped?(%Acl{stereotyped: %{stereotype_id: \"STEREOTYPE_ID\"}})\n true\n\n iex> Bonfire.Boundaries.Acls.is_stereotyped?(\"STEREOTYPE_ID\")\n true\n\n iex> Bonfire.Boundaries.Acls.is_stereotyped?(%Acl{})\n false","ref":"Bonfire.Boundaries.Acls.html#is_stereotyped?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list/1","doc":"Lists ACLs the current user is permitted to see.","ref":"Bonfire.Boundaries.Acls.html#list/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list/1","doc":"iex> Bonfire.Boundaries.Acls.list(current_user: user)\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_built_ins/1","doc":"Lists built-in ACLs.","ref":"Bonfire.Boundaries.Acls.html#list_built_ins/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_built_ins/1","doc":"iex> Bonfire.Boundaries.Acls.list_built_ins()\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list_built_ins/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my/2","doc":"Lists ACLs for a specific user.\n\nIncludes the ACLs we are the registered caretakers of that we are\npermitted to see. If any are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Acls.html#list_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_my/2","doc":"iex> Bonfire.Boundaries.Acls.list_my(user)\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my_q/2","doc":"query for `list_my`","ref":"Bonfire.Boundaries.Acls.html#list_my_q/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my_with_counts/2","doc":"Lists ACLs for a specific user with grant counts (how many rules ).","ref":"Bonfire.Boundaries.Acls.html#list_my_with_counts/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_my_with_counts/2","doc":"iex> Bonfire.Boundaries.Acls.list_my_with_counts(user)\n [%{acl: %Acl{}, grants_count: 5}, %{acl: %Acl{}, grants_count: 2}]","ref":"Bonfire.Boundaries.Acls.html#list_my_with_counts/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_q/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.maybe_by_ids/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#maybe_by_ids/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.maybe_search/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#maybe_search/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.opts_for_dropdown/0","doc":"Returns options to use when querying for ACLs to show in a dropdown in the UI.","ref":"Bonfire.Boundaries.Acls.html#opts_for_dropdown/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.opts_for_dropdown/0","doc":"iex> Bonfire.Boundaries.Acls.opts_for_dropdown()\n [exclude_ids: [...], extra_ids_to_include: [...]]","ref":"Bonfire.Boundaries.Acls.html#opts_for_dropdown/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.opts_for_list/0","doc":"Returns options to use when querying for ACLs to show in a list.","ref":"Bonfire.Boundaries.Acls.html#opts_for_list/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.opts_for_list/0","doc":"iex> Bonfire.Boundaries.Acls.opts_for_list()\n [exclude_ids: [...]]","ref":"Bonfire.Boundaries.Acls.html#opts_for_list/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.prepare_cast/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#prepare_cast/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.preset_acl_ids/0","doc":"","ref":"Bonfire.Boundaries.Acls.html#preset_acl_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Acls.preset_acl_ids/2","doc":"Returns a list of ACL IDs for a preset (eg. \"local\" and \"public\").","ref":"Bonfire.Boundaries.Acls.html#preset_acl_ids/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.preview/2","doc":"Previews ACLs as they would be set based on provided opts.","ref":"Bonfire.Boundaries.Acls.html#preview/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.preview/2","doc":"iex> Bonfire.Boundaries.Acls.preview(creator, [\n preview_for_id: object_id,\n boundary: \"mentions\",\n to_circles: mentioned_users_or_custom_circles\n ])\n\n iex> Bonfire.Boundaries.Acls.preview(creator, [\n preview_for_id: object_id,\n boundary: \"clone_context\",\n context_id: context_object_id\n ])","ref":"Bonfire.Boundaries.Acls.html#preview/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.remote_public_acl_ids/0","doc":"Returns a list of ACL IDs for remote public access.","ref":"Bonfire.Boundaries.Acls.html#remote_public_acl_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.remote_public_acl_ids/0","doc":"iex> Bonfire.Boundaries.Acls.remote_public_acl_ids()\n [\"5REM0TEPE0P1E1NTERACTREACT\", \"5REM0TEPE0P1E1NTERACTREP1Y\", \"7REM0TEACT0RSCANC0NTR1BVTE\"]","ref":"Bonfire.Boundaries.Acls.html#remote_public_acl_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.set/3","doc":"Sets ACLs (existing ones or creating some on-the-fly) and Controlled on an object.","ref":"Bonfire.Boundaries.Acls.html#set/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.set/3","doc":"iex> Bonfire.Boundaries.Acls.set(%{}, creator, [boundary: \"local\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.Acls.html#set/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.simple_create/2","doc":"Creates a simple ACL with a name.","ref":"Bonfire.Boundaries.Acls.html#simple_create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.simple_create/2","doc":"iex> Bonfire.Boundaries.Acls.simple_create(user, \"My ACL\")\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#simple_create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.soft_delete/2","doc":"Soft-delete the ACL, meaning it will not be displayed anymore, but permissions/grants and controlled information will be preserved. This will not affect objects previously shared with this ACL.","ref":"Bonfire.Boundaries.Acls.html#soft_delete/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.stereotype_ids/0","doc":"Returns a list of stereotype ACL IDs.","ref":"Bonfire.Boundaries.Acls.html#stereotype_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.stereotype_ids/0","doc":"iex> Bonfire.Boundaries.Acls.stereotype_ids()\n [\"STEREOTYPE_ACL_ID1\", \"STEREOTYPE_ACL_ID2\"]","ref":"Bonfire.Boundaries.Acls.html#stereotype_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.user_default_acl/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#user_default_acl/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.user_default_acls/0","doc":"","ref":"Bonfire.Boundaries.Acls.html#user_default_acls/0"},{"type":"module","title":"Bonfire.Boundaries.Acts.SetBoundaries","doc":"","ref":"Bonfire.Boundaries.Acts.SetBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Acts.SetBoundaries.run/2","doc":"","ref":"Bonfire.Boundaries.Acts.SetBoundaries.html#run/2"},{"type":"module","title":"Bonfire.Boundaries.Blocks","doc":"Handles blocking of users and instances\n\nThis module provides functions to block and unblock users or instances, check\nif a user or instance is blocked, and manage block lists. It also includes\nfederation support for ActivityPub.","ref":"Bonfire.Boundaries.Blocks.html"},{"type":"function","title":"Bonfire.Boundaries.Blocks.ap_receive_activity/3","doc":"Handles incoming Block activities from ActivityPub federation.","ref":"Bonfire.Boundaries.Blocks.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.ap_receive_activity/3","doc":"iex> Bonfire.Boundaries.Blocks.ap_receive_activity(blocker, activity, blocked)","ref":"Bonfire.Boundaries.Blocks.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.block/3","doc":"Blocks, silences, or ghosts a user or instance.","ref":"Bonfire.Boundaries.Blocks.html#block/3"},{"type":"function","title":"Block a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-block-a-user-for-current-user"},{"type":"function","title":"Block a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-block-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Silence a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :silence, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-silence-a-user-for-current-user"},{"type":"function","title":"Silence a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :silence, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-silence-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Ghost a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :ghost, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-ghost-a-user-for-current-user"},{"type":"function","title":"Ghost a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :ghost, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-ghost-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Bonfire.Boundaries.Blocks.federation_module/0","doc":"","ref":"Bonfire.Boundaries.Blocks.html#federation_module/0"},{"type":"function","title":"Bonfire.Boundaries.Blocks.instance_wide_block/2","doc":"Blocks a user or instance for everyone on the instance (for admin/mod use only).","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_block/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.instance_wide_block/2","doc":"iex> Bonfire.Boundaries.Blocks.instance_wide_block(user, :ghost)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_block/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.instance_wide_circles/1","doc":"","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_circles/1"},{"type":"function","title":"Bonfire.Boundaries.Blocks.is_blocked?/3","doc":"Checks if a user or instance is blocked.","ref":"Bonfire.Boundaries.Blocks.html#is_blocked?/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.is_blocked?/3","doc":"iex> Bonfire.Boundaries.Blocks.is_blocked?(instance, :ghost, current_user: checker)\n false\n\n iex> Bonfire.Boundaries.Blocks.is_blocked?(user, :silence, :instance_wide)\n true","ref":"Bonfire.Boundaries.Blocks.html#is_blocked?/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.list/2","doc":"Lists blocked users or instances for a given block type and scope","ref":"Bonfire.Boundaries.Blocks.html#list/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.list/2","doc":"iex> Bonfire.Boundaries.Blocks.list(:ghost, :instance_wide)\n [%{id: \"123\", type: :ghost}, %{id: \"456\", type: :ghost}]\n\n iex> Bonfire.Boundaries.Blocks.list(:silence, current_user: user)\n [%{id: \"789\", type: :silence}]","ref":"Bonfire.Boundaries.Blocks.html#list/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"Blocks a remote instance.","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3"},{"type":"function","title":"Block for current user - Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"iex> Bonfire.Boundaries.Blocks.remote_instance_block(\"example.com\", :silence, current_user)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3-block-for-current-user"},{"type":"function","title":"Block for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"iex> Bonfire.Boundaries.Blocks.remote_instance_block(\"example.com\", :silence, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3-block-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Bonfire.Boundaries.Blocks.types_blocked/1","doc":"Converts provided block types (eg. `:ghost` or `:silence`) into a list of internal block types.","ref":"Bonfire.Boundaries.Blocks.html#types_blocked/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.types_blocked/1","doc":"iex> Bonfire.Boundaries.Blocks.types_blocked([:ghost, :silence])\n [:ghost_them, :silence_them]\n\n iex> Bonfire.Boundaries.Blocks.types_blocked(:ghost)\n [:ghost_them]\n\n iex> Bonfire.Boundaries.Blocks.types_blocked(nil)\n [:silence_them, :ghost_them]","ref":"Bonfire.Boundaries.Blocks.html#types_blocked/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.unblock/3","doc":"Unblocks a user or instance.","ref":"Bonfire.Boundaries.Blocks.html#unblock/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.unblock/3","doc":"iex> Bonfire.Boundaries.Blocks.unblock(user, :ghost, current_user: unblocker)\n {:ok, \"Unblocked\"}\n\n iex> Bonfire.Boundaries.Blocks.unblock(user, :silence, :instance_wide)\n {:ok, \"Unblocked\"}","ref":"Bonfire.Boundaries.Blocks.html#unblock/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.unblock_all/2","doc":"Unblocks *all* users or instances for a given block type and scope (only used for debugging purposes)","ref":"Bonfire.Boundaries.Blocks.html#unblock_all/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.unblock_all/2","doc":"iex> Bonfire.Boundaries.Blocks.unblock_all(:ghost, :instance_wide)\n {:ok, \"All unblocked\"}","ref":"Bonfire.Boundaries.Blocks.html#unblock_all/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.user_block_circles/2","doc":"","ref":"Bonfire.Boundaries.Blocks.html#user_block_circles/2"},{"type":"module","title":"Bonfire.Boundaries.Blocks.LiveHandler","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html"},{"type":"function","title":"Bonfire.Boundaries.Blocks.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Boundaries.Blocks.LiveHandler.preload_one/2","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#preload_one/2"},{"type":"macro","title":"Bonfire.Boundaries.Blocks.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Boundaries.Circles","doc":"Functions to create, query, and manage circles, which are used to group users (for the purpose of control access to various resources).\n\nCircles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.\n\n> Circles are a tool that can be used to establish relationships. They are representations of multifaceted relationships that you have with people in your life. Circles can help you understand the different levels of intimacy and trust that you have with different people, as well the different contexts or topics which are relevant to particular relationships, and can help build stronger, healthier relationships.\n\n> In Bonfire, you can define circles based on your unique style of relationships and interests. For example, you might create a circle for your colleagues, which can help you keep track of work-related content and collaborate with them more efficiently. You could also have a locals circle, with which you may share and discover local events, news, and recommendations. You might also create a comrades circle, to stay connected with fellow activists and organise around shared goals. Finally, you could create a happy hour circle, to coordinate social gatherings with local friends or colleagues, and the crew for your inner circle. With circles, you have the flexibility to manage your relationships and social activities in a way that makes sense for you.\n\nThe corresponding Ecto schema are `Bonfire.Data.AccessControl.Circle` and `Bonfire.Data.AccessControl.Encircle` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Circles.html"},{"type":"function","title":"Bonfire.Boundaries.Circles.add_to_circles/2","doc":"Adds subject(s) to circle(s).","ref":"Bonfire.Boundaries.Circles.html#add_to_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.add_to_circles/2","doc":"iex> Bonfire.Boundaries.Circles.add_to_circles(user, circle)\n {:ok, %Encircle{}}\n\n iex> Bonfire.Boundaries.Circles.add_to_circles([user1, user2], [circle1, circle2])\n [{{:ok, %Encircle{}}, {:ok, %Encircle{}}}, {{:ok, %Encircle{}}, {:ok, %Encircle{}}}]","ref":"Bonfire.Boundaries.Circles.html#add_to_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.built_in_ids/0","doc":"Returns a list of built-in circle IDs.","ref":"Bonfire.Boundaries.Circles.html#built_in_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.changeset/2","doc":"","ref":"Bonfire.Boundaries.Circles.html#changeset/2"},{"type":"function","title":"Bonfire.Boundaries.Circles.changeset/3","doc":"","ref":"Bonfire.Boundaries.Circles.html#changeset/3"},{"type":"function","title":"Bonfire.Boundaries.Circles.circle_ids/1","doc":"Converts a list of circles to circle IDs.","ref":"Bonfire.Boundaries.Circles.html#circle_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.circle_ids/1","doc":"iex> Bonfire.Boundaries.Circles.circle_ids([:guest, :local])\n [\"guest_circle_id\", \"local_circle_id\"]\n\n iex> Bonfire.Boundaries.Circles.circle_ids(%{id: \"user_id\"})\n \"user_id\"","ref":"Bonfire.Boundaries.Circles.html#circle_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.circles/0","doc":"Returns a list of special built-in circles (e.g., guest, local, activity_pub).","ref":"Bonfire.Boundaries.Circles.html#circles/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.create/2","doc":"Creates a new circle for the provided user.","ref":"Bonfire.Boundaries.Circles.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.create/2","doc":"iex> Bonfire.Boundaries.Circles.create(user, %{named: %{name: \"My Circle\"}})\n {:ok, %Circle{id: \"new_circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.delete/2","doc":"Deletes a circle and its associated data, including membership and boundary information. This will affect all objects previously shared with members of this circle","ref":"Bonfire.Boundaries.Circles.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.delete/2","doc":"iex> Bonfire.Boundaries.Circles.delete(circle, [current_user: user])\n\n iex> Bonfire.Boundaries.Circles.delete(\"circle_id\", [current_user: user])","ref":"Bonfire.Boundaries.Circles.html#delete/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.edit/3","doc":"Edits a circle's attributes.","ref":"Bonfire.Boundaries.Circles.html#edit/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.edit/3","doc":"iex> Bonfire.Boundaries.Circles.edit(circle, user, %{name: \"Updated Circle\"})\n {:ok, %Circle{id: \"circle_id\", name: \"Updated Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#edit/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.empty_circles/1","doc":"Empties circles by removing all members.","ref":"Bonfire.Boundaries.Circles.html#empty_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.empty_circles/1","doc":"iex> Bonfire.Boundaries.Circles.empty_circles([circle1, circle2])\n {10, nil}","ref":"Bonfire.Boundaries.Circles.html#empty_circles/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get/1","doc":"Retrieves a circle by its slug or ID.","ref":"Bonfire.Boundaries.Circles.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get/1","doc":"iex> Bonfire.Boundaries.Circles.get(:guest)\n %{id: \"guest_circle_id\", name: \"Guest\"}\n\n iex> Bonfire.Boundaries.Circles.get(\"circle_id\")\n %Circle{id: \"circle_id\", name: \"Custom Circle\"}","ref":"Bonfire.Boundaries.Circles.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get!/1","doc":"","ref":"Bonfire.Boundaries.Circles.html#get!/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_by_name/2","doc":"Retrieves a circle by name for a caretaker.","ref":"Bonfire.Boundaries.Circles.html#get_by_name/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_by_name/2","doc":"iex> Bonfire.Boundaries.Circles.get_by_name(\"My Circle\", user)\n {:ok, %Circle{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_by_name/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_for_caretaker/3","doc":"Retrieves a circle for a caretaker by ID.","ref":"Bonfire.Boundaries.Circles.html#get_for_caretaker/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_for_caretaker/3","doc":"iex> Bonfire.Boundaries.Circles.get_for_caretaker(\"circle_id\", user)\n {:ok, %Circle{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_for_caretaker/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_id/1","doc":"Retrieves the ID of a circle by its slug.","ref":"Bonfire.Boundaries.Circles.html#get_id/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_id/1","doc":"iex> Bonfire.Boundaries.Circles.get_id(:guest)\n \"guest_circle_id\"\n\n iex> Bonfire.Boundaries.Circles.get_id(:nonexistent)\n nil","ref":"Bonfire.Boundaries.Circles.html#get_id/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_id!/1","doc":"","ref":"Bonfire.Boundaries.Circles.html#get_id!/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_or_create/2","doc":"Retrieves or creates a circle by name for a caretaker.","ref":"Bonfire.Boundaries.Circles.html#get_or_create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_or_create/2","doc":"iex> Bonfire.Boundaries.Circles.get_or_create(\"New Circle\", user)\n {:ok, %Circle{id: \"new_circle_id\", name: \"New Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_or_create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_stereotype_circles/2","doc":"Retrieves stereotype circles for a subject.","ref":"Bonfire.Boundaries.Circles.html#get_stereotype_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_stereotype_circles/2","doc":"iex> Bonfire.Boundaries.Circles.get_stereotype_circles(user, [:follow, :block])\n [%Circle{id: \"follow_circle_id\", name: \"Follow\"}, %Circle{id: \"block_circle_id\", name: \"Block\"}]","ref":"Bonfire.Boundaries.Circles.html#get_stereotype_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_tuple/1","doc":"Retrieves a tuple containing the name and ID of a circle by its slug or ID.","ref":"Bonfire.Boundaries.Circles.html#get_tuple/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_tuple/1","doc":"iex> Bonfire.Boundaries.Circles.get_tuple(:guest)\n {\"Guest\", \"guest_circle_id\"}\n\n iex> Bonfire.Boundaries.Circles.get_tuple(\"circle_id\")\n {:my_circle, %{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_tuple/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_built_in?/1","doc":"Checks if a circle is a built-in circle.","ref":"Bonfire.Boundaries.Circles.html#is_built_in?/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_encircled_by?/2","doc":"Checks if a subject is encircled by a circle or list of circles.","ref":"Bonfire.Boundaries.Circles.html#is_encircled_by?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.is_encircled_by?/2","doc":"iex> Bonfire.Boundaries.Circles.is_encircled_by?(user, circle)\n true\n\n iex> Bonfire.Boundaries.Circles.is_encircled_by?(user, [circle1, circle2])\n false","ref":"Bonfire.Boundaries.Circles.html#is_encircled_by?/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_stereotype?/1","doc":"Checks if a circle is a stereotype circle.","ref":"Bonfire.Boundaries.Circles.html#is_stereotype?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.is_stereotype?/1","doc":"iex> Bonfire.Boundaries.Circles.is_stereotype?(\"7DAPE0P1E1PERM1TT0F0110WME\")\n true\n\n iex> Bonfire.Boundaries.Circles.is_stereotype?(\"custom_circle_id\")\n false","ref":"Bonfire.Boundaries.Circles.html#is_stereotype?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.leave_all_circles/1","doc":"Removes user(s) from all circles.","ref":"Bonfire.Boundaries.Circles.html#leave_all_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.leave_all_circles/1","doc":"iex> Bonfire.Boundaries.Circles.empty_circles([circle1, circle2])\n {10, nil}","ref":"Bonfire.Boundaries.Circles.html#leave_all_circles/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_built_ins/0","doc":"Lists all built-in circles.","ref":"Bonfire.Boundaries.Circles.html#list_built_ins/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_built_ins/0","doc":"iex> Bonfire.Boundaries.Circles.list_built_ins()\n [%Circle{id: \"guest_circle_id\", name: \"Guest\"}, %Circle{id: \"local_circle_id\", name: \"Local\"}]","ref":"Bonfire.Boundaries.Circles.html#list_built_ins/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_by_ids/1","doc":"Lists circles by their IDs.","ref":"Bonfire.Boundaries.Circles.html#list_by_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_by_ids/1","doc":"iex> Bonfire.Boundaries.Circles.list_by_ids([\"circle_id1\", \"circle_id2\"])\n [%Circle{id: \"circle_id1\", name: \"Circle 1\"}, %Circle{id: \"circle_id2\", name: \"Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_by_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my/2","doc":"Lists circles owned by a user.\n\nIncludes circles we are the registered caretakers of that we are\npermitted to see. If any circles are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Circles.html#list_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my/2","doc":"iex> Bonfire.Boundaries.Circles.list_my(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle 1\"}, %Circle{id: \"circle_id2\", name: \"My Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_defaults/1","doc":"Lists default circles for a user.","ref":"Bonfire.Boundaries.Circles.html#list_my_defaults/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_defaults/1","doc":"iex> Bonfire.Boundaries.Circles.list_my_defaults()\n [{\"Guest\", \"guest_circle_id\"}, {\"Local\", \"local_circle_id\"}, {\"ActivityPub\", \"activity_pub_circle_id\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my_defaults/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_with_counts/2","doc":"Lists circles owned by a user with member counts.","ref":"Bonfire.Boundaries.Circles.html#list_my_with_counts/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_with_counts/2","doc":"iex> Bonfire.Boundaries.Circles.list_my_with_counts(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle\", encircles_count: 5}]","ref":"Bonfire.Boundaries.Circles.html#list_my_with_counts/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_with_global/2","doc":"Lists circles owned by a user and global/built-in circles.","ref":"Bonfire.Boundaries.Circles.html#list_my_with_global/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_with_global/2","doc":"iex> Bonfire.Boundaries.Circles.list_my_with_global(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle\"}, %Circle{id: \"global_circle_id\", name: \"Global Circle\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my_with_global/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_visible/2","doc":"Lists visible circles for a user.","ref":"Bonfire.Boundaries.Circles.html#list_visible/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_visible/2","doc":"iex> Bonfire.Boundaries.Circles.list_visible(user)\n [%Circle{id: \"circle_id1\", name: \"Circle 1\"}, %Circle{id: \"circle_id2\", name: \"Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_visible/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.preload_encircled_by/3","doc":"","ref":"Bonfire.Boundaries.Circles.html#preload_encircled_by/3"},{"type":"function","title":"Bonfire.Boundaries.Circles.query/1","doc":"Generates a query for circles","ref":"Bonfire.Boundaries.Circles.html#query/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query/1","doc":"iex> Bonfire.Boundaries.Circles.query(exclude_built_ins: true)","ref":"Bonfire.Boundaries.Circles.html#query/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_my/2","doc":"Generates a query for circles owned by a user.","ref":"Bonfire.Boundaries.Circles.html#query_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_my/2","doc":"iex> Bonfire.Boundaries.Circles.query_my(user)","ref":"Bonfire.Boundaries.Circles.html#query_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_my_by_id/3","doc":"Generates a query for a specific circle owned by a user.","ref":"Bonfire.Boundaries.Circles.html#query_my_by_id/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_my_by_id/3","doc":"iex> Bonfire.Boundaries.Circles.query_my_by_id(\"circle_id\", user)","ref":"Bonfire.Boundaries.Circles.html#query_my_by_id/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_visible/2","doc":"Generates a query for visible circles for a user.","ref":"Bonfire.Boundaries.Circles.html#query_visible/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_visible/2","doc":"iex> Bonfire.Boundaries.Circles.query_visible(user)\n #Ecto.Query<...>","ref":"Bonfire.Boundaries.Circles.html#query_visible/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.remove_from_circles/2","doc":"Removes a user from circles.","ref":"Bonfire.Boundaries.Circles.html#remove_from_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.remove_from_circles/2","doc":"iex> Bonfire.Boundaries.Circles.remove_from_circles(user, circle)\n {1, nil}\n\n iex> Bonfire.Boundaries.Circles.remove_from_circles(user, [circle1, circle2])\n {2, nil}","ref":"Bonfire.Boundaries.Circles.html#remove_from_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.stereotype_ids/0","doc":"Returns a list of stereotype circle IDs.","ref":"Bonfire.Boundaries.Circles.html#stereotype_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.stereotypes/1","doc":"Returns a list of stereotype IDs for a specific category.","ref":"Bonfire.Boundaries.Circles.html#stereotypes/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.stereotypes/1","doc":"iex> Bonfire.Boundaries.Circles.stereotypes(:follow)\n\n iex> Bonfire.Boundaries.Circles.stereotypes(:block)","ref":"Bonfire.Boundaries.Circles.html#stereotypes/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.to_circle_ids/1","doc":"Converts a list of circles to circle IDs, including adding default circles (such as local or activity_pub when relevant)","ref":"Bonfire.Boundaries.Circles.html#to_circle_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.to_circle_ids/1","doc":"iex> Bonfire.Boundaries.Circles.to_circle_ids([:guest, :custom])\n [\"guest_circle_id\", \"custom_circle_id\", \"local_circle_id\", \"activity_pub_circle_id\"]","ref":"Bonfire.Boundaries.Circles.html#to_circle_ids/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Controlleds","doc":"An object is linked to one or more `Acl`s by the `Controlled` multimixin, which pairs an object ID with an ACL ID.\nBecause it is a multimixin, a given object can have multiple ACLs applied. In the case of overlap, permissions are combined with `false` being prioritised.\n\nThe `Controlled` multimixin link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described in `Bonfire.Boundaries`.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Controlled` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Controlleds.html"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.add_acls/2","doc":"Adds the given ACL to an object.","ref":"Bonfire.Boundaries.Controlleds.html#add_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.add_acls/2","doc":"iex> add_acls(object, :acl)\n {:ok, %Controlled{}}","ref":"Bonfire.Boundaries.Controlleds.html#add_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.changeset/2","doc":"Returns a changeset for a `Controlled` with the given attributes.","ref":"Bonfire.Boundaries.Controlleds.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.changeset/2","doc":"iex> changeset(%Controlled{}, %{field: value})\n %Ecto.Changeset{}","ref":"Bonfire.Boundaries.Controlleds.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.create/1","doc":"Creates a `Controlled` record with the given attributes.","ref":"Bonfire.Boundaries.Controlleds.html#create/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.create/1","doc":"iex> create(%{field: value})\n {:ok, %Controlled{}}","ref":"Bonfire.Boundaries.Controlleds.html#create/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.get_preset_on_object/1","doc":"Gets a preset ACL applied to an object, if any.","ref":"Bonfire.Boundaries.Controlleds.html#get_preset_on_object/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.get_preset_on_object/1","doc":"iex> get_preset_on_object(object)\n %ACL{}","ref":"Bonfire.Boundaries.Controlleds.html#get_preset_on_object/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.grant_role/4","doc":"Grants a role to a subject for an object.","ref":"Bonfire.Boundaries.Controlleds.html#grant_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.grant_role/4","doc":"iex> grant_role(subject_id, object, :editor)\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Controlleds.html#grant_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_acls_on_object/2","doc":"Lists ACLs applied to an object.\nOnly call this as an admin or curator of the object.","ref":"Bonfire.Boundaries.Controlleds.html#list_acls_on_object/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_acls_on_object/2","doc":"iex> list_acls_on_object(object)\n [%Acl{}]","ref":"Bonfire.Boundaries.Controlleds.html#list_acls_on_object/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_grants_by_verbs/3","doc":"Lists grants of a given verb on specified object(s).","ref":"Bonfire.Boundaries.Controlleds.html#list_grants_by_verbs/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_grants_by_verbs/3","doc":"iex> list_grants_by_verbs(objects, :read)\n\n iex> list_grants_by_verbs(objects, :edit, false)","ref":"Bonfire.Boundaries.Controlleds.html#list_grants_by_verbs/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_on_object/2","doc":"Lists ALL boundaries (ACLs and grants) applied to an object.\nOnly call this as an admin or curator of the object.","ref":"Bonfire.Boundaries.Controlleds.html#list_on_object/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_on_object/2","doc":"iex> list_on_object(object)\n [%Boundary{}]","ref":"Bonfire.Boundaries.Controlleds.html#list_on_object/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_on_objects_by_subject/2","doc":"Lists ACLs applied to the given objects by the subject (current_user).","ref":"Bonfire.Boundaries.Controlleds.html#list_on_objects_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_on_objects_by_subject/2","doc":"iex> list_on_objects_by_subject(objects, current_user)\n %{object1_id => [%Acl{}], object2_id => [%Acl{}]}","ref":"Bonfire.Boundaries.Controlleds.html#list_on_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_presets_on_objects/1","doc":"Lists presets ACLs applied to the given objects.","ref":"Bonfire.Boundaries.Controlleds.html#list_presets_on_objects/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_presets_on_objects/1","doc":"iex> list_presets_on_objects(objects)\n %{object_id => %Preset{}}","ref":"Bonfire.Boundaries.Controlleds.html#list_presets_on_objects/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_q/1","doc":"","ref":"Bonfire.Boundaries.Controlleds.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_subjects_by_verb/3","doc":"Lists subjects who have been granted a given verb on specified object(s).","ref":"Bonfire.Boundaries.Controlleds.html#list_subjects_by_verb/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_subjects_by_verb/3","doc":"iex> list_subjects_by_verb(objects, :read)\n\n iex> list_subjects_by_verb(objects, :edit, false)","ref":"Bonfire.Boundaries.Controlleds.html#list_subjects_by_verb/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.remove_acls/2","doc":"Removes the given ACLs from an object.","ref":"Bonfire.Boundaries.Controlleds.html#remove_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.remove_acls/2","doc":"iex> remove_acls(object, acls)","ref":"Bonfire.Boundaries.Controlleds.html#remove_acls/2-examples"},{"type":"module","title":"Bonfire.Boundaries.Debug","doc":"Debug utilities for Bonfire Boundaries.\n\nThis module provides functions to debug and inspect user circles, ACLs, and grants.","ref":"Bonfire.Boundaries.Debug.html"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_grants_on/1","doc":"Prints debug information about all grants on specific things.","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_grants_on/1","doc":"iex> Bonfire.Boundaries.Debug.debug_grants_on(things)\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [reply] | true |\n | user_2 | object_2 | [edit] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_grants_on/2","doc":"Prints debug information about grants on specific things for given verbs.","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_grants_on/2","doc":"iex> Bonfire.Boundaries.Debug.debug_grants_on(things, [:read, :edit])\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [edit] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_my_grants_on/2","doc":"Prints debug information about users' grants on specific things.","ref":"Bonfire.Boundaries.Debug.html#debug_my_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_my_grants_on/2","doc":"iex> Bonfire.Boundaries.Debug.debug_my_grants_on(users, things)\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [write] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_my_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_object_acls/1","doc":"Prints debug information about an object's ACLs.","ref":"Bonfire.Boundaries.Debug.html#debug_object_acls/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_object_acls/1","doc":"iex> Bonfire.Boundaries.Debug.debug_object_acls(object)\n Object: object_id\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_id | acl_name | acl_stereo| grant_verb | grant_subject | grant_value |\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_1 | Private | null | read | Friends | true |\n | acl_2 | Public | null | write | Everyone | false |\n +--------+----------+-----------+------------+---------------+-----------+","ref":"Bonfire.Boundaries.Debug.html#debug_object_acls/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_user_acls/2","doc":"Prints debug information about a user's ACLs.","ref":"Bonfire.Boundaries.Debug.html#debug_user_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_user_acls/2","doc":"iex> Bonfire.Boundaries.Debug.debug_user_acls(user)\n user ACLs: user_id\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_id | acl_name | acl_stereo| grant_verb | grant_subject | grant_value |\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_1 | Private | null | read | Friends | true |\n | acl_2 | Public | null | write | Everyone | false |\n +--------+----------+-----------+------------+---------------+-----------+\n\n iex> Bonfire.Boundaries.Debug.debug_user_acls(user, \"Custom label\")\n Custom label user ACLs: user_id\n ...","ref":"Bonfire.Boundaries.Debug.html#debug_user_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_user_circles/1","doc":"Prints debug information about a user's circles.","ref":"Bonfire.Boundaries.Debug.html#debug_user_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_user_circles/1","doc":"iex> Bonfire.Boundaries.Debug.debug_user_circles(user)\n User: user_id\n +------------+------------+\n | circle_id | circle_name|\n +------------+------------+\n | circle_1 | Friends |\n | circle_2 | Family |\n +------------+------------+","ref":"Bonfire.Boundaries.Debug.html#debug_user_circles/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Fixtures","doc":"Provides functions to create default boundary fixtures for the instance.","ref":"Bonfire.Boundaries.Fixtures.html"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.activity_pub_circle/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#activity_pub_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.admin_circle/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#admin_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.custom_acl/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#custom_acl/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.fixtures/0","doc":"Prepares and returns the fixtures for ACLs, circles, verbs, named entities, and grants.","ref":"Bonfire.Boundaries.Fixtures.html#fixtures/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.global_circles/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#global_circles/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.insert/0","doc":"Prepares fixtures and inserts them into the database.","ref":"Bonfire.Boundaries.Fixtures.html#insert/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.instance_acl/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#instance_acl/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.mod_circle/0","doc":"","ref":"Bonfire.Boundaries.Fixtures.html#mod_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Fixtures.upsert_verbs/0","doc":"Inserts or updates the verbs in the database.","ref":"Bonfire.Boundaries.Fixtures.html#upsert_verbs/0"},{"type":"module","title":"Bonfire.Boundaries.FixturesUsersMigrations","doc":"","ref":"Bonfire.Boundaries.FixturesUsersMigrations.html"},{"type":"function","title":"Bonfire.Boundaries.FixturesUsersMigrations.down/0","doc":"","ref":"Bonfire.Boundaries.FixturesUsersMigrations.html#down/0"},{"type":"function","title":"Bonfire.Boundaries.FixturesUsersMigrations.up/0","doc":"","ref":"Bonfire.Boundaries.FixturesUsersMigrations.html#up/0"},{"type":"module","title":"Bonfire.Boundaries.Grants","doc":"A grant defines a permission (`value` boolean on a `Verb`) for a subject, within the context of an `Acl`. It defines the access rights for a specific user or circle in relation to a particular action.\n\nA permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n* `true`: yes, the action is allowed\n* `false`: no, the action is explicitly denied (i.e. never permit)\n* `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed) \n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Grant` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Grants.html"},{"type":"function","title":"Bonfire.Boundaries.Grants.create/2","doc":"Creates a new grant with the given attributes and options.","ref":"Bonfire.Boundaries.Grants.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.create/2","doc":"iex> Bonfire.Boundaries.Grants.create(%{subject_id: \"123\", acl_id: \"456\", verb_id: \"789\", value: true}, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.get/1","doc":"Gets the grant configuration by a given slug.","ref":"Bonfire.Boundaries.Grants.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.get/1","doc":"iex> Bonfire.Boundaries.Grants.get(:guests_may_see_read)","ref":"Bonfire.Boundaries.Grants.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grant/5","doc":"Adds or update a grant on an Acl.\n\nTakes five parameters:\n- `subject_id`: who we are granting access to\n- `acl_id`: what ACL we're applying a grant to\n- `verb`: which verb/action\n- `value`: true, false, or nil\n- `opts`: additional options","ref":"Bonfire.Boundaries.Grants.html#grant/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grant/5","doc":"iex> Bonfire.Boundaries.Grants.grant(\"subject_123\", \"acl_456\", :read, true)","ref":"Bonfire.Boundaries.Grants.html#grant/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grant_role/4","doc":"Edits or adds grants to an ACL based on a role.","ref":"Bonfire.Boundaries.Grants.html#grant_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grant_role/4","doc":"iex> Bonfire.Boundaries.Grants.grant_role(\"subject_123\", \"acl_456\", :admin, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#grant_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grants/0","doc":"Gets the configuration for grants.","ref":"Bonfire.Boundaries.Grants.html#grants/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grants/0","doc":"iex> Bonfire.Boundaries.Grants.grants()\n %{}","ref":"Bonfire.Boundaries.Grants.html#grants/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grants_to_tuples/2","doc":"Converts a list of grants to a list of tuples for a given creator.","ref":"Bonfire.Boundaries.Grants.html#grants_to_tuples/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grants_to_tuples/2","doc":"iex> Bonfire.Boundaries.Grants.grants_to_tuples(%User{}, %{grants: [%Grant{}]})\n [{%User{}, :some_role}]","ref":"Bonfire.Boundaries.Grants.html#grants_to_tuples/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.list/1","doc":"Lists the grants permitted to see.","ref":"Bonfire.Boundaries.Grants.html#list/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_for_acl/2","doc":"Lists the grants for a given ACL.","ref":"Bonfire.Boundaries.Grants.html#list_for_acl/2"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_my/1","doc":"Lists the grants we are the registered caretakers of that we are\npermitted to see. If any are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Grants.html#list_my/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_q/1","doc":"","ref":"Bonfire.Boundaries.Grants.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.remove_subject_from_acl/2","doc":"Removes a subject's grants from an ACL or ACLs.","ref":"Bonfire.Boundaries.Grants.html#remove_subject_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.remove_subject_from_acl/2","doc":"iex> Bonfire.Boundaries.Grants.remove_subject_from_acl(\"subject_123\", [\"acl_456\", \"acl_789\"])\n {:ok, %{}}","ref":"Bonfire.Boundaries.Grants.html#remove_subject_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.subject_grants/1","doc":"Returns a list of grants-per-subject from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subject_grants/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.subject_verb_grants/1","doc":"Returns a list of grants-per-verb-per-subject from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subject_verb_grants/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.subject_verb_grants/1","doc":"iex> Bonfire.Boundaries.Grants.subject_verb_grants([%Grant{}])\n %{}","ref":"Bonfire.Boundaries.Grants.html#subject_verb_grants/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.subjects/1","doc":"Returns the subject(s) from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subjects/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.upsert_or_delete/2","doc":"Inserts, updates, or deletes a grant based on the given attributes and options.","ref":"Bonfire.Boundaries.Grants.html#upsert_or_delete/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.upsert_or_delete/2","doc":"iex> Bonfire.Boundaries.Grants.upsert_or_delete(%{acl_id: \"456\", subject_id: \"123\", verb_id: \"789\", value: true}, [])\n {:ok, %Grant{}}\n\n iex> Bonfire.Boundaries.Grants.upsert_or_delete(%{acl_id: \"456\", subject_id: \"123\", verb_id: \"789\", value: nil}, [])\n {:ok, _deleted}","ref":"Bonfire.Boundaries.Grants.html#upsert_or_delete/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.verb_subject_grant/1","doc":"Returns a list of grants-per-subject-per-verb from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#verb_subject_grant/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.verb_subject_grant/1","doc":"iex> Bonfire.Boundaries.Grants.verb_subject_grant([%Grant{}])\n %{}","ref":"Bonfire.Boundaries.Grants.html#verb_subject_grant/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Integration","doc":"","ref":"Bonfire.Boundaries.Integration.html"},{"type":"function","title":"Bonfire.Boundaries.Integration.is_local?/2","doc":"","ref":"Bonfire.Boundaries.Integration.html#is_local?/2"},{"type":"function","title":"Bonfire.Boundaries.Integration.many/3","doc":"","ref":"Bonfire.Boundaries.Integration.html#many/3"},{"type":"function","title":"Bonfire.Boundaries.Integration.repo/0","doc":"","ref":"Bonfire.Boundaries.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Boundaries.LiveHandler","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.acl_create/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#acl_create/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.boundaries_on_objects/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#boundaries_on_objects/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.circle_create/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#circle_create/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.maybe_check_boundaries/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#maybe_check_boundaries/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.maybe_redirect_to/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#maybe_redirect_to/3"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.my_acls/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#my_acls/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.my_circles_paginated/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#my_circles_paginated/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.prepare_assigns/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#prepare_assigns/1"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.remove_from_circle_tuples/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#remove_from_circle_tuples/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.scope_origin/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#scope_origin/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.set_circles_tuples/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#set_circles_tuples/3"},{"type":"macro","title":"Bonfire.Boundaries.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.subject_name/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#subject_name/1"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.unblock/4","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#unblock/4"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Boundaries.Queries","doc":"Helpers for writing common boundary-related queries, particularly for applying access control to queries.\n\nThis module provides macros and functions to assist with boundary checks and permission queries.","ref":"Bonfire.Boundaries.Queries.html"},{"type":"macro","title":"Bonfire.Boundaries.Queries.add_perms/2","doc":"A macro that calls the `add_perms(bool?, bool?)` DB function","ref":"Bonfire.Boundaries.Queries.html#add_perms/2"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.add_perms/2","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query = from(p in Summary, select: add_perms(p.read, p.write))","ref":"Bonfire.Boundaries.Queries.html#add_perms/2-examples"},{"type":"macro","title":"Bonfire.Boundaries.Queries.agg_perms/1","doc":"A macro that calls the `agg_perms(bool?)` aggregate DB function for combining permissions.","ref":"Bonfire.Boundaries.Queries.html#agg_perms/1"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.agg_perms/1","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query = from(p in Summary, group_by: p.object_id, having: agg_perms(p.value))","ref":"Bonfire.Boundaries.Queries.html#agg_perms/1-examples"},{"type":"macro","title":"Bonfire.Boundaries.Queries.boundarise/3","doc":"A macro to apply boundary checks to a query.","ref":"Bonfire.Boundaries.Queries.html#boundarise/3"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.boundarise/3","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query_visible_posts = from(p in Post)\n |> boundarise(p.id, current_user: user)\n\n iex> query_editable_posts = from(p in Post)\n |> boundarise(p.id, verbs: [:edit], current_user: user)","ref":"Bonfire.Boundaries.Queries.html#boundarise/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.object_boundarised/2","doc":"Applies boundary checks to a query for a specific object.","ref":"Bonfire.Boundaries.Queries.html#object_boundarised/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.object_boundarised/2","doc":"iex> query = from(p in Post)\n iex> Bonfire.Boundaries.Queries.object_boundarised(query, current_user: user)","ref":"Bonfire.Boundaries.Queries.html#object_boundarised/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.permitted/1","doc":"Queries for all permitted objects for a user.","ref":"Bonfire.Boundaries.Queries.html#permitted/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.permitted/1","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.permitted(user_id)","ref":"Bonfire.Boundaries.Queries.html#permitted/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.permitted/2","doc":"Queries for permitted objects for a user with specific verbs.","ref":"Bonfire.Boundaries.Queries.html#permitted/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.permitted/2","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.permitted(user_id, [:read, :write])","ref":"Bonfire.Boundaries.Queries.html#permitted/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.query_with_summary/3","doc":"Creates a subquery to filter results based on user permissions.\n\nFilters out results that the current user is not permitted to perform *all* of the specified verbs on.","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Queries.query_with_summary/3","doc":"- `user`: The current user or their ID\n- `verbs`: A list of verbs to check permissions for (default: [:see, :read])\n- `query`: An initial query on `Summary` to filter objects (optional)","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.query_with_summary/3","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.query_with_summary(user_id, [:read, :write])","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.skip_boundary_check?/2","doc":"Checks if boundary checks should be skipped based on the provided options and object.","ref":"Bonfire.Boundaries.Queries.html#skip_boundary_check?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.skip_boundary_check?/2","doc":"iex> Bonfire.Boundaries.Queries.skip_boundary_check?([skip_boundary_check: true])\n true\n\n iex> Bonfire.Boundaries.Queries.skip_boundary_check?([], %{id: \"user123\"})\n false\n\n iex> Bonfire.Boundaries.Queries.skip_boundary_check?([current_user: %{id: \"user123\"}], %{id: \"user123\"})\n true","ref":"Bonfire.Boundaries.Queries.html#skip_boundary_check?/2-examples"},{"type":"module","title":"Bonfire.Boundaries.Roles","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.\n\nHere are some preset roles and their associated actions:\n\n- **Read**: can discover the content in lists (like feeds) and read it; request permission for another verb (e.g., request to follow).\n- **Interact**: can read, plus like an object (and notify the author); follow a user or thread; boost an object (and notify the author); pin something to highlight it.\n- **Participate**: can interact, plus reply to an activity or post; mention a user or object (and notify them); send a message.\n- **Contribute**: can participate, plus create a post or other object; tag a user or object or publish in a topic.\n- **Caretaker**: can perform all of the above actions and more, including actions like deletion.\n\nThere are also negative roles, indicating actions which you specifically do not want to allow a particular circle or user to do, such as:\n\n- **Cannot Read**: not discoverable in lists or readable, and also can't interact or participate.\n- **Cannot Interact**: cannot perform any actions related to interaction, including liking, following, boosting, and pinning, and also can't participate.\n- **Cannot Participate**: cannot perform any actions related to participation, including replying, mentioning, and sending messages.\n\nNegative permissions always take precedence over positive or undefined permissions. For example, For example, if you share something giving permission to anyone to read and reply to it, and you assign the *Cannot Participate* role to your *Likely to troll* circle, the people in that circle will be able to read the content but will not be able to reply to it.\n\n> Note that these negative roles do not grant any additional permissions. Assigning the Cannot Participate role to someone who wouldn't otherwise be able to read the content does not mean they will now have the ability to do so. Negative roles simply limit or override any permissions defined elsewhere, ensuring that the specified actions are explicitly restricted.","ref":"Bonfire.Boundaries.Roles.html"},{"type":"function","title":"Bonfire.Boundaries.Roles.cannot_role_from_verb/5","doc":"Determines a matching negative role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#cannot_role_from_verb/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.cannot_role_from_verb/5","doc":"iex> cannot_role_from_verb(verbs)","ref":"Bonfire.Boundaries.Roles.html#cannot_role_from_verb/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.create/2","doc":"Creates a role with given attributes and options.","ref":"Bonfire.Boundaries.Roles.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.create/2","doc":"iex> create(attrs, opts)","ref":"Bonfire.Boundaries.Roles.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.create/3","doc":"Creates a role with a given name, usage, and options.","ref":"Bonfire.Boundaries.Roles.html#create/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.create/3","doc":"iex> create(\"Admin\", :admin, opts)\n # creates an admin role with the provided options","ref":"Bonfire.Boundaries.Roles.html#create/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.edit_verb_permission/4","doc":"Edits a verb permission for a role","ref":"Bonfire.Boundaries.Roles.html#edit_verb_permission/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.edit_verb_permission/4","doc":"iex> edit_verb_permission(:admin, :read, true, opts)\n # updates the read permission for the admin role to true\n\n iex> edit_verb_permission(:admin, :read, false, opts)\n # updates the read permission for the admin role to false\n\n iex> edit_verb_permission(:admin, :read, nil, opts)\n # resets the read permission for the admin role to default","ref":"Bonfire.Boundaries.Roles.html#edit_verb_permission/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.get/2","doc":"Retrieves the details of a role by `role_name`.","ref":"Bonfire.Boundaries.Roles.html#get/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.get/2","doc":"iex> get(:admin)\n # returns admin role details","ref":"Bonfire.Boundaries.Roles.html#get/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.preset_boundary_role_from_acl/1","doc":"Determines the preset boundary role from an ACL summary or list of verbs.","ref":"Bonfire.Boundaries.Roles.html#preset_boundary_role_from_acl/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.preset_boundary_role_from_acl/1","doc":"iex> preset_boundary_role_from_acl(%{verbs: verbs})\n\n iex> preset_boundary_role_from_acl(verbs)","ref":"Bonfire.Boundaries.Roles.html#preset_boundary_role_from_acl/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.reset_instance_roles/0","doc":"Clears instance-wide roles from config.","ref":"Bonfire.Boundaries.Roles.html#reset_instance_roles/0"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_from_grants/2","doc":"Determines the matching role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#role_from_grants/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_from_grants/2","doc":"iex> role_from_grants(grants)","ref":"Bonfire.Boundaries.Roles.html#role_from_grants/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_from_verb/5","doc":"Determines a matching positive role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#role_from_verb/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_from_verb/5","doc":"iex> role_from_verb(verbs)","ref":"Bonfire.Boundaries.Roles.html#role_from_verb/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_verbs/2","doc":"Retrieves role verbs based on the given `usage`.","ref":"Bonfire.Boundaries.Roles.html#role_verbs/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_verbs/2","doc":"iex> role_verbs(:all, scope: :instance)\n # returns all instance-level role verbs\n\n iex> role_verbs(nil, current_user: me)\n # returns my role verbs","ref":"Bonfire.Boundaries.Roles.html#role_verbs/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.roles_for_dropdown/2","doc":"Returns a list of roles to be used in a user's a dropdown menu.","ref":"Bonfire.Boundaries.Roles.html#roles_for_dropdown/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.roles_for_dropdown/2","doc":"iex> roles_for_dropdown(:ops, current_user: me)","ref":"Bonfire.Boundaries.Roles.html#roles_for_dropdown/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.split_tuples_can_cannot/1","doc":"Splits a list of tuples into can and cannot categories.","ref":"Bonfire.Boundaries.Roles.html#split_tuples_can_cannot/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.split_tuples_can_cannot/1","doc":"iex> split_tuples_can_cannot(tuples)\n # splits tuples into can and cannot categories","ref":"Bonfire.Boundaries.Roles.html#split_tuples_can_cannot/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.verbs_for_role/2","doc":"Returns a list of positive and negative verbs for the given role.","ref":"Bonfire.Boundaries.Roles.html#verbs_for_role/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.verbs_for_role/2","doc":"iex> verbs_for_role(:admin)\n {:ok, positive_verbs, negative_verbs}","ref":"Bonfire.Boundaries.Roles.html#verbs_for_role/2-examples"},{"type":"module","title":"Bonfire.Boundaries.RuntimeConfig","doc":"","ref":"Bonfire.Boundaries.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Boundaries.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.Boundaries.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Boundaries.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Boundaries.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Boundaries.Summary","doc":"View that facilities the querying of objects' boundaries. See `Bonfire.Boundaries.Queries` for how it is used.","ref":"Bonfire.Boundaries.Summary.html"},{"type":"function","title":"Bonfire.Boundaries.Summary.drop_views/1","doc":"","ref":"Bonfire.Boundaries.Summary.html#drop_views/1"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate/1","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate/1"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate_functions/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate_functions/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate_views/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate_views/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.refresh/0","doc":"A function that refreshes a current version of the view,\ndefined in module.\nCurrently support only materialized views.\n\n iex> Catalog.refresh\n :ok","ref":"Bonfire.Boundaries.Summary.html#refresh/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.refresh_material_view/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#refresh_material_view/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.repo/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#repo/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.source/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#source/0"},{"type":"module","title":"Bonfire.Boundaries.Users","doc":"Reads fixtures in configuration and creates a default boundaries setup for a user","ref":"Bonfire.Boundaries.Users.html"},{"type":"function","title":"Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"Creates the default boundaries setup for a newly-created user.","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"- `user`: The user for whom to create the default boundaries.\n - `opts`: Optional parameters for customizing the boundaries (such as whether the user is `undiscoverable` or requires `request_before_follow`)","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"> Bonfire.Boundaries.Users.create_default_boundaries(user)","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"Creates any missing boundaries for an existing user. Used when the app or config has defined some new types of default boundaries.","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"- `user`: The user for whom to create the missing boundaries.\n - `opts`: Optional parameters for customizing the boundaries (not currently used)","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"> Bonfire.Boundaries.Users.create_missing_boundaries(user)","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Users.PreparedBoundaries","doc":"This module structures the information about the default boundaries for a newly created user before they are inserted in the database.\nIt takes care of reading the configuration about the default boundaries and prepare the information for the Bonfire.Boundaries.Users module.","ref":"Bonfire.Boundaries.Users.PreparedBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Users.PreparedBoundaries.from_config/3","doc":"Creates PreparedBoundaries for a given user based on the runtime config.","ref":"Bonfire.Boundaries.Users.PreparedBoundaries.html#from_config/3"},{"type":"module","title":"Bonfire.Boundaries.Verbs","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Verb` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Verbs.html"},{"type":"function","title":"Bonfire.Boundaries.Verbs.changeset/2","doc":"Returns a changeset for the given verb and attributes.","ref":"Bonfire.Boundaries.Verbs.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.changeset/2","doc":"iex> Bonfire.Boundaries.Verbs.changeset(%{verb: :new_verb, description: \"A new verb\"})","ref":"Bonfire.Boundaries.Verbs.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.create/1","doc":"Creates a new verb with the given attributes.","ref":"Bonfire.Boundaries.Verbs.html#create/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.create/1","doc":"> Bonfire.Boundaries.Verbs.create(%{verb: :new_verb, description: \"A new verb\"})\n{:ok, %Verb{id: \"new_verb_id\", verb: :new_verb, description: \"A new verb\"}}","ref":"Bonfire.Boundaries.Verbs.html#create/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get/2","doc":"Retrieves a verb by its slug or ID.","ref":"Bonfire.Boundaries.Verbs.html#get/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get/2","doc":"iex> Bonfire.Boundaries.Verbs.get(:read)\n %{id: \"read_id\", verb: :read}\n\n iex> Bonfire.Boundaries.Verbs.get(\"read_id\")\n %{id: \"read_id\", verb: :read}\n\n iex> Bonfire.Boundaries.Verbs.get(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get!/2","doc":"Retrieves verb details by its ID or name, raising an error if not found.","ref":"Bonfire.Boundaries.Verbs.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get!/2","doc":"iex> Bonfire.Boundaries.Verbs.get!(\"read\")\n %{id: \"some_id\", verb: :read} # Example output\n\n iex> Bonfire.Boundaries.Verbs.get!(\"non_existent_id\")\n ** (RuntimeError) Missing default verb: \"non_existent_id\"","ref":"Bonfire.Boundaries.Verbs.html#get!/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_id/2","doc":"Retrieves a verb ID by its slug.","ref":"Bonfire.Boundaries.Verbs.html#get_id/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_id/2","doc":"iex> Bonfire.Boundaries.Verbs.get_id(:read)\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id(\"read\")\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get_id/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_id!/2","doc":"Retrieves a verb ID by its slug or ID, raising an error if not found.\n\n iex> Bonfire.Boundaries.Verbs.get_id!(:read)\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id!(\"non_existent\")\n ** (RuntimeError) Missing default verb: \"non_existent\"","ref":"Bonfire.Boundaries.Verbs.html#get_id!/2"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_slug/2","doc":"Retrieves a verb slug by its ID or name.","ref":"Bonfire.Boundaries.Verbs.html#get_slug/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_slug/2","doc":"iex> Bonfire.Boundaries.Verbs.get_slug(\"read_id\")\n :read","ref":"Bonfire.Boundaries.Verbs.html#get_slug/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_tuple/2","doc":"Retrieves a verb tuple by its ID or name.","ref":"Bonfire.Boundaries.Verbs.html#get_tuple/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_tuple/2","doc":"iex> Bonfire.Boundaries.Verbs.get_tuple(\"read_id\")\n {:read, %{id: \"read_id\", verb: :read}}\n\n iex> Bonfire.Boundaries.Verbs.get_tuple(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get_tuple/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.ids/2","doc":"Retrieves the IDs of the given verbs.\n\n iex> Bonfire.Boundaries.Verbs.ids([:read, :write])\n [\"read_id\", \"write_id\"]\n\n iex> Bonfire.Boundaries.Verbs.ids(:read)\n [\"read_id\"]","ref":"Bonfire.Boundaries.Verbs.html#ids/2"},{"type":"function","title":"Bonfire.Boundaries.Verbs.list/2","doc":"Lists the verbs from the specified source and key.","ref":"Bonfire.Boundaries.Verbs.html#list/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.list/2","doc":"iex> Bonfire.Boundaries.Verbs.list(:db, :verb)\n %{read: %Verb{id: \"read_id\", verb: :read}, write: %Verb{id: \"write_id\", verb: :write}}\n\n iex> Bonfire.Boundaries.Verbs.list(:instance, :id)\n [\"read_id\", \"write_id\"]","ref":"Bonfire.Boundaries.Verbs.html#list/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.list_verbs_debug/0","doc":"Returns a debug list of verbs by comparing the database and code.","ref":"Bonfire.Boundaries.Verbs.html#list_verbs_debug/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.list_verbs_debug/0","doc":"> Bonfire.Boundaries.Verbs.list_verbs_debug()\n # Example output:\n [ok: :read, error: \"Code and DB have differing IDs for the same verb\", ...]","ref":"Bonfire.Boundaries.Verbs.html#list_verbs_debug/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.slugs/0","doc":"Returns the list of verb slugs.","ref":"Bonfire.Boundaries.Verbs.html#slugs/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.slugs/0","doc":"iex> Bonfire.Boundaries.Verbs.slugs()\n [:read, :write]","ref":"Bonfire.Boundaries.Verbs.html#slugs/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.verbs/0","doc":"Returns the list of verbs from the configuration.","ref":"Bonfire.Boundaries.Verbs.html#verbs/0"},{"type":"function","title":"Bonfire.Boundaries.Verbs.verbs_count/0","doc":"Returns the count of verbs in the configuration.","ref":"Bonfire.Boundaries.Verbs.html#verbs_count/0"},{"type":"module","title":"Bonfire.Boundaries.Web.ExcludeBoundaries","doc":"","ref":"Bonfire.Boundaries.Web.ExcludeBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Web.ExcludeBoundaries.handle_event/3","doc":"","ref":"Bonfire.Boundaries.Web.ExcludeBoundaries.html#handle_event/3"},{"type":"module","title":"Bonfire.Boundaries.Web.Routes","doc":"","ref":"Bonfire.Boundaries.Web.Routes.html"},{"type":"function","title":"Bonfire.Boundaries.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Boundaries.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Common","doc":"A library of common utils and helpers used across Bonfire extensions.\n\nAn extension for [Bonfire](https://bonfire.cafe/) that contains:\n\n- Many common functions in `Bonfire.Common.Utils`\n- Path and URL generators in `Bonfire.Common.URIs`\n- Date and time helpers in `Bonfire.Common.DatesTimes`\n- Etc","ref":"Bonfire.Common.html"},{"type":"module","title":"Handy commands - Bonfire.Common","doc":"","ref":"Bonfire.Common.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Common","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Common.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Common.maybe_fallback/2","doc":"Provides a fallback value or function when the first argument is `nil`.\n\n- If the first argument is not `nil`, returns the first argument as is.\n- If both arguments are `nil`, returns `nil`.\n- If the first argument is `nil` and the second argument is a function, calls the function and returns its result.\n- If the first argument is `nil` and the second argument is not a function, returns the second argument as is.","ref":"Bonfire.Common.html#maybe_fallback/2"},{"type":"function","title":"Examples - Bonfire.Common.maybe_fallback/2","doc":"iex> maybe_fallback(\"value\", \"fallback value\")\n \"value\"\n \n iex> maybe_fallback(nil, nil)\n nil\n\n iex> maybe_fallback(nil, fn -> 1+2 end)\n 3\n\n iex> maybe_fallback(nil, \"fallback value\")\n \"fallback value\"","ref":"Bonfire.Common.html#maybe_fallback/2-examples"},{"type":"module","title":"Bonfire.Common.AntiSpam","doc":"Module to load the service adapter defined inside the configuration.\n\nSee `Bonfire.Common.AntiSpam.Provider`.","ref":"Bonfire.Common.AntiSpam.html"},{"type":"function","title":"Bonfire.Common.AntiSpam.service/0","doc":"Returns the appropriate service adapter.\n\nAccording to the config behind\n `config :mobilizon, Bonfire.Common.AntiSpam,\n service: Bonfire.Common.AntiSpam.Module`","ref":"Bonfire.Common.AntiSpam.html#service/0"},{"type":"module","title":"Bonfire.Common.AntiSpam.Akismet","doc":"Integration with Akismet.com for spam detection\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Akismet.html"},{"type":"module","title":"Bonfire.Common.AntiSpam.Mock","doc":"Mock for Anti-spam Provider implementations.\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Mock.html"},{"type":"behaviour","title":"Bonfire.Common.AntiSpam.Provider","doc":"Provider Behaviour for anti-spam detection.","ref":"Bonfire.Common.AntiSpam.Provider.html"},{"type":"behaviour","title":"Supported backends - Bonfire.Common.AntiSpam.Provider","doc":"* `Bonfire.Common.AntiSpam.Akismet` [🔗](https://akismet.com/)\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Provider.html#module-supported-backends"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_comment/3","doc":"Check a comment (or microblog) details","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_comment/3"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_current_user/1","doc":"Check an user details","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_current_user/1"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_object/2","doc":"Check an object details (such as a blog post)","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_object/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_profile/2","doc":"Check a profile details","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_profile/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.ready?/0","doc":"Make sure the provider is ready","ref":"Bonfire.Common.AntiSpam.Provider.html#c:ready?/0"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.report_ham/2","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#c:report_ham/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.report_spam/2","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#c:report_spam/2"},{"type":"type","title":"Bonfire.Common.AntiSpam.Provider.result/0","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#t:result/0"},{"type":"type","title":"Bonfire.Common.AntiSpam.Provider.spam_result/0","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#t:spam_result/0"},{"type":"module","title":"Bonfire.Common.Benchmark","doc":"Simple way to measure the execution time of functions. It is preferred to use `@decorate` from `Untangle` instead.","ref":"Bonfire.Common.Benchmark.html"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/1","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/1"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/2","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/2"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/3","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/3"},{"type":"module","title":"Bonfire.Common.Cache","doc":"Helpers for caching data and operations","ref":"Bonfire.Common.Cache.html"},{"type":"macro","title":"Bonfire.Common.Cache.cache/0","doc":"","ref":"Bonfire.Common.Cache.html#cache/0"},{"type":"function","title":"Bonfire.Common.Cache.cache_store/1","doc":"","ref":"Bonfire.Common.Cache.html#cache_store/1"},{"type":"function","title":"Bonfire.Common.Cache.cached_preloads_for_objects/3","doc":"","ref":"Bonfire.Common.Cache.html#cached_preloads_for_objects/3"},{"type":"function","title":"Bonfire.Common.Cache.get/2","doc":"","ref":"Bonfire.Common.Cache.html#get/2"},{"type":"function","title":"Bonfire.Common.Cache.get!/2","doc":"","ref":"Bonfire.Common.Cache.html#get!/2"},{"type":"function","title":"Bonfire.Common.Cache.maybe_apply_cached/3","doc":"Takes a function (or module and function names) and a set of arguments for that function, and tries to fetch the previous result of running that function from the in-memory cache, using the MFA (module name/function name/arguments used) to generate the cache key. If it's not in the cache, it executes the function, and caches and returns the result.","ref":"Bonfire.Common.Cache.html#maybe_apply_cached/3"},{"type":"function","title":"Bonfire.Common.Cache.put/3","doc":"","ref":"Bonfire.Common.Cache.html#put/3"},{"type":"function","title":"Bonfire.Common.Cache.remove/2","doc":"It removes the entry associated with a key from the cache.","ref":"Bonfire.Common.Cache.html#remove/2"},{"type":"function","title":"Bonfire.Common.Cache.remove_all/1","doc":"","ref":"Bonfire.Common.Cache.html#remove_all/1"},{"type":"function","title":"Bonfire.Common.Cache.reset/3","doc":"It removes the result of a given function from the cache.","ref":"Bonfire.Common.Cache.html#reset/3"},{"type":"module","title":"Bonfire.Common.Cache.DiskCache","doc":"","ref":"Bonfire.Common.Cache.DiskCache.html"},{"type":"module","title":"Bonfire.Common.Changelog.Github.DataGrabber","doc":"Datagrabber for changelog generation, `Versioce.Config.Changelog.datagrabber/0`\n\nUses repository history to obtain and format data.","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.fetch_issues/1","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#fetch_issues/1"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.format_issue/1","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#format_issue/1"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.prepare_data/2","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#prepare_data/2"},{"type":"module","title":"Bonfire.Common.Config","doc":"Helpers to get app/extension OTP config, or to override a config key. Basically a wrapper of `Application.get_env/3` and `Application.put_env/3`.","ref":"Bonfire.Common.Config.html"},{"type":"macro","title":"Bonfire.Common.Config.compilation_error/1","doc":"","ref":"Bonfire.Common.Config.html#compilation_error/1"},{"type":"function","title":"Bonfire.Common.Config.delete/2","doc":"Deletes the configuration value for a key in a specific OTP app or extension.\n\nThis function removes the configuration value for the given key from the specified OTP app or extension.","ref":"Bonfire.Common.Config.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.delete/2","doc":"iex> delete(:key)\n :ok\n\n iex> delete([:nested, :key], :my_app)\n :ok","ref":"Bonfire.Common.Config.html#delete/2-examples"},{"type":"function","title":"Bonfire.Common.Config.endpoint_module/0","doc":"Retrieves the Phoenix endpoint module for the application.\n\nThis function first attempts to fetch the Phoenix endpoint module from the `:phoenix_endpoint_module` key in the process dictionary. If not found, it retrieves the value from the application configuration, defaulting to `Bonfire.Web.Endpoint` if not configured.","ref":"Bonfire.Common.Config.html#endpoint_module/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.endpoint_module/0","doc":"iex> endpoint_module()\n Bonfire.Web.Endpoint","ref":"Bonfire.Common.Config.html#endpoint_module/0-examples"},{"type":"function","title":"Bonfire.Common.Config.env/0","doc":"Retrieves the environment configuration for the application.\n\nThis function returns the value of the `:env` configuration key for the application.","ref":"Bonfire.Common.Config.html#env/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.env/0","doc":"iex> env()\n :test","ref":"Bonfire.Common.Config.html#env/0-examples"},{"type":"function","title":"Bonfire.Common.Config.get/3","doc":"Retrieves a configuration value for a key, optionally from a specific OTP app or extension.\n\nThis function can handle single keys or nested key trees and returns the configuration value associated with the key(s). It falls back to a default value if the key is not found.","ref":"Bonfire.Common.Config.html#get/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.get/3","doc":"iex> get(:test_key, \"default\")\n \"test_value\"\n\n iex> get([:nested, :key], \"default\", :bonfire)\n \"default\"\n\n iex> get(:missing_key, \"default\")\n \"default\"","ref":"Bonfire.Common.Config.html#get/3-examples"},{"type":"function","title":"Bonfire.Common.Config.get!/2","doc":"Retrieves the configuration value for a key and raises an error if the value is not found.","ref":"Bonfire.Common.Config.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.get!/2","doc":"iex> get!(:test_key)\n \"test_value\"\n\n iex> get!(:missing_key)\n ** (Bonfire.Common.Config.Error) Missing configuration value: [:bonfire, :missing_key]","ref":"Bonfire.Common.Config.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext/1","doc":"Retrieves all configuration keys and values for a specific Bonfire extension or OTP app.","ref":"Bonfire.Common.Config.html#get_ext/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext/1","doc":"> get_ext(:my_extension)\n [key1: \"value1\", key2: \"value2\"]\n\n > get_ext(:another_extension)\n []","ref":"Bonfire.Common.Config.html#get_ext/1-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext/3","doc":"Retrieves a configuration value for a specific Bonfire extension or OTP app key.\n\nThis function attempts to get the configuration value for the given key from the specified extension or OTP app. If the key is not found, it falls back to checking the top-level Bonfire app configuration.","ref":"Bonfire.Common.Config.html#get_ext/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext/3","doc":"iex> get_ext(:bonfire_common, :test_key, \"default\")\n \"test_value\"\n\n iex> get_ext(:my_extension, :missing_key, \"default\")\n \"default\"","ref":"Bonfire.Common.Config.html#get_ext/3-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext!/1","doc":"Retrieves all configuration keys and values for a specific Bonfire extension or OTP app and raises an error if no configuration is found.","ref":"Bonfire.Common.Config.html#get_ext!/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext!/1","doc":"iex> config = get_ext!(:bonfire_common)\n iex> is_list(config) and config !=[]\n true\n\n iex> get_ext!(:non_existent_extension)\n ** (Bonfire.Common.Config.Error) Empty configuration for extension: non_existent_extension","ref":"Bonfire.Common.Config.html#get_ext!/1-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext!/2","doc":"Retrieves the configuration value for a specific Bonfire extension or OTP app key and raises an error if the value is not found.\n\nThis function attempts to get the configuration value for the given key from the specified extension or OTP app. If the key is not present or the value is nil, it raises a compilation error.","ref":"Bonfire.Common.Config.html#get_ext!/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext!/2","doc":"iex> get_ext!(:bonfire_common, :test_key)\n \"test_value\"\n\n iex> get_ext!(:my_extension, :missing_key)\n ** (Bonfire.Common.Config.Error) Missing configuration value: [:my_extension, :missing_key]","ref":"Bonfire.Common.Config.html#get_ext!/2-examples"},{"type":"function","title":"Bonfire.Common.Config.keys_tree/1","doc":"Constructs a key path for configuration settings, which always starts with an app or extension name. It starts with the main OTP app or extension and includes additional keys as specified.\n\n > keys_tree([:bonfire_me, Bonfire.Me.Users])\n [:bonfire_me, Bonfire.Me.Users]\n\n > keys_tree(Bonfire.Me.Users)\n [:bonfire_me, Bonfire.Me.Users]\n\n > keys_tree(:bonfire_me)\n [:bonfire_me]\n\n iex> keys_tree(:random_atom)\n [:bonfire, :random_atom]\n\n iex>keys_tree([:random_atom, :sub_key])\n [:bonfire, :random_atom, :sub_key]","ref":"Bonfire.Common.Config.html#keys_tree/1"},{"type":"function","title":"Bonfire.Common.Config.module_enabled?/1","doc":"","ref":"Bonfire.Common.Config.html#module_enabled?/1"},{"type":"function","title":"Bonfire.Common.Config.put/1","doc":"","ref":"Bonfire.Common.Config.html#put/1"},{"type":"function","title":"Bonfire.Common.Config.put/3","doc":"Sets the configuration value for a key or key tree in a specific OTP app or extension.\n\nThis function allows you to set the configuration value for the specified key(s) in the given OTP app or extension. It supports nested configurations.","ref":"Bonfire.Common.Config.html#put/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.put/3","doc":"iex> put(:test_key, \"test_value\")\n :ok\n\n iex> put([:nested, :key], \"test_value\", :my_app)\n :ok","ref":"Bonfire.Common.Config.html#put/3-examples"},{"type":"function","title":"Bonfire.Common.Config.repo/0","doc":"Retrieves the Ecto repository module for the application.\n\nThis function first attempts to fetch the Ecto repository module from the `:ecto_repo_module` key in the process dictionary. If not found, it retrieves the value from the application configuration, and defaults to `Bonfire.Common.Repo` if not configured.","ref":"Bonfire.Common.Config.html#repo/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.repo/0","doc":"iex> repo()\n Bonfire.Common.Repo","ref":"Bonfire.Common.Config.html#repo/0-examples"},{"type":"function","title":"Bonfire.Common.Config.require_extension_config!/1","doc":"Raises an error if the specified Bonfire extension is not configured.\n\nThis function checks whether the configuration for a given Bonfire extension exists. If the configuration is missing, it raises a compilation error with a message indicating how to set up the configuration file.","ref":"Bonfire.Common.Config.html#require_extension_config!/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.require_extension_config!/1","doc":"iex> require_extension_config!(:some_extension)\n ** (Bonfire.Common.Config.Error) You have not configured the `some_extension` Bonfire extension, please `cp ./deps/some_extension/config/some_extension.exs ./config/some_extension.exs` in your Bonfire app repository and then customise the copied config as necessary","ref":"Bonfire.Common.Config.html#require_extension_config!/1-examples"},{"type":"function","title":"Bonfire.Common.Config.top_level_otp_app/0","doc":"","ref":"Bonfire.Common.Config.html#top_level_otp_app/0"},{"type":"exception","title":"Bonfire.Common.Config.Error","doc":"","ref":"Bonfire.Common.Config.Error.html"},{"type":"module","title":"Bonfire.Common.Config.LoadExtensionsConfig","doc":"Loads instance Settings from DB into Elixir's Config\n\nWhile this module is a GenServer, it is only responsible for querying the settings, putting them in Config, and then exits with :ignore having done so.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.load_configs/1","doc":"","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#load_configs/1"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#start_link/1"},{"type":"behaviour","title":"Bonfire.Common.ConfigModule","doc":"A global cache of runtime config modules to be loaded at app startup.","ref":"Bonfire.Common.ConfigModule.html"},{"type":"callback","title":"Bonfire.Common.ConfigModule.config/0","doc":"Set runtime config","ref":"Bonfire.Common.ConfigModule.html#c:config/0"},{"type":"callback","title":"Bonfire.Common.ConfigModule.config_module/0","doc":"Declares a config module","ref":"Bonfire.Common.ConfigModule.html#c:config_module/0"},{"type":"function","title":"Bonfire.Common.ConfigModule.modules/0","doc":"","ref":"Bonfire.Common.ConfigModule.html#modules/0"},{"type":"behaviour","title":"Bonfire.Common.ContextModule","doc":"Find a context or query module via its schema, backed by a global cache of known modules.","ref":"Bonfire.Common.ContextModule.html"},{"type":"function","title":"Bonfire.Common.ContextModule.apply_error/2","doc":"","ref":"Bonfire.Common.ContextModule.html#apply_error/2"},{"type":"function","title":"Bonfire.Common.ContextModule.context_function_error/2","doc":"","ref":"Bonfire.Common.ContextModule.html#context_function_error/2"},{"type":"callback","title":"Bonfire.Common.ContextModule.context_module/0","doc":"Declares a context module","ref":"Bonfire.Common.ContextModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.ContextModule.context_module/1","doc":"Get a context identified by schema","ref":"Bonfire.Common.ContextModule.html#context_module/1"},{"type":"function","title":"Bonfire.Common.ContextModule.context_module!/1","doc":"Look up a context, throw :not_found if not found.","ref":"Bonfire.Common.ContextModule.html#context_module!/1"},{"type":"function","title":"Bonfire.Common.ContextModule.context_modules/1","doc":"Look up many contexts at once, throw :not_found if any of them are not found","ref":"Bonfire.Common.ContextModule.html#context_modules/1"},{"type":"function","title":"Bonfire.Common.ContextModule.linked_query_modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#linked_query_modules/0"},{"type":"function","title":"Bonfire.Common.ContextModule.linked_schema_modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#linked_schema_modules/0"},{"type":"function","title":"Bonfire.Common.ContextModule.maybe_apply/4","doc":"Given an object or schema module name, run a function on the associated context module.\nTODO: refactor to re-use Utils.maybe_apply?","ref":"Bonfire.Common.ContextModule.html#maybe_apply/4"},{"type":"function","title":"Bonfire.Common.ContextModule.maybe_context_module/1","doc":"","ref":"Bonfire.Common.ContextModule.html#maybe_context_module/1"},{"type":"function","title":"Bonfire.Common.ContextModule.modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#modules/0"},{"type":"callback","title":"Bonfire.Common.ContextModule.query_module/0","doc":"Points to the related queries module","ref":"Bonfire.Common.ContextModule.html#c:query_module/0"},{"type":"callback","title":"Bonfire.Common.ContextModule.schema_module/0","doc":"Points to the related schema module","ref":"Bonfire.Common.ContextModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.DatesTimes","doc":"Date/time helpers","ref":"Bonfire.Common.DatesTimes.html"},{"type":"function","title":"Bonfire.Common.DatesTimes.available_format_keys/2","doc":"Returns a list of available format keys for the given locale.","ref":"Bonfire.Common.DatesTimes.html#available_format_keys/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.available_format_keys/2","doc":"> available_format_keys()\n [:short, :medium, :long, :full] # Example output","ref":"Bonfire.Common.DatesTimes.html#available_format_keys/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.available_formats/2","doc":"Returns a keyword list of available date/time formats for the given locale.","ref":"Bonfire.Common.DatesTimes.html#available_formats/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.available_formats/2","doc":"> available_formats()\n [short: \"Short\", medium: \"Medium\", long: \"Long\", full: \"Full\"] # Example output","ref":"Bonfire.Common.DatesTimes.html#available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.date_from_now/2","doc":"Takes a ULID ID (or an object with one) or a `DateTime` struct, and turns the date into a relative phrase, e.g. `2 days ago`.","ref":"Bonfire.Common.DatesTimes.html#date_from_now/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.date_from_now/2","doc":"> date_from_now(%{id: \"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\"})\n \"25 days ago\" # Example output\n\n > date_from_now(\"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\")\n \"25 days ago\" # Example output","ref":"Bonfire.Common.DatesTimes.html#date_from_now/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.date_from_pointer/1","doc":"Takes an object (or string with an ULID) and converts the ULID ID to a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#date_from_pointer/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.date_from_pointer/1","doc":"> date_from_pointer(\"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\")\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#date_from_pointer/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.format/2","doc":"Formats a `DateTime` struct or date into a string using `Cldr.DateTime.to_string/2`.","ref":"Bonfire.Common.DatesTimes.html#format/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.format/2","doc":"> format(DateTime.now!(\"Etc/UTC\"))\n \"Jul 25, 2024, 11:08:21 AM\"","ref":"Bonfire.Common.DatesTimes.html#format/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.format_date/2","doc":"Formats a `Date` struct or date into a string using `Cldr.Date.to_string/2`.","ref":"Bonfire.Common.DatesTimes.html#format_date/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.format_date/2","doc":"> format(DateTime.now!(\"Etc/UTC\"))\n \"Jul 25, 2024, 11:08:21 AM\"","ref":"Bonfire.Common.DatesTimes.html#format_date/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.future?/1","doc":"Checks if a `DateTime` is in the future relative to the current time.","ref":"Bonfire.Common.DatesTimes.html#future?/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.future?/1","doc":"iex> future?(%Date{year: 3020, month: 7, day: 25})\n true # Example output\n\n iex> future?(%Date{year: 2023, month: 7, day: 25})\n false # Example output","ref":"Bonfire.Common.DatesTimes.html#future?/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.maybe_generate_ulid/1","doc":"Generates a ULID based on a `DateTime` or a string representation of a date/time, but only if the date/time is in the past.","ref":"Bonfire.Common.DatesTimes.html#maybe_generate_ulid/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.maybe_generate_ulid/1","doc":"> maybe_generate_ulid(%Date{year: 2024, month: 7, day: 25})\n \"01J3KJZZ00X1EXD6TZYD3PPDR6\" # Example output\n\n > maybe_generate_ulid(\"2024-07-25\")\n \"01J3KJZZ00X1EXD6TZYD3PPDR6\" # Example output","ref":"Bonfire.Common.DatesTimes.html#maybe_generate_ulid/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.now/0","doc":"Returns the current UTC `DateTime`.","ref":"Bonfire.Common.DatesTimes.html#now/0"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.now/0","doc":"> now()\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#now/0-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.past/2","doc":"Returns a `DateTime` in the past, relative to the current time, by subtracting a specified amount of time.","ref":"Bonfire.Common.DatesTimes.html#past/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.past/2","doc":"> past(10, :day)\n %DateTime{year: 2024, month: 7, day: 15, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#past/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.past?/1","doc":"Checks if a `DateTime` is in the past relative to the current time.","ref":"Bonfire.Common.DatesTimes.html#past?/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.past?/1","doc":"iex> past?(%Date{year: 3020, month: 7, day: 25})\n false # Example output\n\n iex> past?(%Date{year: 2023, month: 7, day: 24})\n true # Example output","ref":"Bonfire.Common.DatesTimes.html#past?/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.relative_date/2","doc":"Converts a `DateTime` struct to a relative date string. Uses `Cldr.DateTime` or `Timex` libraries.","ref":"Bonfire.Common.DatesTimes.html#relative_date/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.relative_date/2","doc":"iex> relative_date(DateTime.now!(\"Etc/UTC\"))\n \"now\" # Example output","ref":"Bonfire.Common.DatesTimes.html#relative_date/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.remove/3","doc":"Removes a specified amount of time from a `DateTime`.","ref":"Bonfire.Common.DatesTimes.html#remove/3"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.remove/3","doc":"> remove(%Date{year: 2024, month: 7, day: 25}, 10, :day)\n %DateTime{year: 2024, month: 7, day: 15, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#remove/3-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.to_date/1","doc":"Converts various formats into a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#to_date/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.to_date/1","doc":"iex> to_date(%Date{year: 2024, month: 7, day: 25})\n %Date{year: 2024, month: 7, day: 25} \n\n iex> to_date(\"2024-07-25\")\n %Date{year: 2024, month: 7, day: 25}\n\n iex> to_date(1656115200000)\n %Date{year: 2022, month: 6, day: 25} \n\n iex> to_date(%{\"day\" => 25, \"month\" => 7, \"year\" => 2024})\n %Date{year: 2024, month: 7, day: 25}","ref":"Bonfire.Common.DatesTimes.html#to_date/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.to_date_time/1","doc":"Converts various formats into a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#to_date_time/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.to_date_time/1","doc":"> to_date_time(%Date{year: 2024, month: 7, day: 25})\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(\"2024-07-25\")\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(1656115200000)\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(%{\"day\" => 25, \"month\" => 7, \"year\" => 2024})\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#to_date_time/1-examples"},{"type":"module","title":"Bonfire.Common.E","doc":"Helper to extract data nested in an object","ref":"Bonfire.Common.E.html"},{"type":"function","title":"Bonfire.Common.E.e/2","doc":"","ref":"Bonfire.Common.E.html#e/2"},{"type":"macro","title":"Bonfire.Common.E.e/3","doc":"Extracts a value from a map or other data structure, or returns a fallback if not present or empty.\nIf additional arguments are provided, it searches for nested data structures, with the last argument always being the fallback.","ref":"Bonfire.Common.E.html#e/3"},{"type":"macro","title":"Examples - Bonfire.Common.E.e/3","doc":"iex> e(%{key: \"value\"}, :key, \"fallback\")\n \"value\"\n\n iex> e(%{key: nil}, :key, \"fallback\")\n \"fallback\"\n\n iex> e(%{key: \"value\"}, :missing_key, \"fallback\")\n \"fallback\"\n\n iex> e(%{key: %Ecto.Association.NotLoaded{}}, :key, \"fallback\")\n \"fallback\"\n\n iex> e({:ok, %{key: \"value\"}}, :key, \"fallback\") # FIXME\n \"value\"\n\n iex> e(%{__context__: %{key: \"context_value\"}}, :key, \"fallback\") # FIXME\n \"context_value\"\n\n iex> e(%{a: %{b: \"value\"}}, :a, :b, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %Ecto.Association.NotLoaded{}}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: nil}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, :d, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, :ed, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: %{d: %{e: \"value\"}}}}}, :a, :b, :c, :d, :e, \"fallback\")\n \"value\"","ref":"Bonfire.Common.E.html#e/3-examples"},{"type":"macro","title":"Bonfire.Common.E.e/4","doc":"","ref":"Bonfire.Common.E.html#e/4"},{"type":"macro","title":"Bonfire.Common.E.e/5","doc":"","ref":"Bonfire.Common.E.html#e/5"},{"type":"macro","title":"Bonfire.Common.E.e/6","doc":"","ref":"Bonfire.Common.E.html#e/6"},{"type":"macro","title":"Bonfire.Common.E.e/7","doc":"","ref":"Bonfire.Common.E.html#e/7"},{"type":"macro","title":"Bonfire.Common.E.e/8","doc":"","ref":"Bonfire.Common.E.html#e/8"},{"type":"function","title":"Bonfire.Common.E.ed/2","doc":"Returns a value if it is not empty, or a fallback value if it is empty.\n\nThis function delegates to `Bonfire.Common.Enums.filter_empty/2` to determine if `val` is empty and returns `fallback` if so.","ref":"Bonfire.Common.E.html#ed/2"},{"type":"function","title":"Examples - Bonfire.Common.E.ed/2","doc":"iex> ed(\"non-empty value\", \"fallback\")\n \"non-empty value\"\n\n iex> ed(\"\", \"fallback\")\n \"fallback\"\n\n iex> ed(nil, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.E.html#ed/2-examples"},{"type":"function","title":"Bonfire.Common.E.ed/3","doc":"Extracts a value from a map or other data structure, or returns a fallback if not present or empty.\nIf additional arguments are provided, it searches for nested data structures, with the last argument always being the fallback.","ref":"Bonfire.Common.E.html#ed/3"},{"type":"function","title":"Examples - Bonfire.Common.E.ed/3","doc":"iex> ed(%{key: \"value\"}, :key, \"fallback\")\n \"value\"\n\n iex> ed(%{key: nil}, :key, \"fallback\")\n \"fallback\"\n\n iex> ed(%{key: \"value\"}, :missing_key, \"fallback\")\n \"fallback\"\n\n iex> ed(%{key: %Ecto.Association.NotLoaded{}}, :key, \"fallback\")\n \"fallback\"\n\n iex> ed({:ok, %{key: \"value\"}}, :key, \"fallback\")\n \"value\"\n\n iex> ed(%{__context__: %{key: \"context_value\"}}, :key, \"fallback\")\n \"context_value\"\n\n iex> ed(%{a: %{b: \"value\"}}, :a, :b, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %Ecto.Association.NotLoaded{}}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: \"value\"}}, [:a, :b], \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: nil}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, :d, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, :ed, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: %{d: %{e: \"value\"}}}}}, :a, :b, :c, :d, :e, \"fallback\")\n \"value\"","ref":"Bonfire.Common.E.html#ed/3-examples"},{"type":"function","title":"Bonfire.Common.E.ed/4","doc":"Returns a value from a nested map, or a fallback if not present","ref":"Bonfire.Common.E.html#ed/4"},{"type":"function","title":"Bonfire.Common.E.ed/5","doc":"","ref":"Bonfire.Common.E.html#ed/5"},{"type":"function","title":"Bonfire.Common.E.ed/6","doc":"","ref":"Bonfire.Common.E.html#ed/6"},{"type":"function","title":"Bonfire.Common.E.ed/7","doc":"","ref":"Bonfire.Common.E.html#ed/7"},{"type":"function","title":"Bonfire.Common.E.ed/8","doc":"","ref":"Bonfire.Common.E.html#ed/8"},{"type":"module","title":"Bonfire.Common.Enums","doc":"Extra functions to manipulate enumerables, basically an extension of `Enum`","ref":"Bonfire.Common.Enums.html"},{"type":"function","title":"Bonfire.Common.Enums.access_keys/2","doc":"","ref":"Bonfire.Common.Enums.html#access_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.all_ok?/1","doc":"Checks if all tuples in the enumerable are `:ok`.","ref":"Bonfire.Common.Enums.html#all_ok?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.all_ok?/1","doc":"iex> Bonfire.Common.Enums.all_ok?([{:ok, 1}, {:ok, 2}])\n true\n\n iex> Bonfire.Common.Enums.all_ok?([{:ok, 1}, {:error, \"failed\"}])\n false","ref":"Bonfire.Common.Enums.html#all_ok?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.all_oks_or_error/1","doc":"Filters the given value or enumerable and if it contains any `:error` tuple, return an `:error` tuple with a list of error values, other return an `:ok` tuple with a list of values.","ref":"Bonfire.Common.Enums.html#all_oks_or_error/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.all_oks_or_error/1","doc":"iex> Bonfire.Common.Enums.all_oks_or_error([{:ok, 1}, {:error, \"failed\"}])\n {:error, [\"failed\"]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error([{:ok, 2}, {:ok, 3}])\n {:ok, [2, 3]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error({:error, \"failed\"})\n {:error, [\"failed\"]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error({:ok, 1})\n {:ok, [1]}","ref":"Bonfire.Common.Enums.html#all_oks_or_error/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.attr_get_id/2","doc":"Gets the value of a key in a map and returns the ID of that value (i.e. either the :id field of that association, or the value itself).","ref":"Bonfire.Common.Enums.html#attr_get_id/2"},{"type":"function","title":"Bonfire.Common.Enums.count_where/2","doc":"Counts the number of items in an enumerable that satisfy the given function.","ref":"Bonfire.Common.Enums.html#count_where/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.count_where/2","doc":"iex> Bonfire.Common.Enums.count_where([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end)\n 2\n\n iex> Bonfire.Common.Enums.count_where([:ok, :error, :ok], &(&1 == :ok))\n 2","ref":"Bonfire.Common.Enums.html#count_where/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.deep_merge/3","doc":"Recursively merges two data structures (`left` and `right`), which can be structs, maps or lists.\nIf `left` and `right` are `Ecto.Changeset`s, `merge_changesets/2` is called on them.\nIf `left` is a struct, a similar struct is returned with the merged values.\nIf `left` and `right` are lists, they are concatenated unless `:replace_lists` option is set to `true`.","ref":"Bonfire.Common.Enums.html#deep_merge/3"},{"type":"function","title":"Bonfire.Common.Enums.deep_merge_reduce/2","doc":"Deep merges a list of maps into a single map.","ref":"Bonfire.Common.Enums.html#deep_merge_reduce/2"},{"type":"function","title":"Bonfire.Common.Enums.enum_get/3","doc":"Attempt getting a value out of a map by atom key, or try with string key, or return a fallback","ref":"Bonfire.Common.Enums.html#enum_get/3"},{"type":"function","title":"Bonfire.Common.Enums.filter_empty/2","doc":"Takes a value and a fallback value. If the value is empty (e.g. an empty map, a non-loaded association, an empty list, an empty string, or nil), the fallback value is returned.","ref":"Bonfire.Common.Enums.html#filter_empty/2"},{"type":"function","title":"Bonfire.Common.Enums.filter_empty/3","doc":"","ref":"Bonfire.Common.Enums.html#filter_empty/3"},{"type":"function","title":"Bonfire.Common.Enums.first!/1","doc":"","ref":"Bonfire.Common.Enums.html#first!/1"},{"type":"function","title":"Bonfire.Common.Enums.flatter/1","doc":"Takes a list and recursively flattens it by recursively flattening the head and tail of the list","ref":"Bonfire.Common.Enums.html#flatter/1"},{"type":"function","title":"Bonfire.Common.Enums.fun/3","doc":"Applies a function from one of Elixir's `Map`, `Keyword`, or `List` modules depending on the type of the given enumerable.","ref":"Bonfire.Common.Enums.html#fun/3"},{"type":"function","title":"Examples - Bonfire.Common.Enums.fun/3","doc":"> Bonfire.Common.Enums.fun(%{a: 1, b: 2}, :values)\n [2, 1]\n\n iex> Bonfire.Common.Enums.fun([a: 1, b: 2], :values)\n [1, 2]\n \n iex> Bonfire.Common.Enums.fun([1, 2, 3], :first)\n 1","ref":"Bonfire.Common.Enums.html#fun/3-examples"},{"type":"function","title":"Bonfire.Common.Enums.get_in_access_keys/3","doc":"","ref":"Bonfire.Common.Enums.html#get_in_access_keys/3"},{"type":"function","title":"Bonfire.Common.Enums.get_in_access_keys!/3","doc":"","ref":"Bonfire.Common.Enums.html#get_in_access_keys!/3"},{"type":"function","title":"Bonfire.Common.Enums.group/2","doc":"Like `Enum.group_by/3`, except children are required to be unique (will throw otherwise!) and the resulting map does not wrap each item in a list.","ref":"Bonfire.Common.Enums.html#group/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.group/2","doc":"iex> Bonfire.Common.Enums.group([1, 2, 3], fn x -> x end)\n %{1 => 1, 2 => 2, 3 => 3}\n\n > Bonfire.Common.Enums.group([:a, :b, :b, :c], fn x -> x end)\n ** (throw) \"Expected a unique value\"","ref":"Bonfire.Common.Enums.html#group/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.group_map/2","doc":"Groups an enumerable by a function that returns key-value pairs, ensuring that keys are unique.","ref":"Bonfire.Common.Enums.html#group_map/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.group_map/2","doc":"iex> Bonfire.Common.Enums.group_map([:a, :b, :c], fn x -> {x, to_string(x)} end)\n %{a: \"a\", b: \"b\", c: \"c\"}\n\n > Bonfire.Common.Enums.group_map([1, 2, 2, 3], fn x -> {x, x * 2} end)\n ** (throw) \"Expected a unique value\"","ref":"Bonfire.Common.Enums.html#group_map/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_duplicates?/2","doc":"Checks if the given list contains any duplicates. Takes an optional function that can be used to extract and/or compute the value to compare for each element in the list.","ref":"Bonfire.Common.Enums.html#has_duplicates?/2"},{"type":"function","title":"Bonfire.Common.Enums.has_error?/1","doc":"Checks if there are any `:error` tuples in the enumerable.","ref":"Bonfire.Common.Enums.html#has_error?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_error?/1","doc":"iex> Bonfire.Common.Enums.has_error?([{:ok, 1}, {:error, \"failed\"}])\n true\n\n iex> Bonfire.Common.Enums.has_error?([{:ok, 1}])\n false","ref":"Bonfire.Common.Enums.html#has_error?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_ok?/1","doc":"Checks if there are any `:ok` tuples in the enumerable.","ref":"Bonfire.Common.Enums.html#has_ok?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_ok?/1","doc":"iex> Bonfire.Common.Enums.has_ok?([{:ok, 1}, {:error, \"failed\"}])\n true\n\n iex> Bonfire.Common.Enums.has_ok?([{:error, \"failed\"}])\n false","ref":"Bonfire.Common.Enums.html#has_ok?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_tuple_key?/2","doc":"Checks if there are any tuples with the given key in the enumerable.","ref":"Bonfire.Common.Enums.html#has_tuple_key?/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_tuple_key?/2","doc":"iex> Bonfire.Common.Enums.has_tuple_key?([{:ok, 1}, {:error, \"failed\"}], :ok)\n true\n\n iex> Bonfire.Common.Enums.has_tuple_key?([{:ok, 1}], :error)\n false","ref":"Bonfire.Common.Enums.html#has_tuple_key?/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.id/1","doc":"Extracts a binary ID from various data structures, such as a map containing the key :id or \"id\", a changeset, or a tuple containing the atom :id.","ref":"Bonfire.Common.Enums.html#id/1"},{"type":"function","title":"Bonfire.Common.Enums.ids/1","doc":"Extracts the IDs from a list of maps, changesets, or other data structures and returns a list of these IDs.\n\n iex> ids([%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n [1, 2]\n\n iex> ids(%{id: 3})\n [3]","ref":"Bonfire.Common.Enums.html#ids/1"},{"type":"function","title":"Bonfire.Common.Enums.input_to_atoms/2","doc":"Takes a data structure and converts any keys in maps to (previously defined) atoms, recursively. By default any unknown string keys will be discarded. It can optionally also convert string values to known atoms as well.","ref":"Bonfire.Common.Enums.html#input_to_atoms/2"},{"type":"function","title":"Bonfire.Common.Enums.input_to_value/7","doc":"Converts input to value based on the provided options.","ref":"Bonfire.Common.Enums.html#input_to_value/7"},{"type":"function","title":"Examples - Bonfire.Common.Enums.input_to_value/7","doc":"iex> input_to_value(\"42\", false, true, nil, true, nil, true)\n 42\n\n iex> input_to_value(\"Bonfire.Common\", false, true, nil, true, nil, false)\n Bonfire.Common\n\n iex> input_to_value(\"bonfire_common\", false, true, nil, true, nil, false)\n :bonfire_common\n\n iex> input_to_value(\"unknown_example_string\", false, true, nil, true, nil, false)\n \"unknown_example_string\"","ref":"Bonfire.Common.Enums.html#input_to_value/7-examples"},{"type":"function","title":"Bonfire.Common.Enums.map_filter_empty/1","doc":"Recursively filters nil values from a map","ref":"Bonfire.Common.Enums.html#map_filter_empty/1"},{"type":"function","title":"Bonfire.Common.Enums.map_key_replace/4","doc":"Renames a key in a map. Optionally changes the value as well.","ref":"Bonfire.Common.Enums.html#map_key_replace/4"},{"type":"function","title":"Bonfire.Common.Enums.map_key_replace_existing/4","doc":"Renames a key in a `map`, only if the key exists in the `map`. Optionally changes the value as well.","ref":"Bonfire.Common.Enums.html#map_key_replace_existing/4"},{"type":"function","title":"Bonfire.Common.Enums.map_new/2","doc":"Takes an enumerable object and converts it to a map. If it is not an enumerable, a map is created with the data under a fallback key (`:data` by default).","ref":"Bonfire.Common.Enums.html#map_new/2"},{"type":"function","title":"Bonfire.Common.Enums.map_put_default/3","doc":"Checks a map for a value with provided key. If it already exists, the existing value is retained, but if not set or nil, then it is set to the provided default.","ref":"Bonfire.Common.Enums.html#map_put_default/3"},{"type":"function","title":"Bonfire.Common.Enums.map_put_in/3","doc":"Updates a nested map using a list of keys and a value to set. It returns a new map with the updated value at the specified location.","ref":"Bonfire.Common.Enums.html#map_put_in/3"},{"type":"function","title":"Examples - Bonfire.Common.Enums.map_put_in/3","doc":"iex> map_put_in(%{}, [:a, :b, :c], 3)\n %{a: %{b: %{c: 3}}}","ref":"Bonfire.Common.Enums.html#map_put_in/3-examples"},{"type":"function","title":"Parameters - Bonfire.Common.Enums.map_put_in/3","doc":"* `root` - The initial map (can be an empty map or a populated one).\n * `keys` - A list of keys specifying the path to the value.\n * `value` - The value to set at the specified location.","ref":"Bonfire.Common.Enums.html#map_put_in/3-parameters"},{"type":"function","title":"Bonfire.Common.Enums.maybe_append/2","doc":"Appends a value to a list, but only if the value is not nil or an empty list.","ref":"Bonfire.Common.Enums.html#maybe_append/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_elem/3","doc":"Takes any element, an index and a fallback value. If the element is a Tuple it returns either the tuple value at that index, otherwise it returns the fallback. If the tuple doesn't contain such an index, it raises `ArgumentError`.","ref":"Bonfire.Common.Enums.html#maybe_elem/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_flatten/1","doc":"Flattens the list if provided a list, otherwise just return the input","ref":"Bonfire.Common.Enums.html#maybe_flatten/1"},{"type":"function","title":"Bonfire.Common.Enums.maybe_get/3","doc":"Attempts to retrieve a value from a map by its key, and otherwise returns the provided fallback value.","ref":"Bonfire.Common.Enums.html#maybe_get/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_list/2","doc":"","ref":"Bonfire.Common.Enums.html#maybe_list/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_merge_to_struct/2","doc":"","ref":"Bonfire.Common.Enums.html#maybe_merge_to_struct/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_put/3","doc":"Updates a `map` with the given `key` and `value`, but only if the `value` is not `nil`, an empty list or an empty string.","ref":"Bonfire.Common.Enums.html#maybe_put/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_keyword_list/3","doc":"Returns a keyword list representation of the input object. If the second argument is `true`, the function will recursively convert nested data structures to keyword lists as well.\nNote: make sure that all keys are atoms, i.e. using `input_to_atoms` first, otherwise the enumerable(s) containing a string key won't be converted.","ref":"Bonfire.Common.Enums.html#maybe_to_keyword_list/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_map/2","doc":"Returns a map representation of the input object. If the second argument is `true`, the function will recursively convert nested data structures to maps as well.","ref":"Bonfire.Common.Enums.html#maybe_to_map/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_struct/2","doc":"Takes a data structure and tries to convert it to a struct, using some hints in the data (eg. `__type` or `index_type` fields) or a manually-provided type.","ref":"Bonfire.Common.Enums.html#maybe_to_struct/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_structs/2","doc":"Takes a data structure and recursively converts any known keys to atoms and then tries to recursively convert any maps to structs, using some hints in the data (eg. `__type` or `index_type` fields).","ref":"Bonfire.Common.Enums.html#maybe_to_structs/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_as_map/3","doc":"Merges two maps or lists into a single map","ref":"Bonfire.Common.Enums.html#merge_as_map/3"},{"type":"function","title":"Bonfire.Common.Enums.merge_changesets/2","doc":"Merges two `Ecto` changesets. If both changesets have a prepare field, the function concatenates the values of the prepare fields. Either way it also calls `Ecto.Changeset.merge/2` operation.","ref":"Bonfire.Common.Enums.html#merge_changesets/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_keeping_only_first_keys/2","doc":"Merges two maps while keeping only the keys that exist in the first map.","ref":"Bonfire.Common.Enums.html#merge_keeping_only_first_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_structs_as_map/2","doc":"","ref":"Bonfire.Common.Enums.html#merge_structs_as_map/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_uniq/2","doc":"","ref":"Bonfire.Common.Enums.html#merge_uniq/2"},{"type":"function","title":"Bonfire.Common.Enums.naughty_to_atoms!/2","doc":"","ref":"Bonfire.Common.Enums.html#naughty_to_atoms!/2"},{"type":"function","title":"Bonfire.Common.Enums.nested_structs_to_maps/1","doc":"Recursively converts all nested structs to maps.","ref":"Bonfire.Common.Enums.html#nested_structs_to_maps/1"},{"type":"function","title":"Bonfire.Common.Enums.put_new_in/3","doc":"This function is used to insert a new value into a nested map data structure, where the path to the location of the value is specified as a list of keys.\n\nWhen the path is a single-element list, if the key already exists in the map, it returns the original map; otherwise, it inserts the key-value pair.\n\nWhen the path is a list of more than one key, the first element of the list (key) represents the key for the current level of the nested map, and the remaining elements (path) represent the keys for the nested map at the next level. The function starts by retrieving the value at the current level of the map (if it exists) and updates the map with the new value.","ref":"Bonfire.Common.Enums.html#put_new_in/3"},{"type":"function","title":"Bonfire.Common.Enums.stringify_keys/2","doc":"Takes a map or keyword list, and returns a map with any atom keys converted to string keys. It can optionally do so recursively.","ref":"Bonfire.Common.Enums.html#stringify_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.struct_from_map/2","doc":"Converts a map to a struct (based on MIT licensed function by Kum Sackey)","ref":"Bonfire.Common.Enums.html#struct_from_map/2"},{"type":"function","title":"Bonfire.Common.Enums.struct_to_map/2","doc":"If given a struct, returns a map representation of it","ref":"Bonfire.Common.Enums.html#struct_to_map/2"},{"type":"function","title":"Bonfire.Common.Enums.uniq_by_id/1","doc":"Takes a list of maps that have an id field and returns a list with only the unique maps. Uniqueness is determined based on the id field and not the full contents of the maps.","ref":"Bonfire.Common.Enums.html#uniq_by_id/1"},{"type":"function","title":"Bonfire.Common.Enums.unwrap_tuples/2","doc":"Unwraps tuples from a list of responses based on the specified key.","ref":"Bonfire.Common.Enums.html#unwrap_tuples/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.unwrap_tuples/2","doc":"iex> Bonfire.Common.Enums.unwrap_tuples([{:ok, 1}, {:error, \"failed\"}, {:ok, 2}], :ok)\n [1, 2]\n\n iex> Bonfire.Common.Enums.unwrap_tuples([{:ok, 1}, {:error, \"failed\"}], :error)\n [\"failed\"]","ref":"Bonfire.Common.Enums.html#unwrap_tuples/2-examples"},{"type":"module","title":"Bonfire.Common.Errors","doc":"Helpers for handling error messages and exceptions","ref":"Bonfire.Common.Errors.html"},{"type":"function","title":"Bonfire.Common.Errors.debug_banner_with_trace/4","doc":"","ref":"Bonfire.Common.Errors.html#debug_banner_with_trace/4"},{"type":"function","title":"Bonfire.Common.Errors.debug_exception/5","doc":"Logs a debug message with exception and stacktrace information.","ref":"Bonfire.Common.Errors.html#debug_exception/5"},{"type":"function","title":"Examples - Bonfire.Common.Errors.debug_exception/5","doc":"iex> debug_exception(\"An error occurred\", %RuntimeError{message: \"error\"}, nil, :error, [])\n # Output: An error occurred: %RuntimeError{message: \"error\"}\n {:error, \"An error occurred\"}","ref":"Bonfire.Common.Errors.html#debug_exception/5-examples"},{"type":"function","title":"Bonfire.Common.Errors.debug_log/5","doc":"Logs a debug message with optional exception and stacktrace information.","ref":"Bonfire.Common.Errors.html#debug_log/5"},{"type":"function","title":"Examples - Bonfire.Common.Errors.debug_log/5","doc":"> debug_log(\"A debug message\", %RuntimeError{message: \"error\"}, nil, :error)\n # Output: A debug message: %RuntimeError{message: \"error\"}\n\n > debug_log(\"A debug message\", nil, nil, :info)\n # Output: A debug message: nil","ref":"Bonfire.Common.Errors.html#debug_log/5-examples"},{"type":"function","title":"Bonfire.Common.Errors.error_msg/1","doc":"Turns various kinds of errors into an error message string. Used to format errors in a way that can be easily read by the user.","ref":"Bonfire.Common.Errors.html#error_msg/1"},{"type":"function","title":"Examples - Bonfire.Common.Errors.error_msg/1","doc":"iex> error_msg([{:error, \"something went wrong\"}])\n [\"something went wrong\"]\n\n iex> error_msg(%{message: \"custom error\"})\n \"custom error\"\n\n iex> error_msg(:some_other_error)\n \":some_other_error\"","ref":"Bonfire.Common.Errors.html#error_msg/1-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_banner/4","doc":"Normalizes and formats any throw/error/exit. The message is formatted and displayed in the same format as used by Elixir's CLI.\n\nThe third argument is the stacktrace which is used to enrich a normalized error with more information. It is only used when the kind is an error.","ref":"Bonfire.Common.Errors.html#format_banner/4"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_banner/4","doc":"iex> format_banner(:error, %RuntimeError{message: \"error\"})\n \"** Elixir.RuntimeError: error\"\n\n iex> format_banner(:throw, :some_reason)\n \"** (throw) :some_reason\"\n\n iex> format_banner(:exit, :some_reason)\n \"** (exit) :some_reason\"\n\n > format_banner({:EXIT, self()}, :some_reason)\n \"** (EXIT from #PID<0.780.0>) :some_reason\"","ref":"Bonfire.Common.Errors.html#format_banner/4-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_location/1","doc":"","ref":"Bonfire.Common.Errors.html#format_location/1"},{"type":"function","title":"Bonfire.Common.Errors.format_mfa/3","doc":"Receives a module, function, and arity and formats it as shown in stacktraces. The arity may also be a list of arguments.\n\nAnonymous functions are reported as -func/arity-anonfn-count-, where func is the name of the enclosing function. Convert to \"anonymous fn in func/arity\"","ref":"Bonfire.Common.Errors.html#format_mfa/3"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_mfa/3","doc":"iex> format_mfa(Foo, :bar, 1)\n {\"Foo\", \"bar\", \"Foo.bar/1\"}\n\n iex> format_mfa(Foo, :bar, [])\n {\"Foo\", \"bar\", \"Foo.bar()\"}\n\n iex> Exception.format_mfa(nil, :bar, [])\n \"nil.bar()\"","ref":"Bonfire.Common.Errors.html#format_mfa/3-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace/2","doc":"Formats the stacktrace. A stacktrace must be given as an argument. If not, the stacktrace is retrieved from `Process.info/2`.","ref":"Bonfire.Common.Errors.html#format_stacktrace/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_stacktrace/2","doc":"> format_stacktrace([{MyModule, :my_fun, 1, [file: 'my_file.ex', line: 42]}], [])\n \"my_file.ex:42: MyModule.my_fun/1\"\n\n > format_stacktrace(nil, [])\n \"stacktrace here...\"","ref":"Bonfire.Common.Errors.html#format_stacktrace/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace_entry/2","doc":"Receives a stacktrace entry and formats it into a string.","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_stacktrace_entry/2","doc":"iex> format_stacktrace_entry({MyModule, :my_fun, 1, [file: 'my_file.ex', line: 42]}, [])\n \"my_file.ex:42: MyModule.my_fun/1\"\n\n > format_stacktrace_entry({fn -> :ok end, 0, [file: 'another_file.ex', line: 7]}, [])\n \"another_file.ex:7: some_fun/2\"","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace_entry_sliced/2","doc":"","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry_sliced/2"},{"type":"function","title":"Bonfire.Common.Errors.last_stacktrace/0","doc":"","ref":"Bonfire.Common.Errors.html#last_stacktrace/0"},{"type":"function","title":"Bonfire.Common.Errors.map_error/2","doc":"Maps an error tuple to a new value using the provided function.","ref":"Bonfire.Common.Errors.html#map_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.map_error/2","doc":"iex> map_error({:error, :some_error}, &(&1 |> to_string()))\n \"some_error\"\n\n iex> map_error(42, &(&1 * 2))\n 42","ref":"Bonfire.Common.Errors.html#map_error/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.maybe_ok_error/2","doc":"Applies `change_fn` if the first parameter is an `{:ok, val}` tuple, else returns the value.","ref":"Bonfire.Common.Errors.html#maybe_ok_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.maybe_ok_error/2","doc":"iex> maybe_ok_error({:ok, 42}, &(&1 * 2))\n {:ok, 84}\n\n iex> maybe_ok_error({:error, :some_error}, &(&1 * 2))\n {:error, :some_error}\n\n iex> maybe_ok_error(42, &(&1 * 2))\n 42","ref":"Bonfire.Common.Errors.html#maybe_ok_error/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.mf_maybe_link_to_code/4","doc":"","ref":"Bonfire.Common.Errors.html#mf_maybe_link_to_code/4"},{"type":"function","title":"Bonfire.Common.Errors.module_maybe_link_to_code/3","doc":"","ref":"Bonfire.Common.Errors.html#module_maybe_link_to_code/3"},{"type":"function","title":"Bonfire.Common.Errors.replace_error/2","doc":"Replaces the error value in an error tuple with a new value.","ref":"Bonfire.Common.Errors.html#replace_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.replace_error/2","doc":"iex> replace_error({:error, :old_value}, :new_value)\n {:error, :new_value}\n\n iex> replace_error(42, :new_value)\n 42","ref":"Bonfire.Common.Errors.html#replace_error/2-examples"},{"type":"module","title":"Bonfire.Common.Extend","doc":"Helpers for using and managing the extensibility of Bonfire, such as checking if a module or extension is enabled or hot-swapped, or loading code or docs. See also `Bonfire.Common.Extensions`.","ref":"Bonfire.Common.Extend.html"},{"type":"function","title":"Bonfire.Common.Extend.application_for_module/1","doc":"Retrieves the OTP application associated with a given module.","ref":"Bonfire.Common.Extend.html#application_for_module/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.application_for_module/1","doc":"iex> application_for_module(Bonfire.Common)\n :bonfire_common\n\n iex> application_for_module(SomeUnknownModule)\n nil","ref":"Bonfire.Common.Extend.html#application_for_module/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.beam_file_from_object_code/1","doc":"Retrieves the beam file path from the object code of a module.","ref":"Bonfire.Common.Extend.html#beam_file_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.beam_file_from_object_code/1","doc":"> beam_file_from_object_code(Bonfire.Common)\n \"/path/ebin/Elixir.Bonfire.Common.beam\"","ref":"Bonfire.Common.Extend.html#beam_file_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.disabled_value?/1","doc":"Checks if a value indicates that a module or extension is disabled.","ref":"Bonfire.Common.Extend.html#disabled_value?/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.disabled_value?/1","doc":"iex> disabled_value?(:disabled)\n true\n\n iex> disabled_value?(false)\n false\n\n iex> disabled_value?(disabled: true)\n true","ref":"Bonfire.Common.Extend.html#disabled_value?/1-examples"},{"type":"macro","title":"Bonfire.Common.Extend.extend_module/1","doc":"Extend a module by defining `defdelegate` and `defoverridable` for all functions from the source module in the current module.","ref":"Bonfire.Common.Extend.html#extend_module/1"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.extend_module/1","doc":"> import Bonfire.Common.Extend\n > extend_module Common.Text","ref":"Bonfire.Common.Extend.html#extend_module/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.extension_enabled?/2","doc":"Checks if an Elixir module or extension/OTP app is present and not disabled.\n\nFor modules, checks also that the extension/OTP app it belongs is not disabled.","ref":"Bonfire.Common.Extend.html#extension_enabled?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.extension_enabled?/2","doc":"iex> extension_enabled?(Bonfire.Common)\n true\n\n iex> extension_enabled?(:bonfire_common)\n true\n\n iex> extension_enabled?(SomeOtherModule)\n false\n\n iex> extension_enabled?(:non_existent_extension)\n false","ref":"Bonfire.Common.Extend.html#extension_enabled?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.extension_loaded?/1","doc":"Whether an Elixir module or extension / OTP app is present","ref":"Bonfire.Common.Extend.html#extension_loaded?/1"},{"type":"function","title":"Bonfire.Common.Extend.fetch_docs_as_markdown/1","doc":"Fetches the `@moduledoc` of a module as a markdown string.","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.fetch_docs_as_markdown/1","doc":"> fetch_docs_as_markdown(SomeModule)\n \"This is the moduledoc for SomeModule\"","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.fetch_docs_as_markdown/2","doc":"Fetches `module`.`function`'s @doc as a markdown string","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/2"},{"type":"function","title":"Bonfire.Common.Extend.file_code/1","doc":"Retrieves the content of a code file.","ref":"Bonfire.Common.Extend.html#file_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.file_code/1","doc":"> file_code(\"mix.ex\")\n \"defmodule ... end\"","ref":"Bonfire.Common.Extend.html#file_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_ast/3","doc":"Retrieves the AST of a specific function from a module.","ref":"Bonfire.Common.Extend.html#function_ast/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_ast/3","doc":"> function_ast(Bonfire.Common, :some_function)\n [{:def, [...], [...]}, ...]","ref":"Bonfire.Common.Extend.html#function_ast/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_code/3","doc":"Retrieves the code of a specific function from a module.","ref":"Bonfire.Common.Extend.html#function_code/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_code/3","doc":"> function_code(Bonfire.Common, :some_function)\n \"def some_function do ... end\"","ref":"Bonfire.Common.Extend.html#function_code/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_line_number/3","doc":"Returns the line number of the first line where a function is defined in a module.","ref":"Bonfire.Common.Extend.html#function_line_number/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_line_number/3","doc":"> function_line_number(Bonfire.Common, :some_function)\n 10","ref":"Bonfire.Common.Extend.html#function_line_number/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_line_numbers/3","doc":"Return the numbers (as a tuple) of the first and last lines of a function's definition in a module","ref":"Bonfire.Common.Extend.html#function_line_numbers/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_line_numbers/3","doc":"> function_line_numbers(Bonfire.Common, :some_function)\n {10, 20}","ref":"Bonfire.Common.Extend.html#function_line_numbers/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.generate_reverse_router!/0","doc":"Generates an updated reverse router based on enabled/disabled extensions.","ref":"Bonfire.Common.Extend.html#generate_reverse_router!/0"},{"type":"function","title":"Examples - Bonfire.Common.Extend.generate_reverse_router!/0","doc":"iex> generate_reverse_router!()\n :ok","ref":"Bonfire.Common.Extend.html#generate_reverse_router!/0-examples"},{"type":"function","title":"Bonfire.Common.Extend.has_extension_config?/1","doc":"Checks whether an Elixir module or extension / OTP app has any configuration available.","ref":"Bonfire.Common.Extend.html#has_extension_config?/1"},{"type":"macro","title":"Bonfire.Common.Extend.import_if_enabled/2","doc":"Conditionally imports a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#import_if_enabled/2"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.import_if_enabled/2","doc":"defmodule MyModule do\n import_if_enabled SomeExtension\n # or\n import_if_enabled SomeExtension, FallbackModule\n end","ref":"Bonfire.Common.Extend.html#import_if_enabled/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.inject_function/3","doc":"Copies the code defining a function from its original module to a target module.\n\nThe target module can be specified, otherwise, the function will be injected into a default extension module.","ref":"Bonfire.Common.Extend.html#inject_function/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.inject_function/3","doc":"iex> inject_function(Common.TextExtended, :blank?)","ref":"Bonfire.Common.Extend.html#inject_function/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.loaded_applications_map/1","doc":"Returns a map of loaded applications with their versions and descriptions.","ref":"Bonfire.Common.Extend.html#loaded_applications_map/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.loaded_applications_map/1","doc":"iex> %{bonfire_common: {_version, _description} } = loaded_applications_map()","ref":"Bonfire.Common.Extend.html#loaded_applications_map/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.loaded_applications_names/1","doc":"Returns a map of loaded applications names as keys.","ref":"Bonfire.Common.Extend.html#loaded_applications_names/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.loaded_applications_names/1","doc":"iex> %{bonfire_common: true} = loaded_applications_names()","ref":"Bonfire.Common.Extend.html#loaded_applications_names/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.macro_inspect/1","doc":"Inspects a macro by expanding it and converting it to a string.","ref":"Bonfire.Common.Extend.html#macro_inspect/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.macro_inspect/1","doc":"iex> macro_inspect(fn -> quote do: 1 + 1 end)\n \"1 + 1\"","ref":"Bonfire.Common.Extend.html#macro_inspect/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_extension_loaded/1","doc":"Returns the OTP app name for a module or extension.","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_extension_loaded/1","doc":"iex> maybe_extension_loaded(Bonfire.Common)\n :bonfire_common\n\n iex> maybe_extension_loaded(:bonfire_common)\n :bonfire_common\n\n iex> maybe_extension_loaded(:non_existent_app)\n :non_existent_app","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_extension_loaded!/1","doc":"Returns the OTP app name for a module or extension if available, and nil otherwise.","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded!/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_extension_loaded!/1","doc":"iex> maybe_extension_loaded!(Bonfire.Common)\n :bonfire_common\n\n iex> maybe_extension_loaded!(:non_existent_app)\n nil","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded!/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module/2","doc":"Given an Elixir module, returns the module if available and not disabled, or its replacement if configured.\n\nChecks both that module and the extension / OTP app it belongs to are available *and* not disabled (eg. by configuring something like `config :bonfire_common, Bonfire.Common.Text, modularity: :disabled`)\n\nImportant note: you should make sure to use the returned module after calling this function, as it can be different from the one you intended to call, as this allows for swapping out modules in config or user settings (eg. by configuring something like `config :bonfire_common, Bonfire.Common.Text, modularity: MyCustomExtension.Text`)","ref":"Bonfire.Common.Extend.html#maybe_module/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module/2","doc":"iex> maybe_module(Bonfire.Common)\n Bonfire.Common\n\n iex> Config.put(DisabledModule, modularity: :disabled)\n iex> maybe_module(DisabledModule)\n nil\n\n iex> Config.put([Bonfire.Common.Text], modularity: Bonfire.Common.TextExtended)\n iex> maybe_module(Bonfire.Common.Text)\n Bonfire.Common.TextExtended\n iex> Config.put([Bonfire.Common.Text], modularity: Bonfire.Common.Text)\n iex> maybe_module(Bonfire.Common.Text)\n Bonfire.Common.Text","ref":"Bonfire.Common.Extend.html#maybe_module/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module!/2","doc":"Returns the module if it is present and not disabled; raises an error if the module is disabled and no replacement is configured.","ref":"Bonfire.Common.Extend.html#maybe_module!/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module!/2","doc":"iex> maybe_module!(Bonfire.Common)\n Bonfire.Common\n\n iex> maybe_module!(SomeDisabledModule)\n ** (RuntimeError) Module Elixir.SomeDisabledModule is disabled and no replacement was configured","ref":"Bonfire.Common.Extend.html#maybe_module!/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module_loaded/1","doc":"Checks if a module exists and returns it, otherwise returns nil.","ref":"Bonfire.Common.Extend.html#maybe_module_loaded/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module_loaded/1","doc":"iex> maybe_module_loaded(Bonfire.Common)\n Bonfire.Common\n\n iex> maybe_module_loaded(NonExistentModule)\n nil","ref":"Bonfire.Common.Extend.html#maybe_module_loaded/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_schema_or_pointer/1","doc":"Returns the given schema module if it exists, otherwise returns `Needle.Pointer`.","ref":"Bonfire.Common.Extend.html#maybe_schema_or_pointer/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_schema_or_pointer/1","doc":"> maybe_schema_or_pointer(SomeSchema)\n SomeSchema\n\n iex> maybe_schema_or_pointer(NonExistentSchema)\n Needle.Pointer","ref":"Bonfire.Common.Extend.html#maybe_schema_or_pointer/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_ast_normalize/3","doc":"Normalizes the AST of a module for use.","ref":"Bonfire.Common.Extend.html#module_ast_normalize/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_ast_normalize/3","doc":"> module_ast_normalize(Bonfire.Common, ast)","ref":"Bonfire.Common.Extend.html#module_ast_normalize/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_beam_code/2","doc":"Re-creates a module's code from compiled Beam artifacts.","ref":"Bonfire.Common.Extend.html#module_beam_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_beam_code/2","doc":"iex> {:ok, _} = module_beam_code(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_beam_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_behaviour?/2","doc":"Checks if a module implements a specific behaviour.","ref":"Bonfire.Common.Extend.html#module_behaviour?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_behaviour?/2","doc":"> module_behaviour?(MyModule, SomeBehaviour)\n true","ref":"Bonfire.Common.Extend.html#module_behaviour?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_behaviours/1","doc":"Returns a list of behaviours implemented by a module.","ref":"Bonfire.Common.Extend.html#module_behaviours/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_behaviours/1","doc":"> module_behaviours(MyModule)\n [SomeBehaviour, AnotherBehaviour]","ref":"Bonfire.Common.Extend.html#module_behaviours/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code/2","doc":"Retrieves the code of a module from the source.","ref":"Bonfire.Common.Extend.html#module_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code/2","doc":"> module_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code_from_ast/3","doc":"Retrieves the code of a module from its AST (Abstract Syntax Tree).","ref":"Bonfire.Common.Extend.html#module_code_from_ast/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code_from_ast/3","doc":"> module_code_from_ast(Bonfire.Common, ast)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code_from_ast/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code_from_object_code/1","doc":"Retrieves the code of a module from its object code.","ref":"Bonfire.Common.Extend.html#module_code_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code_from_object_code/1","doc":"> module_code_from_object_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_enabled?/2","doc":"Checks if an Elixir module or the extension/OTP app it belongs to is present and not disabled.","ref":"Bonfire.Common.Extend.html#module_enabled?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_enabled?/2","doc":"iex> module_enabled?(Bonfire.Common)\n true\n\n iex> module_enabled?(SomeDisabledModule)\n false","ref":"Bonfire.Common.Extend.html#module_enabled?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_exists?/1","doc":"Checks if an Elixir module exists and can be loaded.","ref":"Bonfire.Common.Extend.html#module_exists?/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_exists?/1","doc":"iex> module_exists?(Bonfire.Common)\n true\n\n iex> module_exists?(SomeOtherModule)\n false","ref":"Bonfire.Common.Extend.html#module_exists?/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file/1","doc":"Retrieves the file path of the module's source file.","ref":"Bonfire.Common.Extend.html#module_file/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file/1","doc":"> module_file(Bonfire.Common)\n \"/path/lib/common.ex\"","ref":"Bonfire.Common.Extend.html#module_file/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file_code/2","doc":"Retrieves the source code of a module.","ref":"Bonfire.Common.Extend.html#module_file_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file_code/2","doc":"> module_file_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_file_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file_from_object_code/1","doc":"Retrieves the file path of a module from its object code.","ref":"Bonfire.Common.Extend.html#module_file_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file_from_object_code/1","doc":"> module_file_from_object_code(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_file_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_object_byte_code/1","doc":"Retrieves the bytecode of a module's object code.","ref":"Bonfire.Common.Extend.html#module_object_byte_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_object_byte_code/1","doc":"> module_object_byte_code(Bonfire.Common)\n <<...>>","ref":"Bonfire.Common.Extend.html#module_object_byte_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_object_code_tuple/1","doc":"Retrieves the object code tuple for a module.","ref":"Bonfire.Common.Extend.html#module_object_code_tuple/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_object_code_tuple/1","doc":"iex> {Bonfire.Common, _bytecode, _path} = module_object_code_tuple(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_object_code_tuple/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.quoted_import_if_enabled/3","doc":"","ref":"Bonfire.Common.Extend.html#quoted_import_if_enabled/3"},{"type":"function","title":"Bonfire.Common.Extend.quoted_require_if_enabled/3","doc":"","ref":"Bonfire.Common.Extend.html#quoted_require_if_enabled/3"},{"type":"function","title":"Bonfire.Common.Extend.quoted_use_if_enabled/3","doc":"","ref":"Bonfire.Common.Extend.html#quoted_use_if_enabled/3"},{"type":"macro","title":"Bonfire.Common.Extend.require_if_enabled/2","doc":"Conditionally requires a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#require_if_enabled/2"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.require_if_enabled/2","doc":"defmodule MyModule do\n require_if_enabled SomeExtension\n # or\n require_if_enabled SomeExtension, FallbackModule\n end","ref":"Bonfire.Common.Extend.html#require_if_enabled/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.return_file/1","doc":"Returns a string given raw code data.","ref":"Bonfire.Common.Extend.html#return_file/1"},{"type":"function","title":"Bonfire.Common.Extend.tar_file_code/1","doc":"Retrieves the content of a code file within the source code tar file (available in Bonfire prod releases).","ref":"Bonfire.Common.Extend.html#tar_file_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.tar_file_code/1","doc":"> tar_file_code(\"/mix.exs\")\n \"defmodule ... end\"","ref":"Bonfire.Common.Extend.html#tar_file_code/1-examples"},{"type":"macro","title":"Bonfire.Common.Extend.use_if_enabled/2","doc":"Conditionally uses a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#use_if_enabled/2"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.use_if_enabled/2","doc":"defmodule MyModule do\n use_if_enabled SomeExtension\n # or\n use_if_enabled SomeExtension, FallbackModule\n end","ref":"Bonfire.Common.Extend.html#use_if_enabled/2-examples"},{"type":"behaviour","title":"Bonfire.Common.ExtensionBehaviour","doc":"A Global cache of known Behaviours in Bonfire\n\nUse of the ExtensionBehaviour Service requires declaring `@behaviour Bonfire.Common.ExtensionBehaviour` in your behaviour module. This module will then index those behaviours *and* all the modules that implement those behaviours at app startup.\n\nWhile this module is a GenServer, it is only responsible for setup\nof the cache and then exits with :ignore having done so. It is not\nrecommended to restart the service as this will lead to a stop the\nworld garbage collection of all processes and the copying of the\nentire cache to each process that has queried it since its last\nlocal garbage collection.","ref":"Bonfire.Common.ExtensionBehaviour.html"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.adopters_of_behaviour/2","doc":"Given a behaviour module, filters app modules to only those that implement that behaviour","ref":"Bonfire.Common.ExtensionBehaviour.html#adopters_of_behaviour/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.app_modules_to_scan/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#app_modules_to_scan/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apply_modules/2","doc":"Note: use `apply_modules_cached/2` instead, as it caches the result.","ref":"Bonfire.Common.ExtensionBehaviour.html#apply_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apply_modules_cached/2","doc":"Runs/applies a given function name on each of a list of given modules, returning a map (listing the modules with their result as value) and vice versa (listing the results as key with their calling module as value). It also caches the result on first run.","ref":"Bonfire.Common.ExtensionBehaviour.html#apply_modules_cached/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apps_to_scan/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#apps_to_scan/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviour_app_modules/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviour_app_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviour_modules/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviour_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviours/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviours/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.cached_behaviours/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#cached_behaviours/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.ExtensionBehaviour.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.find_adopters_of_behaviours/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#find_adopters_of_behaviours/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.find_extension_behaviours/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#find_extension_behaviours/1"},{"type":"callback","title":"Bonfire.Common.ExtensionBehaviour.modules/0","doc":"List modules that implement a behaviour","ref":"Bonfire.Common.ExtensionBehaviour.html#c:modules/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.populate/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#populate/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.start_link/1","doc":"Populates the global cache with config_module data via introspection.","ref":"Bonfire.Common.ExtensionBehaviour.html#start_link/1"},{"type":"behaviour","title":"Bonfire.Common.ExtensionModule","doc":"A global cache of known Bonfire extensions and their metadata.","ref":"Bonfire.Common.ExtensionModule.html"},{"type":"function","title":"Bonfire.Common.ExtensionModule.app_modules/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.Common.ExtensionModule.declared_extension/0","doc":"Declares a Bonfire extensions","ref":"Bonfire.Common.ExtensionModule.html#c:declared_extension/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.declared_extension/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#declared_extension/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.declared_extensions/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#declared_extensions/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav_apps/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav_apps/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.extension/1","doc":"Get a extension identified by schema","ref":"Bonfire.Common.ExtensionModule.html#extension/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.extension_function_error/2","doc":"","ref":"Bonfire.Common.ExtensionModule.html#extension_function_error/2"},{"type":"function","title":"Bonfire.Common.ExtensionModule.modules/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#modules/0"},{"type":"module","title":"Bonfire.Common.Extensions","doc":"Helpers for managing Bonfire extensions, e.g., enabling/disabling a module or extension,\nor listing available extensions and their metadata.","ref":"Bonfire.Common.Extensions.html"},{"type":"function","title":"Bonfire.Common.Extensions.all_deps/0","doc":"Retrieves a list of all dependencies.","ref":"Bonfire.Common.Extensions.html#all_deps/0"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.all_deps/0","doc":"> Bonfire.Common.Extensions.all_deps()\n [%Mix.Dep{...}, %Mix.Dep{...}]","ref":"Bonfire.Common.Extensions.html#all_deps/0-examples"},{"type":"function","title":"Bonfire.Common.Extensions.data/0","doc":"","ref":"Bonfire.Common.Extensions.html#data/0"},{"type":"function","title":"Bonfire.Common.Extensions.dep_name/1","doc":"Extracts the dependency name from a `Mix.Dep` struct or similar data.","ref":"Bonfire.Common.Extensions.html#dep_name/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.dep_name/1","doc":"- `dep`: The dependency from which to extract the name.","ref":"Bonfire.Common.Extensions.html#dep_name/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.dep_name/1","doc":"iex> Bonfire.Common.Extensions.dep_name(%Mix.Dep{app: :my_app})\n :my_app\n\n iex> Bonfire.Common.Extensions.dep_name(:my_app)\n :my_app\n\n iex> Bonfire.Common.Extensions.dep_name(\"my_app\")\n \"my_app\"","ref":"Bonfire.Common.Extensions.html#dep_name/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_branch/1","doc":"Retrieves the branch name for a dependency.","ref":"Bonfire.Common.Extensions.html#get_branch/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_branch/1","doc":"- `dep`: The dependency from which to get the branch.","ref":"Bonfire.Common.Extensions.html#get_branch/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_branch/1","doc":"iex> Bonfire.Common.Extensions.get_branch(%{git: nil, branch: \"main\"})\n \"main\"\n\n iex> Bonfire.Common.Extensions.get_branch(%{lock: {:git, nil, nil, [branch: \"feature\"]}})\n \"feature\"","ref":"Bonfire.Common.Extensions.html#get_branch/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_code_link/1","doc":"Constructs a link to the code of a dependency.","ref":"Bonfire.Common.Extensions.html#get_code_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_code_link/1","doc":"- `dep`: The dependency from which to generate the link.","ref":"Bonfire.Common.Extensions.html#get_code_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_code_link/1","doc":"iex> Bonfire.Common.Extensions.get_code_link(%{app: \"my_app\"})\n \"/settings/extensions/code/my_app\"","ref":"Bonfire.Common.Extensions.html#get_code_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_link/1","doc":"Returns a link to the package or repository of a dependency.","ref":"Bonfire.Common.Extensions.html#get_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_link/1","doc":"- `dep`: The dependency from which to generate the link.","ref":"Bonfire.Common.Extensions.html#get_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_link/1","doc":"iex> Bonfire.Common.Extensions.get_link(%{hex: \"example_package\"})\n \"https://hex.pm/packages/example_package\"\n\n iex> Bonfire.Common.Extensions.get_link(%{git: \"https://github.com/user/repo\", branch: \"main\"})\n \"https://github.com/user/repo/tree/main\"","ref":"Bonfire.Common.Extensions.html#get_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_version/1","doc":"Outputs the current version string for a dependency.","ref":"Bonfire.Common.Extensions.html#get_version/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_version/1","doc":"- `dep`: The dependency from which to get the version.","ref":"Bonfire.Common.Extensions.html#get_version/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_version/1","doc":"iex> Bonfire.Common.Extensions.get_version(%{status: {:ok, \"1.0.0\"}})\n \"1.0.0\"\n\n iex> Bonfire.Common.Extensions.get_version(%{requirement: \">= 1.0.0\"})\n \">= 1.0.0\"","ref":"Bonfire.Common.Extensions.html#get_version/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_version_link/1","doc":"Constructs a link to the version of a dependency.","ref":"Bonfire.Common.Extensions.html#get_version_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_version_link/1","doc":"- `dep`: The dependency from which to generate the version link.","ref":"Bonfire.Common.Extensions.html#get_version_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_version_link/1","doc":"iex> Bonfire.Common.Extensions.get_version_link(%{app: \"my_app\", path: \"file.ex\"})\n \"/settings/extensions/diff?app=my_app&local=file.ex\"\n\n iex> Bonfire.Common.Extensions.get_version_link(%{lock: {:git, \"https://github.com/user/repo\", \"abc123\", [branch: \"main\"]}})\n \"https://github.com/user/repo/compare/abc123...main\"","ref":"Bonfire.Common.Extensions.html#get_version_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.global_disable/1","doc":"Disables a given extension globally.","ref":"Bonfire.Common.Extensions.html#global_disable/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.global_disable/1","doc":"- `extension`: The name of the extension to disable.","ref":"Bonfire.Common.Extensions.html#global_disable/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.global_disable/1","doc":"> {:ok, %Bonfire.Data.Identity.Settings{json: %{bonfire: %{my_test_extension: %{modularity: :disabled}}}}} = Bonfire.Common.Extensions.global_disable(:my_test_extension)","ref":"Bonfire.Common.Extensions.html#global_disable/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.global_enable/1","doc":"Enables a given extension globally.","ref":"Bonfire.Common.Extensions.html#global_enable/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.global_enable/1","doc":"- `extension`: The name of the extension to enable.","ref":"Bonfire.Common.Extensions.html#global_enable/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.global_enable/1","doc":"> {:ok, %Bonfire.Data.Identity.Settings{json: %{bonfire: %{my_test_extension: %{modularity: nil}}}}} = Bonfire.Common.Extensions.global_enable(:my_test_extension)","ref":"Bonfire.Common.Extensions.html#global_enable/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.loaded_deps/1","doc":"Retrieves a list of all dependencies in a specific format based on the options provided.","ref":"Bonfire.Common.Extensions.html#loaded_deps/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.loaded_deps/1","doc":"- `opts`: Options to determine the format, e.g., `:flat`, `:tree_flat`, `:nested`.","ref":"Bonfire.Common.Extensions.html#loaded_deps/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.loaded_deps/1","doc":"> Bonfire.Common.Extensions.loaded_deps(:flat)\n [%Mix.Dep{}, %Mix.Dep{}, ...]\n\n > Bonfire.Common.Extensions.loaded_deps(:tree_flat)\n [%Mix.Dep{}, %Mix.Dep{}, ...]","ref":"Bonfire.Common.Extensions.html#loaded_deps/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.loaded_deps_names/1","doc":"Retrieves a list of all dependency names in a specific format based on the options provided.","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.loaded_deps_names/1","doc":"- `opts`: Options to determine the format, e.g., `:flat`, `:tree_flat`, `:nested`.","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.loaded_deps_names/1","doc":"> Bonfire.Common.Extensions.loaded_deps_names()\n [:dep1, :dep2]","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1-examples"},{"type":"module","title":"Bonfire.Common.Extensions.Diff","doc":"Provides functionality to generate and parse diffs from git repositories.","ref":"Bonfire.Common.Extensions.Diff.html"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"Analyzes the diff stream from the specified path.\n\nThis function streams the diff data and processes it as it becomes available. See `GitDiff.stream_patch/1` for details on the expected output.","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"- `path_diff`: The path to the file containing the diff.","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"> {:ok, stream} = Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream(\"./path/to/diff.patch\")","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"Generates a diff between the specified reference or branch and the latest commit in the repository.","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"> Bonfire.Common.Extensions.Diff.generate_diff(\"main\", \"./\")\n {:ok, \"Diff generated successfully\", \"...diff content...\"}\n\n > Bonfire.Common.Extensions.Diff.generate_diff(\"test_fake_branch\", \"./\")\n {:error, \"Could not generate latest diff.\"}","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git!/4","doc":"Executes a git command with the specified arguments.","ref":"Bonfire.Common.Extensions.Diff.html#git!/4"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.git!/4","doc":"- `args`: The list of arguments for the git command.\n - `repo_path`: The path to the repository.\n - `into`: Optional destination for command output (defaults to standard output)\n - `original_cwd`: The original working directory.","ref":"Bonfire.Common.Extensions.Diff.html#git!/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.git!/4","doc":"> Bonfire.Common.Extensions.Diff.git!([\"status\"], \"./\")","ref":"Bonfire.Common.Extensions.Diff.html#git!/4-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_add_all/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_add_all/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_fetch/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_fetch/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"Generates a diff and saves it to the specified output path.","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.\n - `path_output`: The path where the diff output will be saved.\n - `extra_opt`: Optional extra options for git diff command.","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"iex> Bonfire.Common.Extensions.Diff.git_generate_diff(\"main\", \"./\", \"./data/test_output.patch\")","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_pre_configure/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_pre_configure/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"Parses the latest diff from the specified path. See `GitDiff.parse_patch/1` for details about what it outputs.","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"- `path_diff`: The path to the file containing the diff.","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"> Bonfire.Common.Extensions.Diff.parse_repo_latest_diff(\"./path/to/diff.patch\")\n {:ok, ...}\n\n > Bonfire.Common.Extensions.Diff.parse_repo_latest_diff(\"./path/to/empty.patch\")\n {:error, :no_diff}","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"Fetches the latest diff from the specified reference or branch in the repository.","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.\n - `msg`: Optional message to include with the diff.","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"> Bonfire.Common.Extensions.Diff.repo_latest_diff(\"main\", \"./\")\n {:ok, \"Diff message\", \"...diff content...\"}\n\n > Bonfire.Common.Extensions.Diff.repo_latest_diff(\"test_fake_branch\", \"./\")\n {:error, :no_diff}","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.root/0","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#root/0"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.tmp_path/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#tmp_path/1"},{"type":"module","title":"Bonfire.Common.HTTP","doc":"Module for building and performing HTTP requests.","ref":"Bonfire.Common.HTTP.html"},{"type":"function","title":"Bonfire.Common.HTTP.delete/4","doc":"Makes a DELETE request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#delete/4"},{"type":"function","title":"Bonfire.Common.HTTP.get/3","doc":"Makes a GET request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#get/3"},{"type":"function","title":"Bonfire.Common.HTTP.get_cached/1","doc":"","ref":"Bonfire.Common.HTTP.html#get_cached/1"},{"type":"function","title":"Bonfire.Common.HTTP.patch/4","doc":"Makes a PATCH request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#patch/4"},{"type":"function","title":"Bonfire.Common.HTTP.post/4","doc":"Makes a POST request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#post/4"},{"type":"function","title":"Bonfire.Common.HTTP.put/4","doc":"Makes a PUT request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#put/4"},{"type":"function","title":"Bonfire.Common.HTTP.request/5","doc":"Builds and perform http request.\n\n# Arguments:\n`method` - :get, :post, :put, :delete\n`url`\n`body`\n`headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n`options` - custom, per-request middleware or adapter options\n\n# Returns:\n`{:ok, %Tesla.Env{}}` or `{:error, error}`","ref":"Bonfire.Common.HTTP.html#request/5"},{"type":"type","title":"Bonfire.Common.HTTP.t/0","doc":"","ref":"Bonfire.Common.HTTP.html#t:t/0"},{"type":"module","title":"Bonfire.Common.HTTP.Connection","doc":"Specifies connection options for HTTP requests","ref":"Bonfire.Common.HTTP.Connection.html"},{"type":"function","title":"Bonfire.Common.HTTP.Connection.adapter_options/2","doc":"","ref":"Bonfire.Common.HTTP.Connection.html#adapter_options/2"},{"type":"function","title":"Bonfire.Common.HTTP.Connection.new/1","doc":"","ref":"Bonfire.Common.HTTP.Connection.html#new/1"},{"type":"module","title":"Bonfire.Common.HTTP.RequestBuilder","doc":"Helper functions for building HTTP requests","ref":"Bonfire.Common.HTTP.RequestBuilder.html"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.add_param/4","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#add_param/4"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.headers/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#headers/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.method/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#method/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.opts/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#opts/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.url/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#url/2"},{"type":"module","title":"Bonfire.Common.Localise","doc":"Various helpers for localisation","ref":"Bonfire.Common.Localise.html"},{"type":"function","title":"Bonfire.Common.Localise.default_locale/0","doc":"Gets the default locale from the configuration or returns \"en\".","ref":"Bonfire.Common.Localise.html#default_locale/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.default_locale/0","doc":"iex> default_locale()\n \"en\"","ref":"Bonfire.Common.Localise.html#default_locale/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.get_locale/0","doc":"Gets the current locale from the Cldr module.","ref":"Bonfire.Common.Localise.html#get_locale/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.get_locale/0","doc":"iex> get_locale()\n Bonfire.Common.Localise.Cldr.Locale.new!(\"en\")","ref":"Bonfire.Common.Localise.html#get_locale/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.get_locale_id/0","doc":"Gets the current locale ID.","ref":"Bonfire.Common.Localise.html#get_locale_id/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.get_locale_id/0","doc":"iex> get_locale_id()\n :en","ref":"Bonfire.Common.Localise.html#get_locale_id/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.known_locales/0","doc":"Gets the known locales from the Cldr module.","ref":"Bonfire.Common.Localise.html#known_locales/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.known_locales/0","doc":"> known_locales()\n [:en, :es, :fr]","ref":"Bonfire.Common.Localise.html#known_locales/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.locale_name/1","doc":"Converts a locale atom to its string representation.","ref":"Bonfire.Common.Localise.html#locale_name/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.locale_name/1","doc":"iex> locale_name(:en)\n \"English\"\n iex> locale_name(\"fr\")\n \"French\"","ref":"Bonfire.Common.Localise.html#locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.put_locale/1","doc":"Sets the given locale for both Cldr and Gettext.","ref":"Bonfire.Common.Localise.html#put_locale/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.put_locale/1","doc":"iex> put_locale(\"es\")\n nil","ref":"Bonfire.Common.Localise.html#put_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.set_locale_config/0","doc":"Config for the `Cldr.Plug.SetLocale` plug","ref":"Bonfire.Common.Localise.html#set_locale_config/0"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.available_locale_name?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#available_locale_name?/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.default_locale/0","doc":"Returns the default `locale`.","ref":"Bonfire.Common.Localise.Cldr.html#default_locale/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.default_locale/0","doc":"iex> Bonfire.Common.Localise.Cldr.default_locale()\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#default_locale/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.default_territory/0","doc":"Returns the default territory when a locale\ndoes not specify one and none can be inferred.","ref":"Bonfire.Common.Localise.Cldr.html#default_territory/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.default_territory/0","doc":"iex> Bonfire.Common.Localise.Cldr.default_territory()\n :\"001\"","ref":"Bonfire.Common.Localise.Cldr.html#default_territory/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.ellipsis/2","doc":"Add locale-specific ellipsis to a string.","ref":"Bonfire.Common.Localise.Cldr.html#ellipsis/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.ellipsis/2","doc":"iex> Bonfire.Common.Localise.Cldr.ellipsis(\"And furthermore\")\n \"And furthermore…\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis([\"And furthermore\", \"there is much to be done\"], locale: :ja)\n \"And furthermore…there is much to be done\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis(\"And furthermore\", format: :word)\n \"And furthermore …\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis([\"And furthermore\", \"there is much to be done\"], locale: :ja, format: :word)\n \"And furthermore … there is much to be done\"","ref":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#get_locale/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.get_locale/0","doc":"iex> Bonfire.Common.Localise.Cldr.put_locale(\"pl\")\n iex> Bonfire.Common.Localise.Cldr.get_locale()\n %Cldr.LanguageTag{\n backend: Elixir.Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#get_locale/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_calendars/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_calendars/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_currencies/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_currencies/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_gettext_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_gettext_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_gettext_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name(\"en\")\n \"en\"\n\n iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name(\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Gettext.","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?(\"en\")\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?(\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_locale_name(:\"en-AU\")\n :\"en-AU\"\n\n iex> Bonfire.Common.Localise.Cldr.known_locale_name(:\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr.","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:en)\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_number_system_types/0","doc":"Returns a list of atoms representing the number systems types known to `Cldr`.","ref":"Bonfire.Common.Localise.Cldr.html#known_number_system_types/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.known_number_system_types/0","doc":"iex> Bonfire.Common.Localise.Cldr.known_number_system_types()\n [:default, :finance, :native, :traditional]","ref":"Bonfire.Common.Localise.Cldr.html#known_number_system_types/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_number_systems/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_number_systems/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:en)\n :en\n\n iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:en)\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_rbnf_locale_names/0","doc":"Returns a list of locale names which have rules-based number\nformats (RBNF).","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_territories/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_territories/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.normalize_lenient_parse/3","doc":"Normalizes a string by applying transliteration\nof common symbols in numbers, currencies and dates","ref":"Bonfire.Common.Localise.Cldr.html#normalize_lenient_parse/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"Set the current process's Gettext locale from a\n`t:Cldr.LanguageTag`.","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`.","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"* `{:ok, gettext_locale_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-returns"},{"type":"function","title":"Behaviour - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-behaviour"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"iex> import Cldr.LanguageTag.Sigil\n iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l\"en\")\n {:ok, \"en\"}\n\n iex> import Cldr.LanguageTag.Sigil\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.put_locale/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`\n\nSee [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Bonfire.Common.Localise.Cldr.html#put_locale/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.put_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.put_locale(\"en\")\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.quote/2","doc":"Add locale-specific quotation marks around a string.","ref":"Bonfire.Common.Localise.Cldr.html#quote/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.quote/2","doc":"* `string` is any valid Elixir string\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.html#quote/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#quote/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.quote/2","doc":"iex> Bonfire.Common.Localise.Cldr.quote(\"Quoted String\")\n \"“Quoted String”\"\n\n iex> Bonfire.Common.Localise.Cldr.quote(\"Quoted String\", locale: :ja)\n \"「Quoted String」\"","ref":"Bonfire.Common.Localise.Cldr.html#quote/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#unknown_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_calendar/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_calendar/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_currency/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_currency/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"Normalise and validate a locale name.","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"* `{:ok, language_tag}`\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"See [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.validate_locale(:en)\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale Bonfire.Common.Localise.Cldr.default_locale()\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_number_system/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"Normalise and validate a number system type.","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"* `{:ok, normalized_number_system_type}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:default)\n {:ok, :default}\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:traditional)\n {:ok, :traditional}\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:latn)\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type :latn is unknown\"}\n }\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(\"bork\")\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type \\\"bork\\\" is invalid\"}\n }","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_territory/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_territory/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.with_locale/2","doc":"Execute a function with a locale ensuring that the\ncurrent locale is restored after the function.","ref":"Bonfire.Common.Localise.Cldr.html#with_locale/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#with_locale/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#with_locale/2-returns"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"Parse an `Accept-Language` string and return the best match for\na configured `Cldr` locale.","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"* `accept_language` is a string representing an accept language header","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.AcceptLanguage.parse!/1","doc":"iex> Bonfire.Common.Localise.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 Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Calendar","doc":"Data functions to retrieve localised calendar\ninformation.\n\n`Cldr` defines formats for several calendars, the names of which\nare returned by `Cldr.known_calendars/0`.\n\nCurrently this implementation only supports the `:gregorian`,\n`:persian`, `:coptic` and `ethiopic` calendars.\n\nThe `:gregorian` calendar aligns with the proleptic Gregorian calendar\ndefined by Elixir, `Calendar.ISO`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"Return the calendar module for a locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"* `:locale` is any locale or locale name validated\n by `Cldr.validate_locale/2`. The default is\n `Cldr.get_locale()` which returns the locale\n set for the current process","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"* `{:ok, calendar_module}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en-GB\"\n {:ok, Cldr.Calendar.GB}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en-GB-u-ca-gregory\"\n {:ok, Cldr.Calendar.Gregorian}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en\"\n {:ok, Cldr.Calendar.US}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"fa-IR\"\n {:ok, Cldr.Calendar.Persian}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"Returns the calendar module preferred for\na territory.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"* `territory` is any valid ISO3166-2 code as\n an `String.t` or upcased `atom()`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"* `{:ok, calendar_module}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory(:US)\n {:ok, Cldr.Calendar.US}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory :XX\n {:error, {Cldr.UnknownTerritoryError, \"The territory :XX is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-examples"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"The overwhelming majority of territories have\n`:gregorian` as their first preferred calendar\nand therefore `Cldr.Calendar.Gregorian`\nwill be returned for most territories.\n\nReturning any other calendar module would require:\n\n1. That another calendar is preferred over `:gregorian`\n for a territory\n\n2. That a calendar module is available to support\n that calendar.\n\nAs an example, Iran (territory `:IR`) prefers the\n`:persian` calendar. If the optional library\n[ex_cldr_calendars_persian](https://hex.pm/packages/ex_cldr_calendars_persian)\nis installed, the calendar module `Cldr.Calendar.Persian` will\nbe returned. If it is not installed, `Cldr.Calendar.Gregorian`\nwill be returned as `:gregorian` is the second preference\nfor `:IR`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-notes"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.cyclic_years/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#cyclic_years/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.day_periods/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#day_periods/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.days/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#days/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.eras/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#eras/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"Localize a date by converting it to calendar\nintrospected from the provided or default locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `date` is any `t:Date.t/0`.\n\n* `options` is a `t:Keyword.t/0` list of options. The default is\n `[]`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `:locale` is any valid locale name in the list returned by\n `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct\n returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale()`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `{:ok, date}` where `date` is converted into the calendar\n associated with the current or provided locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2022-06-09], locale: \"fr\"\n {:ok, %Date{year: 2022, month: 6, day: 9, calendar: Cldr.Calendar.FR}}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"Returns a localized string for a part of\na `t:Date.t/0`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* `date` is any `t:Date.t/0`.\n\n* `part` is one of `:era`, `:quarter`, `:month`,\n `:day_of_week` or `:days_of_week`.\n\n* `options` is a `t:Keyword.t/0` list of options.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* `:locale` is any valid locale name in the list returned by\n `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct\n returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale()`.\n\n* `:format` is one of `:wide`, `:abbreviated` or `:narrow`. The\n default is `:abbreviated`.\n\n* `:era` will, if set to `:variant` will localize the era using\n the variant data. In the `:en` locale, this will produce `CE` and\n `BCE` rather than the default `AD` and `BC`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* A string representing the localized date part, or\n\n* A list of strings representing the days of the week for\n when `part` is `:days_of_week`. The days are in week order for\n the given date's calendar, or\n\n* `{error, {exception, reason}}` if an error is detected","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :era\n \"AD\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :era, era: :variant\n \"CE\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :day_of_week\n \"Tue\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[0001-01-01], :day_of_week\n \"Mon\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :days_of_week\n [{1, \"Mon\"}, {2, \"Tue\"}, {3, \"Wed\"}, {4, \"Thu\"}, {5, \"Fri\"}, {6, \"Sat\"}, {7, \"Sun\"}]\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :era\n \"AD\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :quarter\n \"Q2\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :month\n \"Jun\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week\n \"Sat\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, format: :wide\n \"Saturday\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, format: :narrow\n \"S\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, locale: \"ar\"\n \"السبت\"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.month_patterns/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#month_patterns/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.months/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#months/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.quarters/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#quarters/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"Returns a keyword list of options than can be applied to\n`NimbleStrftime.format/3`.\n\nThe hex package [nimble_strftime](https://hex.pm/packages/nimble_strftime)\nprovides a `format/3` function to format dates, times and datetimes.\nIt takes a set of options that can return day, month and am/pm names.\n\n`strftime_options!` returns a keyword list than can be used as these\noptions to return localised names for days, months and am/pm.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"* `locale` is any locale returned by `MyApp.Cldr.known_locale_names/0`. The\n default is `MyApp.Cldr.get_locale/0`\n\n* `options` is a set of keyword options. The default is `[]`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"* `:calendar` is the name of any known CLDR calendar. The default\n is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-options"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"iex: MyApp.Cldr.Calendar.strftime_options!()\n [\n am_pm_names: #Function<0.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n month_names: #Function<1.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n abbreviated_month_names: #Function<2.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n day_of_week_names: #Function<3.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n abbreviated_day_of_week_names: #Function<4.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>\n ]","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-example"},{"type":"function","title":"Typical usage - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"iex: NimbleStrftime.format(Date.utc_today(), MyApp.Cldr.Calendar.strftime_options!())","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-typical-usage"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Currency","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale/3","doc":"Returns a map of the metadata for all currencies for\na given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale/3","doc":"* `{:ok, currency_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale!/3","doc":"* `{:ok, currency_map}` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"* A `{:ok, currency}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"* A `t:Cldr.Current.t/0` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"Returns the effective currency for a given locale","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by\n `Cldr.Locale.new!/2`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"* A ISO 4217 currency code as an upcased atom","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale(\"en\")\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale\n :USD\n\n iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale(\"en-AU\")\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale\n :AUD\n\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale(\"en-GB\")\n :GBP","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_history_for_locale/1","doc":"Returns a list of historic and the current\ncurrency for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_strings/3","doc":"* `{:ok, currency_string_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_strings!/3","doc":"* `{:ok, currency_string_map}` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies/0","doc":"* A map of `{territory_code => Cldr.Currency.t}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies/0","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies()","ref":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currencies/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currencies/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency?/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"Returns a 2-tuple indicating if the supplied currency code is known.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"* `{:ok, currency_code}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code(\"AUD\")\n {:ok, :AUD}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code(\"GGG\")\n {:error, {Cldr.UnknownCurrencyError, \"The currency \\\"GGG\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"Returns a boolean indicating if the supplied currency code is known.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"* `true` or `false`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(\"AUD\")\n true\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(\"GGG\")\n false\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(:XCV)\n false","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_codes/0","doc":"Returns a list of all known currency codes.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_codes/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.known_currency_codes/0","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_codes()","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_codes/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"Returns a `Currency` struct created from the arguments.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"* `{:ok, Cldr.Currency.t}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Currency.new(:XAE, name: \"XAE\", digits: 0)\n {:error, {Cldr.CurrencyAlreadyDefined, \"Currency :XAE is already defined.\"}}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.pluralize/3","doc":"* `{:ok, plural_string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD)\n {:ok, \"US dollar\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(3, :USD)\n {:ok, \"US dollars\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: \"zh\")\n {:ok, \"美元\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: \"fr\")\n {:ok, \"dollars des États-Unis\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD, locale: \"fr\")\n {:ok, \"dollar des États-Unis\"}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"Returns the strings associated with a currency\nin a given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"* A list of strings or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, \"en\")\n ...> |> Enum.sort()\n [\"a$\", \"aud\", \"australian dollar\", \"australian dollars\"]","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Date","doc":"","ref":"Bonfire.Common.Localise.Cldr.Date.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"Formats a date according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html).","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `date` is a `t:Date.t/0` struct or any map that contains one or more\n of the keys `:year`, `:month`, `:day` and optionally `:calendar`.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full dates (that is,\n dates having `:year`, `:month`, `:day` and `:calendar` fields). The\n default for partial dates is to derive a candidate format id from the date and\n find the best match from the formats returned by\n `Cldr.Date.available_formats/3`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits\n should be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Date.available_formats/3`\n to see which formats have these variants. Currently no date-specific\n formats have such variants but they may in the future.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `{:ok, formatted_string}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"# Full dates have the default format `:medium`\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], locale: :en)\n {:ok, \"Jul 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :medium, locale: :en)\n {:ok, \"Jul 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :full, locale: :en)\n {:ok, \"Monday, July 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :short, locale: :en)\n {:ok, \"7/10/17\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :short, locale: \"fr\")\n {:ok, \"10/07/2017\"}\n\n # A partial date with a derived \"best match\" format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, month: 6}, locale: \"fr\")\n {:ok, \"06/2024\"}\n\n # A partial date with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, month: 6}, format: :yMMM, locale: \"fr\")\n {:ok, \"juin 2024\"}\n\n # Sometimes the available date fields can't be mapped to an available\n # CLDR defined format.\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, day: 3}, locale: \"fr\")\n {:error,\n {Cldr.DateTime.UnresolvedFormat, \"No available format resolved for :dy\"}}","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"Formats a date according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nor raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `date` is a `t:Date.t/0` struct or any map that contains one or more\n of the keys `:year`, `:month`, `:day` and optionally `:calendar`.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full dates (that is,\n dates having `:year`, `:month`, `:day` and `:calendar` fields). The\n default for partial dates is to derive a candidate format id from the date and\n find the best match from the formats returned by\n `Cldr.Date.available_formats/3`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits\n should be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Date.available_formats/3`\n to see which formats have these variants. Currently no date-specific\n formats have such variants but they may in the future.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `formatted_date` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], locale: :en)\n \"Jul 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :medium, locale: :en)\n \"Jul 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :full, locale: :en)\n \"Monday, July 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :short, locale: :en)\n \"7/10/17\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :short, locale: \"fr\")\n \"10/07/2017\"\n\n # A partial date with a derived \"best match\" format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(%{year: 2024, month: 6}, locale: \"fr\")\n \"06/2024\"\n\n # A partial date with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(%{year: 2024, month: 6}, format: :yMMM, locale: \"fr\")\n \"juin 2024\"","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Date.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3` and `Bonfire.Common.Localise.Cldr.Interval.to_string/3`","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"Returns a interval formed from two dates as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.date` type.\n\n* `to` is any map that conforms to the\n `Calendar.date` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone date.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-31]\n {:ok, \"Jan 1 – Dec 31, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12]\n {:ok, \"Jan 1 – 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month\n {:ok, \"January – December 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :short\n {:ok, \"1/1/2020 – 1/12/2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long, locale: \"fr\"\n {:ok, \"mer. 1 – dim. 12 janv. 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long, locale: \"th\", number_system: :thai\n {:ok, \"พ. ๑ ม.ค. – อา. ๑๒ ม.ค. ๒๐๒๐\"}","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"Returns a interval formed from two dates as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.date` type.\n\n* `to` is any map that conforms to the\n `Calendar.date` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone date.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-31])\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12])\n \"Jan 1 – 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :long\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-01]),\n ...> format: :long, style: :year_and_month\n \"January – December 2020\"\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! ~I\"2020-01/12\"\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :short\n \"1/1/2020 – 1/12/2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :long, locale: \"fr\"\n \"mer. 1 – dim. 12 janv. 2020\"","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"Formats a DateTime according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `datetime` is a `t:DateTime.t/0` `or t:NaiveDateTime.t/0`struct or any map that contains\n one or more of the keys `:year`, `:month`, `:day`, `:hour`, `:minute` and `:second` or\n `:microsecond` with optional `:time_zone`, `:zone_abbr`, `:utc_offset`, `:std_offset`\n and `:calendar` fields.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full` or a format string or\n any of the keys in the map returned by `Cldr.DateTime.date_time_formats/3`.\n The default is `:medium`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:date_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the date part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:date_format` is not specified\n then the date format is defined by the `:format` option.\n\n* `:time_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the time part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:time_format` is not specified\n then the time format is defined by the `:format` option.\n\n* `:style` is either `:at` or `:default`. When set to `:at` the datetime may\n be formatted with a localised string representing ` at ` if such\n a format exists. See `Cldr.DateTime.Format.date_time_at_formats/2`.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.DateTime.available_formats/3`\n to see which formats have these variants.\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted datetime digits should\n be transliterated.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `{:ok, formatted_datetime}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime\n {:ok, \"Jan 1, 2000, 11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, locale: \"en\"\n {:ok, \"Jan 1, 2000, 11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :long, locale: \"en\"\n {:ok, \"January 1, 2000, 11:59:59 PM UTC\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :hms, locale: \"en\"\n {:ok, \"11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: \"en\"\n {:ok, \"Saturday, January 1, 2000, 11:59:59 PM GMT\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: \"fr\"\n {:ok, \"samedi 1 janvier 2000, 23:59:59 UTC\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"Formats a DateTime according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nreturning a formatted string or raising on error.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `datetime` is a `t:DateTime.t/0` `or t:NaiveDateTime.t/0`struct or any map that contains\n one or more of the keys `:year`, `:month`, `:day`, `:hour`, `:minute` and `:second` or\n `:microsecond` with optional `:time_zone`, `:zone_abbr`, `:utc_offset`, `:std_offset`\n and `:calendar` fields.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full` or a format string or\n any of the keys in the map returned by `Cldr.DateTime.date_time_formats/3`.\n The default is `:medium`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:date_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the date part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:date_format` is not specified\n then the date format is defined by the `:format` option.\n\n* `:time_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the time part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:time_format` is not specified\n then the time format is defined by the `:format` option.\n\n* `:style` is either `:at` or `:default`. When set to `:at` the datetime may\n be formatted with a localised string representing ` at ` if such\n a format exists. See `Cldr.DateTime.Format.date_time_at_formats/2`.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.DateTime.available_formats/3`\n to see which formats have these variants.\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted datetime digits should\n be transliterated.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `formatted_datetime` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"iex> {:ok, date_time} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, locale: :en)\n \"Jan 1, 2000, 11:59:59 PM\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :long, locale: :en)\n \"January 1, 2000, 11:59:59 PM UTC\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :full, locale: :en)\n \"Saturday, January 1, 2000, 11:59:59 PM GMT\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :full, locale: :fr)\n \"samedi 1 janvier 2000, 23:59:59 UTC\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Format","doc":"Manages the Date, TIme and DateTime formats\ndefined by CLDR.\n\nThe functions in `Cldr.DateTime.Format` are\nprimarily concerned with encapsulating the\ndata from CLDR in functions that are used\nduring the formatting process.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"Returns a list of calendars defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for(:en)\n {:ok, [:buddhist, :chinese, :coptic, :dangi, :ethiopic, :ethiopic_amete_alem,\n :generic, :gregorian, :hebrew, :indian, :islamic, :islamic_civil,\n :islamic_rgsa, :islamic_tbla, :islamic_umalqura, :japanese, :persian, :roc]}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names/0","doc":"Returns a list of the date_time format IDs that are\navailable in all known locales.\n\nThe format IDs returned by `common_date_time_format_names/0`\nare guaranteed to be available in all known locales,","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#common_date_time_format_names/0"},{"type":"function","title":"Example: - Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names/0","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names()\n [:Bh, :Bhm, :Bhms, :E, :EBhm, :EBhms, :EHm, :EHms, :Ed, :Ehm, :Ehms, :Gy,\n :GyMMM, :GyMMMEd, :GyMMMd, :GyMd, :H, :Hm, :Hms, :Hmsv, :Hmv, :M, :MEd, :MMM,\n :MMMEd, :MMMMW, :MMMMd, :MMMd, :Md, :d, :h, :hm, :hms, :hmsv, :hmv, :ms, :y,\n :yM, :yMEd, :yMMM, :yMMMEd, :yMMMM, :yMMMd, :yMd, :yQQQ, :yQQQQ, :yw]","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#common_date_time_format_names/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"Returns a map of the available date formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats \"en\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"Returns a map of the standard date formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en)\n {:ok, %Cldr.Date.Formats{\n full: \"EEEE, MMMM d, y\",\n long: \"MMMM d, y\",\n medium: \"MMM d, y\",\n short: \"M/d/yy\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en, :buddhist)\n {:ok, %Cldr.Date.Formats{\n full: \"EEEE, MMMM d, y G\",\n long: \"MMMM d, y G\",\n medium: \"MMM d, y G\",\n short: \"M/d/y GGGGG\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"Returns a map of the standard datetime \"at\" formats for a given\nlocale and calendar.\n\nAn \"at\" format is one where the datetime is formatted with the\ndate part separated from the time part by a localized version\nof \"at\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`,","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1} 'at' {0}\",\n long: \"{1} 'at' {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"}\n }\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en, :buddhist)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1} 'at' {0}\",\n long: \"{1} 'at' {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"}\n }","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"Returns a map of the available datetime formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats \"en\"\n {:ok,\n %{\n yw: %{\n other: \"'week' w 'of' Y\",\n one: \"'week' w 'of' Y\",\n pluralize: :week_of_year\n },\n GyMMMEd: \"E, MMM d, y G\",\n Hms: \"HH:mm:ss\",\n MMMMW: %{\n other: \"'week' W 'of' MMMM\",\n one: \"'week' W 'of' MMMM\",\n pluralize: :week_of_month\n },\n E: \"ccc\",\n MMMd: \"MMM d\",\n yMEd: \"E, M/d/y\",\n yQQQ: \"QQQ y\",\n Ehm: %{unicode: \"E h:mm a\", ascii: \"E h:mm a\"},\n M: \"L\",\n hm: %{unicode: \"h:mm a\", ascii: \"h:mm a\"},\n yM: \"M/y\",\n GyMMMd: \"MMM d, y G\",\n GyMd: \"M/d/y G\",\n Gy: \"y G\",\n Hm: \"HH:mm\",\n EBhms: \"E h:mm:ss B\",\n d: \"d\",\n hms: %{unicode: \"h:mm:ss a\", ascii: \"h:mm:ss a\"},\n Ed: \"d E\",\n Ehms: %{unicode: \"E h:mm:ss a\", ascii: \"E h:mm:ss a\"},\n EHms: \"E HH:mm:ss\",\n Bh: \"h B\",\n h: %{unicode: \"h a\", ascii: \"h a\"},\n Bhms: \"h:mm:ss B\",\n Hmv: \"HH:mm v\",\n hmv: %{unicode: \"h:mm a v\", ascii: \"h:mm a v\"},\n yMd: \"M/d/y\",\n ms: \"mm:ss\",\n MMM: \"LLL\",\n y: \"y\",\n Bhm: \"h:mm B\",\n yMMM: \"MMM y\",\n yQQQQ: \"QQQQ y\",\n yMMMEd: \"E, MMM d, y\",\n yMMMM: \"MMMM y\",\n EBhm: \"E h:mm B\",\n Hmsv: \"HH:mm:ss v\",\n yMMMd: \"MMM d, y\",\n MEd: \"E, M/d\",\n EHm: \"E HH:mm\",\n GyMMM: \"MMM y G\",\n hmsv: %{unicode: \"h:mm:ss a v\", ascii: \"h:mm:ss a v\"},\n H: \"HH\",\n Md: \"M/d\",\n MMMEd: \"E, MMM d\",\n MMMMd: \"MMMM d\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"Returns a map of the standard datetime formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1}, {0}\",\n long: \"{1}, {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en, :buddhist)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1}, {0}\",\n long: \"{1}, {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"Returns the fallback format for a given\nlocale and calendar type","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback(:en, :gregorian)\n [0, \" – \", 1]","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"Returns a map of the interval formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats(:en, :gregorian)\n {:ok,\n %{\n h: %{a: [\"h a – \", \"h a\"], h: [\"h – \", \"h a\"]},\n d: %{d: [\"d – \", \"d\"]},\n y: %{y: [\"y – \", \"y\"]},\n M: %{M: [\"M – \", \"M\"]},\n Bh: %{h: [\"h – \", \"h B\"], B: [\"h B – \", \"h B\"]},\n Bhm: %{\n m: [\"h:mm – \", \"h:mm B\"],\n h: [\"h:mm – \", \"h:mm B\"],\n B: [\"h:mm B – \", \"h:mm B\"]\n },\n Gy: %{y: [\"y – \", \"y G\"], G: [\"y G – \", \"y G\"]},\n GyMMM: %{\n y: [\"MMM y – \", \"MMM y G\"],\n M: [\"MMM – \", \"MMM y G\"],\n G: [\"MMM y G – \", \"MMM y G\"]\n },\n GyMMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d, y G\"],\n y: [\"E, MMM d, y – \", \"E, MMM d, y G\"],\n M: [\"E, MMM d – \", \"E, MMM d, y G\"],\n G: [\"E, MMM d, y G – \", \"E, MMM d, y G\"]\n },\n GyMMMd: %{\n d: [\"MMM d – \", \"d, y G\"],\n y: [\"MMM d, y – \", \"MMM d, y G\"],\n M: [\"MMM d – \", \"MMM d, y G\"],\n G: [\"MMM d, y G – \", \"MMM d, y G\"]\n },\n GyMd: %{\n d: [\"M/d/y – \", \"M/d/y G\"],\n y: [\"M/d/y – \", \"M/d/y G\"],\n M: [\"M/d/y – \", \"M/d/y G\"],\n G: [\"M/d/y G – \", \"M/d/y G\"]\n },\n H: %{H: [\"HH – \", \"HH\"]},\n Hm: %{m: [\"HH:mm – \", \"HH:mm\"], H: [\"HH:mm – \", \"HH:mm\"]},\n Hmv: %{m: [\"HH:mm – \", \"HH:mm v\"], H: [\"HH:mm – \", \"HH:mm v\"]},\n MEd: %{d: [\"E, M/d – \", \"E, M/d\"], M: [\"E, M/d – \", \"E, M/d\"]},\n MMM: %{M: [\"MMM – \", \"MMM\"]},\n MMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d\"],\n M: [\"E, MMM d – \", \"E, MMM d\"]\n },\n MMMd: %{d: [\"MMM d – \", \"d\"], M: [\"MMM d – \", \"MMM d\"]},\n Md: %{d: [\"M/d – \", \"M/d\"], M: [\"M/d – \", \"M/d\"]},\n hm: %{\n m: [\"h:mm – \", \"h:mm a\"],\n a: [\"h:mm a – \", \"h:mm a\"],\n h: [\"h:mm – \", \"h:mm a\"]\n },\n hmv: %{\n m: [\"h:mm – \", \"h:mm a v\"],\n a: [\"h:mm a – \", \"h:mm a v\"],\n h: [\"h:mm – \", \"h:mm a v\"]\n },\n yM: %{y: [\"M/y – \", \"M/y\"], M: [\"M/y – \", \"M/y\"]},\n yMEd: %{\n d: [\"E, M/d/y – \", \"E, M/d/y\"],\n y: [\"E, M/d/y – \", \"E, M/d/y\"],\n M: [\"E, M/d/y – \", \"E, M/d/y\"]\n },\n yMMM: %{y: [\"MMM y – \", \"MMM y\"], M: [\"MMM – \", \"MMM y\"]},\n yMMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d, y\"],\n y: [\"E, MMM d, y – \", \"E, MMM d, y\"],\n M: [\"E, MMM d – \", \"E, MMM d, y\"]\n },\n yMMMM: %{y: [\"MMMM y – \", \"MMMM y\"], M: [\"MMMM – \", \"MMMM y\"]},\n yMMMd: %{\n d: [\"MMM d – \", \"d, y\"],\n y: [\"MMM d, y – \", \"MMM d, y\"],\n M: [\"MMM d – \", \"MMM d, y\"]\n },\n yMd: %{\n d: [\"M/d/y – \", \"M/d/y\"],\n y: [\"M/d/y – \", \"M/d/y\"],\n M: [\"M/d/y – \", \"M/d/y\"]\n },\n GyM: %{\n y: [\"M/y – \", \"M/y G\"],\n M: [\"M/y – \", \"M/y G\"],\n G: [\"M/y G – \", \"M/y G\"]\n },\n GyMEd: %{\n d: [\"E, M/d/y – \", \"E, M/d/y G\"],\n y: [\"E, M/d/y – \", \"E, M/d/y G\"],\n M: [\"E, M/d/y – \", \"E, M/d/y G\"],\n G: [\"E, M/d/y G – \", \"E, M/d/y G\"]\n },\n Hv: %{H: [\"HH – \", \"HH v\"]},\n hv: %{a: [\"h a – \", \"h a v\"], h: [\"h – \", \"h a v\"]}\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"Returns the time period for a given time of day.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"* `time` is any `Time.t` or a map with at least `:hour`,\n `:minute` and `:second` keys\n\n* `language` is a binary representation of a valid and\n configured language in `Cldr`\n\nThe time period is a locale-specific key that is used\nto localise a time into a textual representation of \"am\",\n\"pm\", \"noon\", \"midnight\", \"evening\", \"morning\" and so on\nas defined in the CLDR day period rules.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[06:05:54.515228], :en\n :morning1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[13:05:54.515228], :en\n :afternoon1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[21:05:54.515228], :en\n :night1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[21:05:54.515228], :fr\n :evening1","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"Returns the GMT offset format list for a\nfor a timezone offset for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format(:en)\n {:ok, [\"GMT\", 0]}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"Returns the GMT format string for a\nfor a timezone with an offset of zero for\na given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format(:en)\n {:ok, \"GMT\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format(:fr)\n {:ok, \"UTC\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"Returns the positive and negative hour format\nfor a timezone offset for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format(\"en\")\n {:ok, {\"+HH:mm\", \"-HH:mm\"}}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"Returns a boolean indicating is a given language defines the\nnotion of \"noon\" and \"midnight\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"* `language` is a binary representation of a valid and\n configured language in `Cldr`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :fr\n true\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :en\n true\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :af\n false","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"Returns a map of the available time formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats :en","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"Returns a map of the standard time formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en)\n {:ok, %Cldr.Time.Formats{\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en, :buddhist)\n {:ok, %Cldr.Time.Formats{\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2-examples"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.calendar/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#t:calendar/0"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.formats/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#t:formats/0"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","doc":"Implements the compilation and execution of\ndate, time and datetime formats.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"Returns the formatted and localised date, time or datetime\nfor a given `Date`, `Time`, `DateTime` or struct with the\nappropriate fields.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"* `date` is a `Date`, `Time`, `DateTime` or other struct that\ncontains the required date and time fields.\n\n* `format` is a valid format string, for example `yy/MM/dd hh:MM`\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"* `:number_system`. The resulting formatted and localised date/time\nstring will be transliterated into this number system. Number system\nis anything returned from `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`\n\n*NOTE* This function is called by `Cldr.Date.to_string/2`, `Cldr.Time.to_string/2`\nand `Cldr.DateTime.to_string/2` which is the preferred API.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Formatter.format ~U[2017-09-03 10:23:00.0Z], \"yy/MM/dd hh:MM\", \"en\"\n {:ok, \"17/09/03 10:09\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.gmt_tz_format/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#gmt_tz_format/3"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Cldr.Interval.to_string/3` and `Cldr.DateTime.Interval.to_string/3`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.do_to_string/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#do_to_string/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two dates.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.datetime` type.\n\n* `to` is any map that conforms to the\n `Calendar.datetime` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone datetime.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z],\n ...> ~U[2020-12-31 10:00:00.0Z]\n {:ok, \"Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z], nil\n {:ok, \"Jan 1, 2020, 12:00:00 AM –\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two dates or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.datetime` type.\n\n* `to` is any map that conforms to the\n `Calendar.datetime` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone datetime.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string! ~U[2020-01-01 00:00:00.0Z],\n ...> ~U[2020-12-31 10:00:00.0Z]\n \"Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"Returns a `{:ok, string}` representing a relative time (ago, in) for a given\nnumber, `t:Date.t/0` or `t:Datetime.t/0`. Returns `{:error, reason}` when errors\nare detected.\n\n* `relative` is a number or Date/Datetime representing the time distance from `now` or from\n options[:relative_to]\n\n* `options` is a `Keyword` list of options which are:","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"* `:locale` is the locale in which the binary is formatted.\n The default is `Cldr.get_locale/0`\n\n* `:format` is the format of the binary. Style may be `:default`, `:narrow` or `:short`\n\n* `:unit` is the time unit for the formatting. The allowable units are `:second`, `:minute`,\n `:hour`, `:day`, `:week`, `:month`, `:year`, `:mon`, `:tue`, `:wed`, `:thu`, `:fri`, `:sat`,\n `:sun`, `:quarter`\n\n* `:relative_to` is the baseline Date or Datetime from which the difference from `relative` is\n calculated when `relative` is a Date or a DateTime. The default for a Date is `Date.utc_today`,\n for a DateTime it is `DateTime.utc_now`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-options"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"When `options[:unit]` is not specified, `MyApp.Cldr.DateTime.Relative.to_string/2`\nattempts to identify the appropriate unit based upon the magnitude of `relative`.\nFor example, given a parameter of less than `60`, then `to_string/2` will\nassume `:seconds` as the unit. See `unit_from_relative_time/1`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(-1)\n {:ok, \"1 second ago\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1)\n {:ok, \"in 1 second\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day)\n {:ok, \"tomorrow\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, locale: \"fr\")\n {:ok, \"demain\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, format: :narrow)\n {:ok, \"tomorrow\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year)\n {:ok, \"in 1,234 years\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year, locale: \"fr\")\n {:ok, \"dans 1 234 ans\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(31)\n {:ok, \"in 31 seconds\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], relative_to: ~D[2017-04-26])\n {:ok, \"in 3 days\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, format: :short, locale: \"fr\")\n {:ok, \"dans 5 min\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, format: :narrow, locale: \"fr\")\n {:ok, \"+5 min\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 2, unit: :wed, format: :short, locale: \"en\"\n {:ok, \"in 2 Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 1, unit: :wed, format: :short\n {:ok, \"next Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed, format: :short\n {:ok, \"last Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed\n {:ok, \"last Wednesday\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :quarter\n {:ok, \"last quarter\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :mon, locale: \"fr\"\n {:ok, \"lundi dernier\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], unit: :ziggeraut)\n {:error, {Cldr.DateTime.UnknownTimeUnit,\n \"Unknown time unit :ziggeraut. Valid time units are [:day, :fri, :hour, :minute, :mon, :month, :quarter, :sat, :second, :sun, :thu, :tue, :wed, :week, :year]\"}}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"Returns a `{:ok, string}` representing a relative time (ago, in) for a given\nnumber, Date or Datetime or raises an exception on error.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"* `relative` is a number or Date/Datetime representing the time distance from `now` or from\n options[:relative_to].\n\n* `options` is a `Keyword` list of options.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"* `:locale` is the locale in which the binary is formatted.\n The default is `Cldr.get_locale/0`\n\n* `:format` is the format of the binary. Style may be `:default`, `:narrow` or `:short`.\n The default is `:default`\n\n* `:unit` is the time unit for the formatting. The allowable units are `:second`, `:minute`,\n `:hour`, `:day`, `:week`, `:month`, `:year`, `:mon`, `:tue`, `:wed`, `:thu`, `:fri`, `:sat`,\n `:sun`, `:quarter`\n\n* `:relative_to` is the baseline Date or Datetime from which the difference from `relative` is\n calculated when `relative` is a Date or a DateTime. The default for a Date is `Date.utc_today`,\n for a DateTime it is `DateTime.utc_now`\n\nSee `to_string/2`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2-options"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nThe interval functions in this library will determine the calendar\nfield with the greatest difference between the two datetimes before using the\nformat pattern.\n\nFor example, the greatest difference in \"Jan 10-12, 2008\" is the day field, while\nthe greatest difference in \"Jan 10 - Feb 12, 2008\" is the month field. This is used to\npick the exact pattern to be used.\n\nSee `Cldr.Interval` for further detail.","ref":"Bonfire.Common.Localise.Cldr.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"Returns a `Date.Range` or `CalendarInterval` as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `range` is either a `Date.Range.t` returned from `Date.range/2`\n or a `CalendarInterval.t`\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If a style is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `to_string/2` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~I\"2020-01-01/12\",\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string Date.range(~D[2020-01-01], ~D[2020-12-31]),\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Thu, Dec 31, 2020\"}","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two dates.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n any one of the `Calendar` types.\n\n* `to` is any map that conforms to the\n any one of the `Calendar` types. `to` must\n occur on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If styling is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `to_string/2` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-12-31])\n {:ok, \"Jan 1 – Dec 31, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-01-12])\n {:ok, \"Jan 1 – 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long)\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month)\n {:ok, \"January – December 2020\"}\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~I\"2020-01-01/12\",\n ...> format: :long)\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~U[2020-01-01 00:00:00.0Z], ~U[2020-12-01 10:05:00.0Z],\n ...> format: :long)\n {:ok, \"January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:05:00.0Z],\n ...> format: :long)\n {:ok, \"January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC\"}","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"Returns a `Date.Range` or `CalendarInterval` as\na localised string or raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `range` is either a `Date.Range.t` returned from `Date.range/2`\n or a `CalendarInterval.t`\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If a style is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`.\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `to_string/3` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Otherwise\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~I\"2020-01-01/12\",\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(Date.range(~D[2020-01-01], ~D[2020-12-31]),\n ...> format: :long)\n \"Wed, Jan 1 – Thu, Dec 31, 2020\"","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two date or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n any one of the `Calendar` types.\n\n* `to` is any map that conforms to the\n any one of the `Calendar` types. `to` must\n occur on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If styling is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`.\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `string` or\n\n* raises and exception","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `to_string/3` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-12-31])\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-01-12])\n \"Jan 1 – 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month)\n \"January – December 2020\"\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~I\"2020-01-01/12\",\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~U[2020-01-01 00:00:00.0Z], ~U[2020-12-01 10:05:00.0Z],\n ...> format: :long)\n \"January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:05:00.0Z],\n ...> format: :long)\n \"January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC\"","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Language","doc":"","ref":"Bonfire.Common.Localise.Cldr.Language.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.available_languages/1","doc":"Return all the languages' iso-codes available for a given locale.\nDefaults to the current locale.","ref":"Bonfire.Common.Localise.Cldr.Language.html#available_languages/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.available_languages/1","doc":"> Bonfire.Common.Localise.Cldr.Language.Language.available_languages(:en)\n [\"aa\", \"ab\", \"ace\", \"ach\", \"ada\", \"ady\", \"ae\", \"aeb\", \"af\", \"afh\", \"agq\", \"ain\",\n \"ak\", \"akk\", \"akz\", \"ale\", \"aln\", \"alt\", \"am\", \"an\", \"ang\", \"anp\", \"ar\",\n \"ar-001\", \"arc\", \"arn\", \"aro\", \"arp\", \"arq\", \"ars\", \"arw\", \"ary\", \"arz\", \"as\",\n \"asa\", \"ase\", \"ast\", \"av\", \"avk\", \"awa\", \"ay\", \"az\", \"ba\", \"bal\", \"ban\", \"bar\",\n \"bas\", \"bax\", \"bbc\", \"bbj\", ...]","ref":"Bonfire.Common.Localise.Cldr.Language.html#available_languages/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.known_languages/1","doc":"Return a map of iso-code keyed maps of language names in any available\nformats for the given locale.\nDefaults to the current locale.","ref":"Bonfire.Common.Localise.Cldr.Language.html#known_languages/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.known_languages/1","doc":"> Bonfire.Common.Localise.Cldr.Language.Language.known_languages(:en)\n %{\"bez\" => %{standard: \"Bena\"}, \"lo\" => %{standard: \"Lao\"},\n \"kha\" => %{standard: \"Khasi\"}, \"eo\" => %{standard: \"Esperanto\"},\n \"rm\" => %{standard: \"Romansh\"}, \"ja\" => %{standard: \"Japanese\"},\n \"sw-CD\" => %{standard: \"Congo Swahili\"},\n \"pdc\" => %{standard: \"Pennsylvania German\"}, \"om\" => %{standard: \"Oromo\"},\n \"jut\" => %{standard: \"Jutish\"}, \"lij\" => %{standard: \"Ligurian\"},\n \"kut\" => %{standard: \"Kutenai\"}, \"vep\" => %{standard: \"Veps\"},\n \"yao\" => %{standard: \"Yao\"}, \"gez\" => %{standard: \"Geez\"},\n \"cr\" => %{standard: \"Cree\"}, \"ne\" => %{standard: \"Nepali\"},\n \"zbl\" => %{standard: \"Blissymbols\"}, \"ae\" => %{standard: \"Avestan\"},\n \"rof\" => %{standard: \"Rombo\"}, \"tkl\" => %{standard: \"Tokelau\"},\n \"rgn\" => %{standard: \"Romagnol\"}, \"el\" => %{standard: \"Greek\"},\n \"myv\" => %{standard: \"Erzya\"}, \"smj\" => %{standard: \"Lule Sami\"},\n \"fo\" => %{standard: \"Faroese\"}, \"ii\" => %{standard: \"Sichuan Yi\"},\n \"bum\" => %{standard: \"Bulu\"}, \"za\" => %{standard: \"Zhuang\"},\n \"raj\" => %{standard: \"Rajasthani\"}, \"mrj\" => %{standard: \"Western Mari\"},\n \"stq\" => %{standard: \"Saterland Frisian\"}, \"hu\" => %{standard: \"Hungarian\"},\n \"mga\" => %{standard: \"Middle Irish\"}, \"bej\" => %{standard: \"Beja\"},\n \"yue\" => %{standard: \"Cantonese\"}, \"xog\" => %{standard: \"Soga\"},\n \"ttt\" => %{standard: \"Muslim Tat\"}, \"uga\" => %{standard: \"Ugaritic\"},\n \"rup\" => %{standard: \"Aromanian\"},\n \"crs\" => %{standard: \"Seselwa Creole French\"}, \"oc\" => %{standard: \"Occitan\"},\n \"chp\" => %{standard: \"Chipewyan\"}, \"zen\" => %{standard: \"Zenaga\"},\n \"kmb\" => %{standard: \"Kimbundu\"}, \"nr\" => %{standard: \"South Ndebele\"},\n \"tiv\" => %{standard: \"Tiv\"}, \"aln\" => %{standard: \"Gheg Albanian\"},\n \"sh\" => %{standard: \"Serbo-Croatian\"}, \"fil\" => %{...}, ...}","ref":"Bonfire.Common.Localise.Cldr.Language.html#known_languages/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.to_string/2","doc":"Try to translate the given language iso code or language tag.","ref":"Bonfire.Common.Localise.Cldr.Language.html#to_string/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Language.Language.to_string(\"eo\")\n {:ok, \"Esperanto\"}","ref":"Bonfire.Common.Localise.Cldr.Language.html#to_string/2-example"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.Language.styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Language.html#t:styles/0"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.List","doc":"Cldr backend module that formats lists.\n\nIf we have a list of days like `[\"Monday\", \"Tuesday\", \"Wednesday\"]`\nthen we can format that list for a given locale by:\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"Monday\", \"Tuesday\", \"Wednesday\"], locale: \"en\")\n {:ok, \"Monday, Tuesday, and Wednesday\"}","ref":"Bonfire.Common.Localise.Cldr.List.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"Intersperces a list elements into a list format according to the list\npattern rules for a locale.\n\nThis function can be helpful when creating a list from `Phoenix`\nsafe strings which are of the format `{:safe, \"some string\"}`","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"* `list` is any list of of terms that can be passed through `Kernel.to_string/1`\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"* `:locale` is any configured locale. See . The default\n is `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n\n* `:format` is any of those returned by\n `Cldr.List.known_list_formats/0` or by `Cldr.List.Pattern.new/1`.\n The default is `format: :standard`.","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"en\")\n {:ok, [\"a\", \", \", \"b\", \", and \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n {:ok, [\"a\", \" \", \"b\", \" \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"fr\")\n {:ok, [\"a\", \", \", \"b\", \" et \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2,3,4,5,6])\n {:ok, [1, \", \", 2, \", \", 3, \", \", 4, \", \", 5, \", and \", 6]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\"])\n {:ok, [\"a\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2])\n {:ok, [1, \" and \", 2]}","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse!/2","doc":"Formats a list using `intersperse/2` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.intersperse!/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.intersperse!([\"a\", \"b\", \"c\"], locale: \"en\")\n [\"a\", \", \", \"b\", \", and \", \"c\"]\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse!([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n [\"a\", \" \", \"b\", \" \", \"c\"]","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.list_formats_for/1","doc":"Returns the styles of list patterns available for a locale.\n\nReturns a list of `atom`s of of the list formats that are\navailable in CLDR for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#list_formats_for/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.List.list_formats_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.List.list_formats_for(:en)\n [:or, :or_narrow, :or_short, :standard, :standard_narrow, :standard_short,\n :unit, :unit_narrow, :unit_short]","ref":"Bonfire.Common.Localise.Cldr.List.html#list_formats_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.list_patterns_for/1","doc":"Returns the list patterns for a locale.\n\nList patterns provide rules for combining multiple\nitems into a language format appropriate for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#list_patterns_for/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.List.list_patterns_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.List.list_patterns_for(:en)\n %{\n or: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n or_narrow: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n or_short: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard: %Cldr.List.Pattern{\n two: [0, \" and \", 1],\n end: [0, \", and \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard_narrow: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard_short: %Cldr.List.Pattern{\n two: [0, \" & \", 1],\n end: [0, \", & \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n unit: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n unit_narrow: %Cldr.List.Pattern{\n two: [0, \" \", 1],\n end: [0, \" \", 1],\n middle: [0, \" \", 1],\n start: [0, \" \", 1]\n },\n unit_short: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n }\n }","ref":"Bonfire.Common.Localise.Cldr.List.html#list_patterns_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"Formats a list into a string according to the list pattern rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"* `list` is any list of of terms that can be passed through `Kernel.to_string/1`\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"* `:locale` is any configured locale. See . The default\n is `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n\n* `:format` is any of those returned by\n `Cldr.List.known_list_formats/0` or by `Cldr.List.Pattern.new/1`.\n The default is `format: :standard`.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"en\")\n {:ok, \"a, b, and c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n {:ok, \"a b c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"fr\")\n {:ok, \"a, b et c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2,3,4,5,6])\n {:ok, \"1, 2, 3, 4, 5, and 6\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\"])\n {:ok, \"a\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2])\n {:ok, \"1 and 2\"}","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.to_string!/2","doc":"Formats a list using `to_string/2` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.to_string!([\"a\", \"b\", \"c\"], locale: \"en\")\n \"a, b, and c\"\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string!([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n \"a b c\"","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Locale","doc":"Backend module that provides functions\nto define new locales and display human-readable\nlocale names for presentation purposes.","ref":"Bonfire.Common.Localise.Cldr.Locale.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"* `locale_name` is any locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"* `{:ok, list_of_locale_names}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names(:nb)\n {:ok, [:nb, :no, :und]}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"* `locale_name` is any locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"* `{:ok, list_of_locales}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"Bonfire.Common.Localise.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 Bonfire.Common.Localise.Cldr.Locale.fallback_locales(:nb))\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.locale_for_territory/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.locale_for_territory/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:AU)\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-AU\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:US)\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-US\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:ZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZ is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"Returns a \"best fit\" locale for a host name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"* `{:ok, langauge_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host \"a.b.com.au\"\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-AU\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host(\"a.b.com.tv\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"tv\\\"\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.new/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#new/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.new!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#new!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale/1","doc":"Returns the script direction for a locale.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale \"en-US\"\n :ltr\n\n iex> Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale :ar\n :rtl","ref":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"Returns the last segment of a host that might\nbe a territory.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"* `host` is any valid host name","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"* `{:ok, territory}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"Returns the territory from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"* A territory code as an atom","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.territory_from_locale \"en-US\"\n :US\n\n iex> Bonfire.Common.Localise.Cldr.Locale.territory_from_locale \"en-US-u-rg-GBzzzz\"\n :GB","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"Returns the time zone from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale \"en-US-u-tz-ausyd\"\n \"Australia/Sydney\"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay","doc":"Manages the display name data for language tags\nand presents a public API for rendering\ndisplay names for locales.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"Returns a localised display name for a\nlocale.\n\nUI applications often have a requirement\nto present locale choices to an end user.\n\nThis function takes a `t.Cldr.LanguageTag`\nand using the [CLDR locale display name algorithm](https://unicode-org.github.io/cldr/ldml/tr35-general.html#locale_display_name_algorithm)\nproduces a string suitable for presentation.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `language_tag` is any `t:Cldr.LanguageTag` or\n a binary locale name.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `:compound_locale` is a boolean indicating\n if the combination of language, script and territory\n should be used to resolve a language name.\n The default is `true`.\n\n* `:prefer` signals the preferred name for\n a subtag when there are alternatives.\n The default is `:default`. Few subtags\n provide alternative renderings. Some of\n the alternative preferences are`:short`,\n `:long`, `:menu` and `:variant`.\n\n* `:locale` is a `t:Cldr.LanguageTag` or any valid\n locale name returned by `Cldr.known_locale_names/1`.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `{:ok, string}` representing a name\n suitable for presentation purposes or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en\"\n {:ok, \"English\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US\"\n {:ok, \"American English\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US\", compound_locale: false\n {:ok, \"English (United States)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US-u-ca-gregory-cu-aud\"\n {:ok, \"American English (Gregorian Calendar, Currency: A$)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US-u-ca-gregory-cu-aud\", locale: \"fr\"\n {:ok, \"anglais américain (calendrier grégorien, devise : A$)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"nl-BE\"\n {:ok, \"Flemish\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"nl-BE\", compound_locale: false\n {:ok, \"Dutch (Belgium)\"}","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"Returns a localised display name for a\nlocale.\n\nUI applications often have a requirement\nto present locale choices to an end user.\n\nThis function takes a `t.Cldr.LanguageTag`\nand using the [CLDR locale display name algorithm](https://unicode-org.github.io/cldr/ldml/tr35-general.html#locale_display_name_algorithm)\nproduces a string suitable for presentation.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* `language_tag` is any `t:Cldr.LanguageTag` or\n a binary locale name.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* `:compound_locale` is a boolean indicating\n if the combination of language, script and territory\n should be used to resolve a language name.\n The default is `true`.\n\n* `:prefer` signals the preferred name for\n a subtag when there are alternatives.\n The default is `:default`. Few subtags\n provide alternative renderings. Some of\n the alternative preferences are`:short`,\n `:long`, `:menu` and `:variant`.\n\n* `:locale` is a `t:Cldr.LanguageTag` or any valid\n locale name returned by `Cldr.known_locale_names/1`.\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`.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* a string representation of the language tag\n suitable for presentation purposes or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en\"\n \"English\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US\"\n \"American English\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US\", compound_locale: false\n \"English (United States)\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US-u-ca-gregory-cu-aud\"\n \"American English (Gregorian Calendar, Currency: A$)\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US-u-ca-gregory-cu-aud\", locale: \"fr\"\n \"anglais américain (calendrier grégorien, devise : A$)\"","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"Returns the localised display names data\nfor a locale name.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.LocaleDisplay.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"* A map of locale display names","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"=> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names(\"en\")","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"Returns the localised time zone names data\nfor a locale name.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.LocaleDisplay.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"* A map of locale time zone names","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"=> Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names(\"en\")","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html"},{"type":"module","title":"Non-Scientific Notation Formatting - Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html#module-non-scientific-notation-formatting"},{"type":"module","title":"Scientific Notation Formatting - Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html#module-scientific-notation-formatting"},{"type":"module","title":"Significant Digits - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#module-significant-digits"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"Parse a string locale-aware manner and return\na number.","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag.t`. The default is\n `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.parse(\"+1.000,34\", locale: \"de\")\n {:ok, 1000.34}\n\n iex> Bonfire.Common.Localise.Cldr.Number.parse(\"-1_000_000.34\")\n {:ok, -1000000.34}\n\n iex> Bonfire.Common.Localise.Cldr.Number.parse(\"1.000\", locale: \"de\", number: :integer)\n {:ok, 1000}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_currencies/2","doc":"Resolve curencies from strings within\na list.","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-options"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_currencies/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 US dollars\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies\n [100, :USD]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 eurosports\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(fuzzy: 0.75)\n [100, :EUR]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 dollars des États-Unis\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(locale: \"fr\")\n [100, :USD]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"Resolve a currency from a string","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"* An ISO4217 currency code as an atom or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"US dollars\")\n [:USD]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"100 eurosports\", fuzzy: 0.75)\n [:EUR]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"dollars des États-Unis\", locale: \"fr\")\n [:USD]\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"Resolve and tokenize percent or permille\nfrom the beginning and/or the end of a string","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"* An `:percent` or `permille` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"11%\"\n [\"11\", :percent]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"% of linguists\"\n [:percent, \" of linguists\"]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"% of linguists %\"\n [:percent, \" of linguists \", :percent]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_pers/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100%\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_pers()\n [100, :percent]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"Scans a string locale-aware manner and returns\na list of strings and numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"* A list of strings and numbers","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"£1_000_000.34\")\n [\"£\", 1000000.34]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"I want £1_000_000 dollars\")\n [\"I want £\", 1000000, \" dollars\"]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"The prize is 23\")\n [\"The prize is \", 23]\n\n iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.scan(\"The loss is -1.000 euros\", locale: \"de\", number: :integer)\n [\"The loss is \", -1000, \" euros\"]","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_approx_string/2","doc":"Formats a number and applies the `:approximately` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_approx_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_approx_string 1234\n {:ok, \"~1,234\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_at_least_string/2","doc":"Formats a number and applies the `:at_least` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.to_string/2` for a description of the available\n options.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_at_least_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_at_least_string 1234\n {:ok, \"1,234+\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_at_most_string/2","doc":"Formats a number and applies the `:at_most` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_at_most_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_at_most_string 1234\n {:ok, \"≤1,234\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_range_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_range_string 1234..5678\n {:ok, \"1,234–5,678\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"Returns a number formatted into a string according to a format pattern and options.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-options"},{"type":"function","title":"Locale extensions affecting formatting - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-locale-extensions-affecting-formatting"},{"type":"function","title":"Wrapping format elements - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-wrapping-format-elements"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345\n {:ok, \"12,345\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: \"fr\"\n {:ok, \"12 345\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\", minimum_grouping_digits: 1\n {:ok, \"1.345,32 €\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\"\n {:ok, \"1345,32 €\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: \"fr\", currency: \"USD\"\n {:ok, \"12 345,00 $US\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: \"#E0\"\n {:ok, \"1.2345E4\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\"\n {:ok, \"THB 12,345.00\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string -12345, format: :accounting, currency: \"THB\"\n {:ok, \"(THB 12,345.00)\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\"\n {:ok, \"฿12,345.00\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\", number_system: :native\n {:ok, \"฿๑๒,๓๔๕.๐๐\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long\n {:ok, \"1 thousand\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long, currency: \"USD\"\n {:ok, \"1,244 US dollars\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short\n {:ok, \"1K\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short, currency: \"EUR\"\n {:ok, \"€1K\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1234, format: :spellout\n {:ok, \"one thousand two hundred thirty-four\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1234, format: :spellout_verbose\n {:ok, \"one thousand two hundred and thirty-four\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1989, format: :spellout_year\n {:ok, \"nineteen eighty-nine\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :ordinal\n {:ok, \"123rd\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :roman\n {:ok, \"CXXIII\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, locale: \"th-u-nu-thai\"\n {:ok, \"๑๒๓\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-examples"},{"type":"function","title":"Errors - Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-errors"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.to_string/2`","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.to_string!/2","doc":"* a formatted number as a string or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_string! 12345\n \"12,345\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string! 12345, locale: \"fr\"\n \"12 345\"","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.validate_number_system/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :latn\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :default\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :unknown\n {:error,\n {Cldr.UnknownNumberSystemError, \"The number system :unknown is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"zz\", :default\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal","doc":"Implements cardinal plural rules for numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#available_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule 0, \"fr\"\n :one\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule 0, \"en\"\n :other","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"Pluralize a number using cardinal plural rules\nand a substitution map.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"* `number` is an integer, float or Decimal\n\n* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Cardinal.Cardinal.plural_rule/3`.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1, \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 22, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(1), \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\", two: \"two\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"few\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html"},{"type":"module","title":"Number Pattern Examples - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#module-number-pattern-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1-returns"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for!/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Format.Number.Format.all_formats_for/1` for further information.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1-returns"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.currency_spacing/2","doc":"Returns the currency space for a given locale and\nnumber system.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#currency_spacing/2"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list/0","doc":"#=> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"Returns the list of decimal formats for a configured locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"Returns the default grouping for a locale as a map.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"* `{:ok, grouping}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for(:en)\n {:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"Returns the default grouping for a locale\nor raises on error.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"* `grouping` as a map or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!(:en)\n %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"Return the predfined formats for a given `locale` and `number_system`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system` is any valid number system or number system type returned\n by `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.formats_for!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"Returns the minimum grouping digits for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `{:ok, minumum_digits}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for(\"en\")\n {:ok, 1}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"Returns the minimum grouping digits for a locale\nor raises on error.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `minumum_digits` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!(\"en\")\n 1","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.metadata!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#metadata!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.to_string/3","doc":"Formats a number according to a decimal format string.","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.to_string/3","doc":"* `number` is an integer, float or Decimal\n\n* `format` is a format string. See `Bonfire.Common.Localise.Cldr.Number` for further information.\n\n* `options` is a map of options. See `Bonfire.Common.Localise.Cldr.Number.to_string/2`\n for further information.","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#to_string/3-arguments"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal","doc":"Implements ordinal plural rules for numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#available_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule 0, \"fr\"\n :other\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule 1, \"en\"\n :one","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize/3","doc":"Pluralize a number using ordinal plural rules\nand a substitution map.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Ordinal.Ordinal.plural_rule/3`.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1, :en, %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 22, :en, %{one: \"one\", two: \"two\", other: \"other\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","doc":"Implements plural rules for ranges","ref":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.plural_rule :other, :few, \"ar\"\n :few","ref":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Symbol","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_decimal_symbols/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_decimal_symbols_class/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_grouping_symbols/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_grouping_symbols_class/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1-options"},{"type":"function","title":"Example: - Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1","doc":"iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/2"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.System","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_for/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_for/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"th\", :latn\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"en\", :default\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"he\", :traditional\n {:ok, %{rules: \"hebrew\", type: :algorithmic}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"en\", :native\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_for/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"Returns the number system from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"* A number system name as an atom","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale \"en-US-u-nu-thai\"\n :thai\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale \"en-US\"\n :latn","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for \"en\"\n {:ok, [:latn]}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_types_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_types_for/1"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"en\"\n {:ok, %{default: :latn, native: :latn}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"th\"\n {:ok, %{default: :latn, native: :thai}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_systems_for!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_systems_like/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_like/2"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_number_systems/0` or a number system type\n returned by `Bonfire.Common.Localise.Cldr.known_number_system_types/0`\n\n* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#system_name_from/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.system_name_from/2","doc":"ex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:default, \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(\"latn\", \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:native, \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#system_name_from/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.to_system/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123456, :hebr\n {:ok, \"קכ״ג׳תנ״ו\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hans\n {:ok, \"一百二十三\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hant\n {:ok, \"一百二十三\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hansfin\n {:ok, \"壹佰贰拾叁\"}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_number_systems/0` or a number system type\n returned by `Bonfire.Common.Localise.Cldr.known_number_system_types/0`\n\nSee `Bonfire.Common.Localise.Cldr.Number.System.to_system/2` for further\ninformation.","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.to_system!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hans\n \"一百二十三\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hant\n \"一百二十三\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hansfin\n \"壹佰贰拾叁\"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html"},{"type":"module","title":"Configuring precompilation of digit transliterations - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#module-configuring-precompilation-of-digit-transliterations"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate/3","doc":"* `sequence` is the string to be transliterated.\n\n* `locale` is any known locale, defaulting to `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`. Also see\n`Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1`.","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\")\n \"123556\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123,556.000\", \"fr\", :default)\n \"123 556,000\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :default)\n \"123556\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", \"thai\")\n \"๑๒๓๕๕๖\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :native)\n \"๑๒๓๕๕๖\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"Some number is: 123556\", \"th\", \"thai\")\n \"Some number is: ๑๒๓๕๕๖\"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate!/3"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate_digits/3"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate_digits/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate_digits \"٠١٢٣٤٥٦٧٨٩\", :arab, :latn\n \"0123456789\"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate_digits/3-example"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :roman)\n {:ok, \"CXXIII\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.georgian/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#georgian/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.georgian/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#georgian/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#rule_sets/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.zz_default/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#zz_default/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.zz_default/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#zz_default/2"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets(:en)\n [:digits_ordinal]\n\n iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :ordinal)\n {:ok, \"123rd\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_feminine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_feminine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_indicator_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_indicator_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine_adjective/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine_adjective/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.dord_femabbrev/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#dord_femabbrev/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.dord_mascabbrev/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#dord_mascabbrev/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#rule_sets/1"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :spellout)\n {:ok, \"one hundred twenty-three\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.after_hundred/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#after_hundred/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.after_thousand_or_more/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#after_thousand_or_more/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.and/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#and/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.and_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#and_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_f/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_f/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.commas/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#commas/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.commas_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#commas_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_un/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_un/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_une/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_une/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_unieme/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_unieme/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.lenient_parse/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#lenient_parse/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.mille_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#mille_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_no_final/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_no_final/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_a_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_a_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_i_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_i_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_o_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_o_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.r2d_year/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#r2d_year/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#rule_sets/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_feminine_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_feminine_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_masculine_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_masculine_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_leading/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_leading/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_year/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_cont/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_cont/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_conts/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_conts/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_adjective/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_adjective/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_cont/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_cont/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_conts/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_conts/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_f/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_f/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.teen/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#teen/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.th/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#th/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.tieth/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#tieth/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.x_ty/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#x_ty/2"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Territory","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_styles/0","doc":"Returns a list of available styles.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_styles/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_styles/0","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.available_styles()\n [:short, :standard, :variant]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_styles/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_subdivisions/1","doc":"Returns the available territory subdivisions for a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions(\"en\")\n [:ad02, :ad03, :ad04, :ad05, :ad06, :ad07, :ad08, ...]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions()\n []\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_territories/1","doc":"Returns the available territories for a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_territories/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_territories/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.available_territories()\n [:\"001\", :\"002\", :\"003\", :\"005\", :\"009\", :\"011\", :\"013\", :\"014\", :\"015\", :\"017\",\n :\"018\", :\"019\", :\"021\", :\"029\", :\"030\", :\"034\", :\"035\", :\"039\", :\"053\", :\"054\",\n :\"057\", :\"061\", :\"142\", :\"143\", :\"145\", :\"150\", :\"151\", :\"154\", :\"155\", :\"202\",\n :\"419\", :AC, :AD, :AE, :AF, :AG, :AI, :AL, :AM, :AO, :AQ, :AR, :AS, :AT, :AU,\n :AW, :AX, :AZ, :BA, :BB, ...]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_territories(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_territories/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.children/2","doc":"Lists children(s) for the given territory code.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.children/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.children(:EU)\n {:ok,\n [:AT, :BE, :CY, :CZ, :DE, :DK, :EE, :ES, :FI, :FR, :GR, :HR, :HU, :IE,\n :IT, :LT, :LU, :LV, :MT, :NL, :PL, :PT, :SE, :SI, :SK, :BG, :RO]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.children(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.children(:GB)\n {:error, {Cldr.UnknownParentError, \"The territory :GB has no children\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.children!/2","doc":"The same as `children/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.children!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.children!(:EU)\n [:AT, :BE, :CY, :CZ, :DE, :DK, :EE, :ES, :FI, :FR, :GR, :HR, :HU, :IE, :IT,\n :LT, :LU, :LV, :MT, :NL, :PL, :PT, :SE, :SI, :SK, :BG, :RO]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.contains?/2","doc":"Checks relationship between two territories, where the first argument is the `parent` and second the `child`.\nReturns `true` if successful, otherwise `false`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#contains?/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.contains?/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.contains?(:EU, :DK)\n true\n\n iex> Bonfire.Common.Localise.Cldr.Territory.contains?(:DK, :EU)\n false","ref":"Bonfire.Common.Localise.Cldr.Territory.html#contains?/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.country_codes/1","doc":"Returns a list of country codes.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#country_codes/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.country_codes/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.country_codes()\n [:AD, :AE, :AF, :AG, :AI, :AL, :AM, :AO, :AR, :AS, :AT, :AU, :AW,\n :AX, :AZ, :BA, :BB, :BD, :BE, :BF, :BG, :BH, :BI, :BJ, :BL, :BM,\n :BN, :BO, :BQ, :BR, :BS, :BT, :BV, :BW, :BY, :BZ, :CA, :CC, :CD,\n :CF, :CG, :CH, :CI, :CK, :CL, :CM, :CN, :CO, :CR, :CU, ...]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#country_codes/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_language_tag/2","doc":"Localized string for the given `LanguageTag.t`.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_language_tag/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale())\n {:ok, \"world\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: :short])\n {:error, {Cldr.UnknownStyleError, \"The style :short is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: :ZZZ])\n {:error, {Cldr.UnknownStyleError, \"The style :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: \"ZZZ\"])\n {:error, {Cldr.UnknownStyleError, \"The style \\\"ZZZ\\\" is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_language_tag!/2","doc":"The same as `from_language_tag/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_language_tag!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag!(Cldr.get_locale())\n \"world\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code/2","doc":"Localized string for the given subdivision code.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"en\")\n {:ok, \"Cumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"pl\")\n {:ok, \"Kumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"bs\")\n {:error, {Cldr.UnknownSubdivisionError, \"No subdivision translation for :gbcma could be found in locale :bs\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"invalid\", locale: \"en\")\n {:error, {Cldr.UnknownTerritoryError, \"The territory \\\"invalid\\\" is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", [locale: :zzz])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", [locale: \"zzz\"])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!/2","doc":"The same as `from_subdivision_code/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!(\"gbcma\", locale: \"en\")\n \"Cumbria\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!(\"gbcma\", locale: \"pl\")\n \"Kumbria\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_territory_code/2","doc":"Localized string for the given territory code.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_territory_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB)\n {:ok, \"United Kingdom\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: :short])\n {:ok, \"UK\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: :ZZZ])\n {:error, {Cldr.UnknownStyleError, \"The style :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: \"ZZZ\"])\n {:error, {Cldr.UnknownStyleError, \"The style \\\"ZZZ\\\" is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: \"pt\"])\n {:ok, \"Reino Unido\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: :zzz])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: \"zzz\"])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_territory_code!/2","doc":"The same as `from_territory_code/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_territory_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB)\n \"United Kingdom\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB, [style: :short])\n \"UK\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB, [locale: \"pt\"])\n \"Reino Unido\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.info/1","doc":"Maps territory info for the given territory code.\nReturns `{:ok, map}` if successful, otherwise `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.info/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.info(:GB)\n {:ok,\n %{\n currency: [GBP: %{from: ~D[1694-07-27]}],\n gdp: 2925000000000,\n language_population: %{\n \"ar\" => %{population_percent: 0.3},\n \"bn\" => %{population_percent: 0.4},\n \"cy\" => %{official_status: \"official_regional\", population_percent: 1.3},\n \"de\" => %{population_percent: 9},\n \"en\" => %{official_status: \"official\", population_percent: 98},\n \"es\" => %{population_percent: 8},\n \"fr\" => %{population_percent: 23},\n \"ga\" => %{official_status: \"official_regional\", population_percent: 0.15},\n \"gd\" => %{\n official_status: \"official_regional\",\n population_percent: 0.11,\n writing_percent: 5\n },\n \"gu\" => %{population_percent: 2.9},\n \"it\" => %{population_percent: 0.2},\n \"kw\" => %{population_percent: 0.003},\n \"lt\" => %{population_percent: 0.2},\n \"pa\" => %{population_percent: 3.6},\n \"pl\" => %{population_percent: 4},\n \"pt\" => %{population_percent: 0.2},\n \"sco\" => %{population_percent: 2.5, writing_percent: 5},\n \"so\" => %{population_percent: 0.2},\n \"ta\" => %{population_percent: 3.2},\n \"tr\" => %{population_percent: 0.2},\n \"ur\" => %{population_percent: 3.5},\n \"zh-Hant\" => %{population_percent: 0.3},\n \"en-Shaw\" => %{population_percent: 0}\n },\n literacy_percent: 99,\n measurement_system: %{\n default: :uksystem,\n paper_size: :a4,\n temperature: :uksystem\n },\n population: 65761100\n }}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.info!/1","doc":"The same as `info/1`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info!/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.info!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.info!(:GB)\n %{\n currency: [GBP: %{from: ~D[1694-07-27]}],\n gdp: 2925000000000,\n language_population: %{\n \"ar\" => %{population_percent: 0.3},\n \"bn\" => %{population_percent: 0.4},\n \"cy\" => %{official_status: \"official_regional\", population_percent: 1.3},\n \"de\" => %{population_percent: 9},\n \"en\" => %{official_status: \"official\", population_percent: 98},\n \"es\" => %{population_percent: 8},\n \"fr\" => %{population_percent: 23},\n \"ga\" => %{official_status: \"official_regional\", population_percent: 0.15},\n \"gd\" => %{\n official_status: \"official_regional\",\n population_percent: 0.11,\n writing_percent: 5\n },\n \"gu\" => %{population_percent: 2.9},\n \"it\" => %{population_percent: 0.2},\n \"kw\" => %{population_percent: 0.003},\n \"lt\" => %{population_percent: 0.2},\n \"pa\" => %{population_percent: 3.6},\n \"pl\" => %{population_percent: 4},\n \"pt\" => %{population_percent: 0.2},\n \"sco\" => %{population_percent: 2.5, writing_percent: 5},\n \"so\" => %{population_percent: 0.2},\n \"ta\" => %{population_percent: 3.2},\n \"tr\" => %{population_percent: 0.2},\n \"ur\" => %{population_percent: 3.5},\n \"zh-Hant\" => %{population_percent: 0.3},\n \"en-Shaw\" => %{population_percent: 0}\n },\n literacy_percent: 99,\n measurement_system: %{\n default: :uksystem,\n paper_size: :a4,\n temperature: :uksystem\n },\n population: 65761100\n }","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info!/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.inverted_subdivisions/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#inverted_subdivisions/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.inverted_territories/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#inverted_territories/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_subdivisions/1","doc":"Returns a map of all known territory subdivisions in a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions(\"en\")\n %{\n \"ad02\" => \"Canillo\",\n \"ad03\" => \"Encamp\",\n \"ad04\" => \"La Massana\",\n \"ad05\" => \"Ordino\",\n \"ad06\" => \"Sant Julià de Lòria\",\n \"ad07\" => \"Andorra la Vella\",\n ...\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions()\n %{}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_territories/1","doc":"Returns a map of all known territories in a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territories/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_territories/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_territories()\n %{SN: %{standard: \"Senegal\"}, \"061\": %{standard: \"Polynesia\"},\n BH: %{standard: \"Bahrain\"}, TM: %{standard: \"Turkmenistan\"},\n \"009\": %{standard: \"Oceania\"}, CW: %{standard: \"Curaçao\"},\n FR: %{standard: \"France\"}, TN: %{standard: \"Tunisia\"},\n FI: %{standard: \"Finland\"}, BF: %{standard: \"Burkina Faso\"},\n \"155\": %{standard: \"Western Europe\"}, GL: %{standard: \"Greenland\"},\n VI: %{standard: \"U.S. Virgin Islands\"}, ZW: %{standard: \"Zimbabwe\"},\n AR: %{standard: \"Argentina\"}, SG: %{standard: \"Singapore\"},\n SZ: %{standard: \"Swaziland\"}, ID: %{standard: \"Indonesia\"},\n NR: %{standard: \"Nauru\"}, RW: %{standard: \"Rwanda\"},\n TR: %{standard: \"Turkey\"}, IS: %{standard: \"Iceland\"},\n ME: %{standard: \"Montenegro\"}, AW: %{standard: \"Aruba\"},\n PY: %{standard: \"Paraguay\"}, \"145\": %{standard: \"Western Asia\"},\n CG: %{standard: \"Congo - Brazzaville\", variant: \"Congo (Republic)\"},\n LT: %{standard: \"Lithuania\"}, SA: %{standard: \"Saudi Arabia\"},\n MZ: %{standard: \"Mozambique\"}, NU: %{standard: \"Niue\"},\n NG: %{standard: \"Nigeria\"}, CK: %{standard: \"Cook Islands\"},\n ZM: %{standard: \"Zambia\"}, LK: %{standard: \"Sri Lanka\"},\n UY: %{standard: \"Uruguay\"}, YE: %{standard: \"Yemen\"},\n \"011\": %{standard: \"Western Africa\"},\n CC: %{standard: \"Cocos (Keeling) Islands\"}, BY: %{standard: \"Belarus\"},\n IL: %{standard: \"Israel\"}, KY: %{standard: \"Cayman Islands\"},\n GN: %{standard: \"Guinea\"}, VN: %{standard: \"Vietnam\"},\n PE: %{standard: \"Peru\"}, HU: %{standard: \"Hungary\"},\n HN: %{standard: \"Honduras\"}, GI: %{standard: \"Gibraltar\"},\n \"142\": %{standard: \"Asia\"}, \"029\": %{...}, ...}\n\n => Bonfire.Common.Localise.Cldr.Territory.known_territories(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \"zzz\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territories/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions/1","doc":"Returns a list of subdivisions of a given territory.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territory_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:GB)\n {:ok, [\"gbabc\", \"gbabd\", \"gbabe\", \"gbagb\", \"gbagy\", \"gband\", \"gbann\",\n \"gbans\", \"gbbas\", \"gbbbd\", \"gbbdf\", \"gbbdg\", \"gbben\", \"gbbex\", \"gbbfs\",\n \"gbbge\", \"gbbgw\", \"gbbir\", \"gbbkm\", \"gbbmh\", \"gbbne\", \"gbbnh\", \"gbbns\",\n \"gbbol\", \"gbbpl\", \"gbbrc\", \"gbbrd\", \"gbbry\", \"gbbst\", \"gbbur\", \"gbcam\",\n \"gbcay\", \"gbcbf\", \"gbccg\", \"gbcgn\", \"gbche\", \"gbchw\", \"gbcld\", \"gbclk\",\n \"gbcma\", \"gbcmd\", \"gbcmn\", \"gbcon\", \"gbcov\", \"gbcrf\", \"gbcry\", \"gbcwy\",\n \"gbdal\", \"gbdby\", \"gbden\", ...]}\n\n => Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:AI)\n {:ok, nil}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territory_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.parent/2","doc":"Lists parent(s) for the given territory code.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.parent/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.parent(:GB)\n {:ok, [:\"154\", :UN]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.parent(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.parent(Cldr.get_locale())\n {:error, {Cldr.UnknownChildrenError, \"The territory :\\\"001\\\" has no parent(s)\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.parent!/2","doc":"The same as `parent/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.parent!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.parent!(:GB)\n [:\"154\", :UN]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases/0","doc":"Returns a map of available subdivision aliases.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#subdivision_aliases/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases/0","doc":"iex#> Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases()\n %{:uspr => :PR}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#subdivision_aliases/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_code/2","doc":"A helper method to get a territory's currency code\nif a territory has multiply currencies then the oldest active currency is returned.\nReturns `{:ok, code}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code(:US)\n {:ok, :USD}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code(\"cu\")\n {:ok, :CUP}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_code!/2","doc":"The same as `to_currency_code/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(:US)\n :USD\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(:US, as: :charlist)\n ~c\"USD\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(\"PS\")\n :ILS\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(\"PS\", as: :binary)\n \"ILS\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_codes/2","doc":"A helper method to get a territory's currency codes.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_codes/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes(:US)\n {:ok, [:USD]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes(\"ht\")\n {:ok, [:USD, :HTG]}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!/2","doc":"The same as `to_currency_codes/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(:US)\n [:USD]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(:US, as: :charlist)\n [~c\"USD\"]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(\"PS\")\n [:ILS, :JOD]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(\"PS\", as: :binary)\n [\"ILS\", \"JOD\"]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag/1","doc":"Unicode flag for the given territory code.\nReturns `{:ok, flag}` if successful, otherwise `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag(:US)\n {:ok, \"🇺🇸\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag(:EZ)\n {:error, {Cldr.UnknownFlagError, \"The territory :EZ has no flag\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!/1","doc":"The same as `to_unicode_flag/1`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag!/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!(:US)\n \"🇺🇸\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag!/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_language_tag/2","doc":"Translate a LanguageTag.t into a localized string from one locale to another.\nReturns `{:ok, result}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_language_tag/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag(Cldr.get_locale())\n {:ok, \"world\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag(Cldr.get_locale(), [locale: Cldr.Locale.new!(\"pt\", TestBackend.Cldr)])\n {:ok, \"Mundo\"}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!/2","doc":"The same as `translate_language_tag/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!(Cldr.get_locale())\n \"world\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!(Cldr.get_locale(), [locale: Cldr.Locale.new!(\"pt\", TestBackend.Cldr)])\n \"Mundo\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_subdivision/4","doc":"Translate a localized string from one locale to another.\nReturns `{:ok, result}` if successful, otherwise `{:error, reason}`.\n\n* `to_locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_subdivision/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"pl\")\n {:ok, \"Kumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"bs\")\n {:error, {Cldr.UnknownSubdivisionError, \"No subdivision translation for :gbcma could be found in locale :bs\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", :zzz)\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!/4","doc":"The same as `translate_subdivision/3`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision!/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!(\"Cumbria\", \"en\", \"pl\")\n \"Kumbria\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!(\"Kumbria\", \"pl\", \"en\")\n \"Cumbria\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision!/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_territory/4","doc":"Translate a localized string from one locale to another.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `to_locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_territory/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Reino Unido\", \"pt\")\n {:ok, \"United Kingdom\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"United Kingdom\", \"en\", \"pt\")\n {:ok, \"Reino Unido\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Reino Unido\", :zzz)\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"United Kingdom\", \"en\", \"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Westworld\", \"en\", \"pt\")\n {:error, {Cldr.UnknownTerritoryError, \"No territory translation for \\\"Westworld\\\" could be found in locale :en\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_territory!/4","doc":"The same as `translate_territory/3`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory!/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_territory!/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"Reino Unido\", \"pt\")\n \"United Kingdom\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"United Kingdom\", \"en\", \"pt\")\n \"Reino Unido\"\n\n #=> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"Westworld\", \"en\", \"pt\")\n ** (Cldr.UnknownTerritoryError) No territory translation for \"Westworld\" could be found in locale \"en\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory!/4-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Time","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"Formats a time according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `{:ok, formatted_time}` or\n\n* `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-returns"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `time` is a `t:Time.t/0` struct or any map that contains\n one or more of the keys `:hour`, `:minute`, `:second` and optionally `:microsecond`,\n `:time_zone`, `:zone_abbr`, `:utc_offset` and `:std_offset.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full times (that is,\n times having `:hour`, `:minute` and `:second` fields). The\n default for partial times is to derive a candidate format from the time and\n find the best match from the formats returned by\n `Cldr.Time.available_formats/2`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`. The default is\n `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits should\n be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Time.available_formats/3`\n to see which formats have these variants.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217])\n {:ok, \"7:35:13 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :short)\n {:ok, \"7:35 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :short, period: :variant)\n {:ok, \"7:35 am\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :medium, locale: :fr)\n {:ok, \"07:35:13\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :medium)\n {:ok, \"7:35:13 AM\"}\n\n iex> {:ok, date_time} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(date_time, format: :long)\n {:ok, \"11:59:59 PM UTC\"}\n\n # A partial time with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(%{hour: 23, minute: 11})\n {:ok, \"11:11 PM\"}\n\n # Sometimes the available time fields can't be mapped to an available\n # CLDR defined format.\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(%{minute: 11})\n {:error,\n {Cldr.DateTime.UnresolvedFormat, \"No available format resolved for :m\"}}","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"Formats a time according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nor raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `time` is a `t:Time.t/0` struct or any map that contains\n one or more of the keys `:hour`, `:minute`, `:second` and optionally `:microsecond`,\n `:time_zone`, `:zone_abbr`, `:utc_offset` and `:std_offset.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full times (that is,\n times having `:hour`, `:minute` and `:second` fields). The\n default for partial times is to derive a candidate format from the time and\n find the best match from the formats returned by\n `Cldr.Time.available_formats/2`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`. The default is\n `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits should\n be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Time.available_formats/3`\n to see which formats have these variants.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `formatted_time_string` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217])\n \"7:35:13 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :short)\n \"7:35 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :short, period: :variant)\n \"7:35 am\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :medium, locale: :fr)\n \"07:35:13\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :medium)\n \"7:35:13 AM\"\n\n iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.Time.to_string! datetime, format: :long\n \"11:59:59 PM UTC\"\n\n # A partial time with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(%{hour: 23, minute: 11})\n \"11:11 PM\"","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Time.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Cldr.Interval.to_string/3` and `Cldr.Time.Interval.to_string/3`.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.do_to_string/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#do_to_string/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two times.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.time` type.\n\n* `to` is any map that conforms to the\n `Calendar.time` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :time]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone time.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:time`, `:zone`,\n and `:flex`. The default is `:time`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configured locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n time is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :short\n {:ok, \"10 – 10 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :medium\n {:ok, \"10:00 – 10:03 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :long\n {:ok, \"10:00 – 10:03 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex\n {:ok, \"10:00 – 10:03 in the morning\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :flex\n {:ok, \"12:00 – 10:00 in the morning\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :zone\n {:ok, \"12:00 – 10:00 AM Etc/UTC\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex, locale: \"th\"\n {:ok, \"10:00 – 10:03 ในตอนเช้า\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], nil\n {:ok, \"10:00:00 AM –\"}","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two times or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.time` type.\n\n* `to` is any map that conforms to the\n `Calendar.time` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :time]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone time.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:time`, `:zone`,\n and `:flex`. The default is `:time`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configured locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n time is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :short\n \"10 – 10 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :medium\n \"10:00 – 10:03 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :long\n \"10:00 – 10:03 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex\n \"10:00 – 10:03 in the morning\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :flex\n \"12:00 – 10:00 in the morning\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :zone\n \"12:00 – 10:00 AM Etc/UTC\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex, locale: \"th\"\n \"10:00 – 10:03 ในตอนเช้า\"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Unit","doc":"Supports the CLDR Units definitions which provide for the localization of many\nunit types.","ref":"Bonfire.Common.Localise.Cldr.Unit.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.add/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#add/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.add!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#add!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.compatible?/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#compatible?/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.convert/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#convert/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.convert!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#convert!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.decompose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#decompose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.default_gender/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#default_gender/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.default_style/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#default_style/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"Returns the localized display name\nfor a unit.\n\nThe returned text is generally suitable\nfor including in UI elements such as\nselection boxes.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"* `unit` is any `t:Cldr.Unit` or any\n unit name returned by `Cldr.Unit.known_units/0`.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`.\n\n* `:style` is one of those returned by `Cldr.Unit.available_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter\n \"liters\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter, locale: \"fr\"\n \"litres\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter, locale: \"fr\", style: :short\n \"l\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.div/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#div/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.div!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#div!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.grammatical_features/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#grammatical_features/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.grammatical_gender/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#grammatical_gender/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_styles/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_unit_categories/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_unit_categories/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_units/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_units/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.localize/1","doc":"Localizes a unit according to the current\nprocesses locale and backend.\n\nThe current process's locale is set with\n`Cldr.put_locale/1`.\n\nSee `Cldr.Unit.localize/3` for further\ndetails.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"Localizes a unit according to a territory\n\nA territory can be derived from a `t:Cldr.Locale.locale_name`\nor `t:Cldr.LangaugeTag`.\n\nUse this function if you have a unit which\nshould be presented in a user interface using\nunits relevant to the audience. For example, a\nunit `#Cldr.Unit100, :meter>` might be better\npresented to a US audience as `#Cldr.Unit<328, :foot>`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `backend.get_locale/0`\n\n* `:territory` is any valid territory code returned by\n `Cldr.known_territories/0`. The default is the territory defined\n as part of the `:locale`. The option `:territory` has a precedence\n over the territory in a locale.\n\n* `:usage` is the way in which the unit is intended\n to be used. The available `usage` varyies according\n to the unit category. See `Cldr.Unit.preferred_units/3`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"iex> unit = Cldr.Unit.new!(1.83, :meter)\n iex> Bonfire.Common.Localise.Cldr.Unit.localize(unit, usage: :person_height, territory: :US)\n [\n Cldr.Unit.new!(:foot, 6, usage: :person_height),\n Cldr.Unit.new!(:inch, \"0.04724409448818897637795275598\", usage: :person_height)\n ]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system?/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system?/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for_territory/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for_territory/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for_territory/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for_territory/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_systems_for_unit/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_systems_for_unit/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.mult/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#mult/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.mult!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#mult!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.new/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#new/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.new!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#new!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"Parse a string to create a new unit.\n\nThis function attempts to parse a string\ninto a `number` and `unit type`. If successful\nit attempts to create a new unit using\n`Cldr.Unit.new/3`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `unit string` is any string to be parsed and if\n possible used to create a new `t:Cldr.Unit`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `{:ok, unit}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1kg\"\n Cldr.Unit.new(1, :kilogram)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1 tages\", locale: \"de\"\n Cldr.Unit.new(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1 tag\", locale: \"de\"\n Cldr.Unit.new(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse(\"42 millispangels\")\n {:error, {Cldr.UnknownUnitError, \"Unknown unit was detected at \\\"spangels\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"Parse a string to create a new unit or\nraises an exception.\n\nThis function attempts to parse a string\ninto a `number` and `unit type`. If successful\nit attempts to create a new unit using\n`Cldr.Unit.new/3`.\n\nThe parsed `unit type` is un-aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `unit string` is any string to be parsed and if\n possible used to create a new `t:Cldr.Unit`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `unit` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse! \"1kg\"\n Cldr.Unit.new!(1, :kilogram)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse! \"1 tages\", locale: \"de\"\n Cldr.Unit.new!(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse!(\"42 candela per lux\")\n Cldr.Unit.new!(42, \"candela per lux\")\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse!(\"42 millispangels\")\n ** (Cldr.UnknownUnitError) Unknown unit was detected at \"spangels\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"Parse a string to find a matching unit-atom.\n\nThis function attempts to parse a string and\nextract the `unit type`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `unit_name_string` is any string to be parsed and converted into a `unit type`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\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\n* `:only` is a unit category or unit, or a list of unit categories and units.\n The parsed unit must match one of the categories or units in order to\n be valid. This is helpful when disambiguating parsed units. For example,\n parsing \"w\" could be either `:watt` or `:weeks`. Specifying `only: :duration`\n would return `:weeks`. Specifying `only: :power` would return `:watt`\n\n* `:except` is the oppostte of `:only`. The parsed unit must *not*\n match the specified unit or category, or unit categories and units.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `{:ok, unit_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* When both `:only` and `:except` options are passed, both\n conditions must be true in order to return a parsed result.\n\n* Only units returned by `Cldr.Unit.known_units/0` can be\n used in the `:only` and `:except` filters.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"kg\"\n {:ok, :kilogram}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"w\"\n {:ok, :watt}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"w\", only: :duration\n {:ok, :week}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"m\", only: [:year, :month, :day]\n {:ok, :month}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"tages\", locale: \"de\"\n {:ok, :day}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"tag\", locale: \"de\"\n {:ok, :day}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name(\"millispangels\")\n {:error, {Cldr.UnknownUnitError, \"Unknown unit was detected at \\\"spangels\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"Parse a string to find a matching unit-atom.\n\nThis function attempts to parse a string and\nextract the `unit type`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `unit_name_string` is any string to be parsed and converted into a `unit type`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\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\n* `:only` is a unit category or unit, or a list of unit categories and units.\n The parsed unit must match one of the categories or units in order to\n be valid. This is helpful when disambiguating parsed units. For example,\n parsing \"w\" could be either `watts` or `:week`. Specifying `only: :duration`\n would return `:week`. Specifying `only: :power` would return `:watts`\n\n* `:except` is the oppostte of `:only`. The parsed unit must *not*\n match the specified unit or category, or unit categories and units.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `unit_name` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* When both `:only` and `:except` options are passed, both\n conditions must be true in order to return a parsed result.\n\n* Only units returned by `Cldr.Unit.known_units/0` can be\n used in the `:only` and `:except` filters.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"kg\"\n :kilogram\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"w\"\n :watt\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"w\", only: :duration\n :week\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"m\", only: [:year, :month, :day]\n :month\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"tages\", locale: \"de\"\n :day\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"tag\", locale: \"de\"\n :day\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!(\"millispangels\")\n ** (Cldr.UnknownUnitError) Unknown unit was detected at \"spangels\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"Returns a list of the preferred units for a given\nunit, locale, use case and scope.\n\nThe units used to represent length, volume and so on\ndepend on a given territory, measurement system and usage.\n\nFor example, in the US, people height is most commonly\nreferred to in `inches`, or informally as `feet and inches`.\nIn most of the rest of the world it is `centimeters`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`.\n\n* `backend` is any Cldr backend module. That is, any module\n that includes `use Cldr`. The default is `Cldr.default_backend/0`\n\n* `options` is a keyword list of options or a\n `Cldr.Unit.Conversion.Options` struct. The default\n is `[]`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `:usage` is the unit usage. for example `;person` for a unit\n type of length. The available usage for a given unit category can\n be seen with `Cldr.Unit.unit_category_usage/0`. The default is `nil`\n\n* `:scope` is either `:small` or `nil`. In some usage, the units\n used are different when the unit size is small. It is up to the\n developer to determine when `scope: :small` is appropriate.\n\n* `:alt` is either `:informal` or `nil`. Like `:scope`, the units\n in use depend on whether they are being used in a formal or informal\n context.\n\n* `:locale` is any locale returned by `Cldr.validate_locale/2`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `{:ok, unit_list, formatting_options}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"`formatting_options` is a keyword list of options\nthat can be passed to `Cldr.Unit.to_string/3`. Its\nprimary intended usage is for localizing a unit that\ndecomposes into more than one unit (for example when\n2 meters might become 6 feet 6 inches.) In such\ncases, the last unit in the list (in this case the\ninches) is formatted with the `formatting_options`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"iex> meter = Cldr.Unit.new!(:meter, 1)\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :person_height\n {:ok, [:foot, :inch], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :person\n {:ok, [:inch], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-AU\", usage: :person\n {:ok, [:centimeter], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :road\n {:ok, [:foot], [round_nearest: 1]}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-AU\", usage: :road\n {:ok, [:meter], [round_nearest: 1]}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"Returns a list of the preferred units for a given\nunit, locale, use case and scope.\n\nThe units used to represent length, volume and so on\ndepend on a given territory, measurement system and usage.\n\nFor example, in the US, people height is most commonly\nreferred to in `inches`, or informally as `feet and inches`.\nIn most of the rest of the world it is `centimeters`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`.\n\n* `backend` is any Cldr backend module. That is, any module\n that includes `use Cldr`. The default is `Cldr.default_backend/0`\n\n* `options` is a keyword list of options or a\n `Cldr.Unit.Conversion.Options` struct. The default\n is `[]`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `:usage` is the unit usage. for example `;person` for a unit\n type of length. The available usage for a given unit category can\n be seen with `Cldr.Unit.unit_category_usage/0`. The default is `nil`\n\n* `:scope` is either `:small` or `nil`. In some usage, the units\n used are different when the unit size is small. It is up to the\n developer to determine when `scope: :small` is appropriate.\n\n* `:alt` is either `:informal` or `nil`. Like `:scope`, the units\n in use depend on whether they are being used in a formal or informal\n context.\n\n* `:locale` is any locale returned by `Cldr.validate_locale/2`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `unit_list` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"iex> meter = Cldr.Unit.new!(:meter, 2)\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-US\", usage: :person_height\n [:foot, :inch]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-AU\", usage: :person\n [:centimeter]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-US\", usage: :road\n [:foot]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-AU\", usage: :road\n [:meter]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#styles/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.sub/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#sub/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.sub!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#sub!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"Formats a number into an iolist according to a unit definition\nfor a locale.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `{:ok, io_list}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist Cldr.Unit.new!(:gallon, 123)\n {:ok, [\"123\", \" gallons\"]}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"Formats a unit using `to_iolist/3` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles/0`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`.\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `io_list` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist! 123, unit: :gallon\n [\"123\", \" gallons\"]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"Formats a number into a string according to a unit definition for a locale.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `{:ok, formatted_string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 123)\n {:ok, \"123 gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1)\n {:ok, \"1 gallon\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"af\"\n {:ok, \"1 gelling\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"af-NA\"\n {:ok, \"1 gelling\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"bs\"\n {:ok, \"1 galon\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :long\n {:ok, \"1 thousand gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :short\n {:ok, \"1K gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234)\n {:ok, \"1,234 megahertz\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234), style: :narrow\n {:ok, \"1,234Mhz\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megabyte, 1234), locale: \"en\", style: :unknown\n {:error, {Cldr.UnknownFormatError, \"The unit style :unknown is not known.\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"Formats a list using `to_string/3` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `formatted_string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 123, unit: :gallon\n \"123 gallons\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 1, unit: :gallon\n \"1 gallon\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 1, unit: :gallon, locale: \"af\"\n \"1 gelling\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.unit_category/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#unit_category/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.unit_strings_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#unit_strings_for/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.validate_style/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#validate_style/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.validate_unit/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#validate_unit/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.value/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#value/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.zero/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#zero/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.zero?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#zero?/1"},{"type":"module","title":"Bonfire.Common.Localise.Gettext","doc":"Default Gettext module\nIt is recommended to use the more convenient macros in `Bonfire.Common.Localise.Gettext.Helpers` instead.","ref":"Bonfire.Common.Localise.Gettext.html"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dgettext/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dgettext/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dgettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dngettext/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dngettext/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dngettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpgettext/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpgettext/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpgettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpngettext/6","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpngettext/6"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpngettext_noop/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext_comment/1","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext_comment/1"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext_noop/1","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext_noop/1"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_bindings/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_plural_translation/7","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_translation/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_translation/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.ngettext/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#ngettext/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.ngettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pgettext/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pgettext/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pgettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pngettext/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pngettext/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pngettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pngettext_noop/3"},{"type":"module","title":"Bonfire.Common.Localise.Gettext.Helpers","doc":"A module providing Internationalization with a gettext-based API.\n\nBy using [Gettext](https://hexdocs.pm/gettext),\nyour module gains a set of macros for translations, for example:\n\n\n# Simple translation\n\n iex> l(\"Hello\")\n \"Hello\"\n iex> l(\"Hello %{name}\", name: \"Bookchin\")\n \"Hello Bookchin\"\n iex> l(\"Hi\", [], \"test context\")\n \"Hi\"\n\n\n# Plural translation\n\n iex> lp(\"Hi friend\", \"Hi friends\", 2)\n \"Hi friends\"\n iex> lp(\"Hiya %{user_or_users}\", \"Hiyas %{user_or_users}\", 1, [user_or_users: \"Bookchin\"], \"test context\")\n \"Hiya Bookchin\"\n\nSee the [Gettext Docs](https://hexdocs.pm/gettext) for details.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"Translates a string with optional bindings, context, and domain.\n\nThis macro provides translation capabilities based on Gettext. It determines the appropriate domain and context for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"iex> l(\"Hello\")\n \"Hello\"\n iex> l(\"Hello %{name}\", name: \"Bookchin\")\n \"Hello Bookchin\"\n iex> l(\"Hi\", [], \"test context\")\n \"Hi\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"* `msgid` - The text or message ID to be translated.\n * `bindings` - (Optional) A list or map of bindings to interpolate in the message.\n * `context` - (Optional) A context for the translation.\n * `domain` - (Optional) A domain for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4-parameters"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"Dynamically localises a text. This function is useful for localising strings only known at runtime (when you can't use the `l` or `lp` macros).","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"iex> localise_dynamic(\"some_message_id\")\n \"some_message_id\"\n iex> localise_dynamic(\"some_message_id\", MyApp.MyModule)\n \"some_message_id\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2-examples"},{"type":"function","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"* `msgid` - The message id to be localized.\n * `caller_module` - (Optional) The module from which the call originates.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2-parameters"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"Localizes a list of strings at compile time.\n\nThis macro evaluates the list of strings and localizes each string based on the domain derived from the caller module. This is useful if you want to provide a list of strings at compile time that will later be used at runtime by `localise_dynamic/2`.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"iex> localise_strings([\"hello\", \"world\"])\n [\"hello\", \"world\"]\n iex> localise_strings([\"hello\", \"world\"], MyApp.MyModule)\n [\"hello\", \"world\"]","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"* `strings` - A list of strings to be localized.\n * `caller_module` - (Optional) The module from which the call originates.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2-parameters"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"Translates a plural text with optional bindings, context, and domain.\n\nThis macro provides plural translation capabilities based on Gettext. It determines the appropriate domain and context for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"iex> lp(\"Hi friend\", \"Hi friends\", 2)\n \"Hi friends\"\n iex> lp(\"Hiya %{user_or_users}\", \"Hiyas %{user_or_users}\", 1, [user_or_users: \"Bookchin\"], \"test context\")\n \"Hiya Bookchin\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"* `msgid` - The singular message id to be translated.\n * `msgid_plural` - The plural message id to be translated.\n * `n` - The number used to determine singular or plural form.\n * `bindings` - (Optional) A list or map of bindings to interpolate in the message.\n * `context` - (Optional) A context for the translation.\n * `domain` - (Optional) A domain for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6-parameters"},{"type":"module","title":"Bonfire.Common.Localise.Gettext.Plural","doc":"Defines a plural forms module for Gettext that uses CLDR plural rules\nhttps://cldr.unicode.org/index/cldr-spec/plural-rules","ref":"Bonfire.Common.Localise.Gettext.Plural.html"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Plural.nplurals/1","doc":"Returns the number of plural forms for a given locale.\n\n* `locale` is either a locale name in the list\n `{:__aliases__, [counter: {Bonfire.Common.Localise.Gettext.Plural, 2}, line: 6, column: 42], [:Bonfire, :Common, :Localise, :Cldr]}.known_locale_names/0` or\n a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`","ref":"Bonfire.Common.Localise.Gettext.Plural.html#nplurals/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Plural.nplurals/1","doc":"iex> Bonfire.Common.Localise.Gettext.Plural.nplurals(\"pl\")\n 4\n\n iex> Bonfire.Common.Localise.Gettext.Plural.nplurals(\"en\")\n 2","ref":"Bonfire.Common.Localise.Gettext.Plural.html#nplurals/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Plural.plural/2","doc":"Returns the plural form of a number for a given\nlocale.\n\n* `locale` is either a locale name in the list `{:__aliases__, [counter: {Bonfire.Common.Localise.Gettext.Plural, 2}, line: 6, column: 42], [:Bonfire, :Common, :Localise, :Cldr]}.known_locale_names/0` or\n a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`","ref":"Bonfire.Common.Localise.Gettext.Plural.html#plural/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Plural.plural/2","doc":"iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 1)\n 0\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 2)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 5)\n 2\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 112)\n 2\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 1)\n 0\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 2)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 112)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en_GB\", 112)\n 1","ref":"Bonfire.Common.Localise.Gettext.Plural.html#plural/2-examples"},{"type":"module","title":"Bonfire.Common.Media","doc":"Helpers for handling images and other media","ref":"Bonfire.Common.Media.html"},{"type":"function","title":"Bonfire.Common.Media.avatar_fallback/1","doc":"","ref":"Bonfire.Common.Media.html#avatar_fallback/1"},{"type":"function","title":"Bonfire.Common.Media.avatar_media/1","doc":"Takes a Media map (or an object containing one) and returns the avatar's URL.","ref":"Bonfire.Common.Media.html#avatar_media/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.avatar_media/1","doc":"iex> avatar_media(%{profile: %{icon: \"http://example.com/avatar.png\"}})\n %Media{...}\n\n iex> avatar_media(%{icon: \"http://example.com/icon.png\"})\n %Media{...}\n\n iex> avatar_media(%{profile: %{icon: %{path: \"http://example.com/path.png\"}}})\n %Media{...}\n\n iex> avatar_media(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#avatar_media/1-examples"},{"type":"function","title":"Bonfire.Common.Media.avatar_url/1","doc":"Takes a Media map (or an object containing one) and returns the avatar's URL.","ref":"Bonfire.Common.Media.html#avatar_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.avatar_url/1","doc":"iex> avatar_url(%{profile: %{icon: %{url: \"http://example.com/avatar.png\"}}})\n \"http://example.com/avatar.png\"\n\n iex> avatar_url(%{icon: %{path: \"http://example.com/path.png\"}})\n \"http://example.com/path.png\"\n\n iex> avatar_url(%{icon_id: \"icon123\"})\n # Assume Bonfire.Files.IconUploader.remote_url/1 returns \"http://example.com/icon123.png\"\n \"http://example.com/icon123.png\"\n\n iex> avatar_url(%{path: \"image.jpg\"})\n # Assume Bonfire.Files.IconUploader.remote_url/1 returns \"http://example.com/image.jpg\"\n \"http://example.com/image.jpg\"\n\n iex> avatar_url(%{icon: \"http://example.com/icon.png\"})\n \"http://example.com/icon.png\"\n\n iex> avatar_url(%{image: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> avatar_url(%{id: \"user123\", shared_user: nil})\n # Assume avatar_fallback/1 returns \"/images/avatar.png\"\n \"/images/avatar.png\"\n\n iex> avatar_url(%{id: \"user456\", shared_user: %{id: \"shared123\"}})\n \"https://picsum.photos/seed/user456/128/128?blur\"\n\n iex> avatar_url(%{id: \"user789\"})\n # Assume avatar_fallback/1 returns \"/images/avatar.png\"\n \"/images/avatar.png\"","ref":"Bonfire.Common.Media.html#avatar_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.banner_fallback/0","doc":"","ref":"Bonfire.Common.Media.html#banner_fallback/0"},{"type":"function","title":"Bonfire.Common.Media.banner_url/1","doc":"Takes a Media map (or an object containing one) and returns the banner's URL.","ref":"Bonfire.Common.Media.html#banner_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.banner_url/1","doc":"iex> banner_url(%{profile: %{image: %{id: \"banner123\"}}})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner123.png\"\n \"http://example.com/banner123.png\"\n\n iex> banner_url(%{image: %{url: \"http://example.com/banner.png\"}})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{image: %{path: \"http://example.com/banner.png\"}})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{path: \"http://example.com/banner.png\"})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{image_id: \"banner456\"})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner456.png\"\n \"http://example.com/banner456.png\"\n\n iex> banner_url(%{image: \"http://example.com/banner.png\"})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{profile: %{image: %{id: \"banner789\"}}})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner789.png\"\n \"http://example.com/banner789.png\"\n\n iex> banner_url(%{nonexistent_key: \"value\"})\n # Assume banner_fallback/0 returns \"/images/bonfires.png\"\n \"/images/bonfires.png\"","ref":"Bonfire.Common.Media.html#banner_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.extract_tar/2","doc":"Returns a map containing all files and their contents from a tar or compressed tar.gz archive.","ref":"Bonfire.Common.Media.html#extract_tar/2"},{"type":"function","title":"Examples - Bonfire.Common.Media.extract_tar/2","doc":"iex> extract_tar(\"path/to/archive.tar.gz\")\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}\n\n iex> extract_tar(\"path/to/archive.tar\", [:memory])\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}\n\n iex> extract_tar(\"path/to/archive.tar\", [:compressed, :memory])\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}","ref":"Bonfire.Common.Media.html#extract_tar/2-examples"},{"type":"function","title":"Bonfire.Common.Media.image_url/1","doc":"Takes a Media map (or an object containing one) and returns the image's URL.","ref":"Bonfire.Common.Media.html#image_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.image_url/1","doc":"iex> image_url(\"http://example.com/image.png\")\n \"http://example.com/image.png\"\n\n iex> image_url(%{media_type: \"text/plain\"})\n nil\n\n iex> image_url(%{profile: %{image: %{url: \"http://example.com/image.png\"}}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{image: %{url: \"http://example.com/image.png\"}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{icon: %{path: \"http://example.com/image.png\"}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{path: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> image_url(%{image_id: \"image123\"})\n # Assume Bonfire.Files.ImageUploader.remote_url/1 returns \"http://example.com/image123.png\"\n \"http://example.com/image123.png\"\n\n iex> image_url(%{image: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> image_url(%{profile: %{image: \"http://example.com/profile_image.png\"}})\n \"http://example.com/profile_image.png\"\n\n iex> image_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#image_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.maybe_dominant_color/4","doc":"Determines the dominant color for a given user’s avatar or banner.","ref":"Bonfire.Common.Media.html#maybe_dominant_color/4"},{"type":"function","title":"Examples - Bonfire.Common.Media.maybe_dominant_color/4","doc":"iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}})\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}}, nil, \"http://example.com/banner.png\")\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}}, nil, nil, \"/images/bonfires.png\")\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: nil}}, \"http://example.com/banner.png\")\n nil","ref":"Bonfire.Common.Media.html#maybe_dominant_color/4-examples"},{"type":"function","title":"Bonfire.Common.Media.media_url/1","doc":"Takes a Media map (or an object containing one) and returns a URL for the media.","ref":"Bonfire.Common.Media.html#media_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.media_url/1","doc":"iex> media_url(%{path: \"http://example.com/image.jpg\"})\n \"http://example.com/image.jpg\"\n\n iex> media_url(%{path: \"remote.jpg\", metadata: %{\"module\" => \"MyModule\"}})\n # Assume MyModule.remote_url/1 is defined and returns \"http://example.com/remote.jpg\"\n \"http://example.com/remote.jpg\"\n\n iex> media_url(%{media_type: \"image/jpeg\", path: \"image.jpg\"})\n \"http://image.jpg\"\n\n iex> media_url(%{media_type: \"text/plain\", path: \"document.txt\"})\n \"http://document.txt\"\n\n iex> media_url(%{changes: %{path: \"http://changed.example.com/image.jpg\"}})\n \"http://changed.example.com/image.jpg\"\n\n iex> media_url(%{path: \"image.jpg\"})\n \"http://image.jpg\"\n\n iex> media_url(%{media: %{path: \"http://nested.example.com/image.jpg\"}})\n \"http://nested.example.com/image.jpg\"\n\n iex> media_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#media_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.read_tar_files/3","doc":"Reads specific files from a tar archive and returns their contents.","ref":"Bonfire.Common.Media.html#read_tar_files/3"},{"type":"function","title":"Examples - Bonfire.Common.Media.read_tar_files/3","doc":"iex> read_tar_files(\"path/to/archive.tar\", \"file1.txt\")\n {:ok, \"file1 contents\"}\n\n iex> read_tar_files(\"path/to/archive.tar\", [\"file1.txt\", \"file2.txt\"])\n {:ok, [\"file1 contents\", \"file2 contents\"]}\n\n iex> read_tar_files(\"path/to/nonexistent.tar\", \"file1.txt\")\n {:error, \"File not found\"}\n\n iex> read_tar_files(\"path/to/archive.tar\", \"nonexistent_file.txt\")\n {:error, \"File not found\"}","ref":"Bonfire.Common.Media.html#read_tar_files/3-examples"},{"type":"function","title":"Bonfire.Common.Media.thumbnail_url/1","doc":"Takes a Media map (or an object containing one) and returns the thumbnail's URL.","ref":"Bonfire.Common.Media.html#thumbnail_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.thumbnail_url/1","doc":"iex> thumbnail_url(%{path: \"thumbnail.jpg\", metadata: %{\"module\" => \"MyModule\"}})\n # Assume MyModule.remote_url/2 with :thumbnail returns \"http://example.com/thumbnail.jpg\"\n \"http://example.com/thumbnail.jpg\"\n\n iex> thumbnail_url(%{media_type: \"image/jpeg\", path: \"thumbnail.jpg\"})\n \"http://thumbnail.jpg\"\n\n iex> thumbnail_url(%{media_type: \"video/mp4\", path: \"video.mpeg\"})\n # Assume Bonfire.Files.VideoUploader.remote_url/2 with :thumbnail returns \"http://video-thumbnail.jpg\"\n \"http://video-thumbnail.jpg\"\n\n iex> thumbnail_url(%{path: \"document.pdf\", media_type: \"document\"})\n # Assume Bonfire.Files.DocumentUploader.remote_url/2 with :thumbnail returns \"http://document-thumbnail.jpg\"\n \"http://document-thumbnail.jpg\"\n\n iex> thumbnail_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#thumbnail_url/1-examples"},{"type":"module","title":"Bonfire.Common.MemoryMonitor","doc":"This module implements a GenServer that monitors the memory usage of a process.\nIt periodically checks the memory consumption.","ref":"Bonfire.Common.MemoryMonitor.html"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.MemoryMonitor.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.get_memory_usage/2","doc":"","ref":"Bonfire.Common.MemoryMonitor.html#get_memory_usage/2"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.handle_info/2","doc":"Handles incoming messages to the GenServer.\n - `:check` - Performs memory usage checks on the monitored process","ref":"Bonfire.Common.MemoryMonitor.html#handle_info/2"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.start_link/2","doc":"Starts the MemoryMonitor process linked to the caller process with given options.","ref":"Bonfire.Common.MemoryMonitor.html#start_link/2"},{"type":"module","title":"Bonfire.Common.Modularity.DeclareHelpers","doc":"Helpers for declaring the existence of an extension (i.e., so it gets included in extension settings and nav).","ref":"Bonfire.Common.Modularity.DeclareHelpers.html"},{"type":"function","title":"Bonfire.Common.Modularity.DeclareHelpers.app/1","doc":"Gets the OTP app name for a module","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#app/1"},{"type":"macro","title":"Bonfire.Common.Modularity.DeclareHelpers.declare_extension/2","doc":"Declares an extension by setting up the module with the given name and options.","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#declare_extension/2"},{"type":"macro","title":"Examples - Bonfire.Common.Modularity.DeclareHelpers.declare_extension/2","doc":"iex> defmodule MyExtension do\n ...> import Bonfire.Common.Modularity.DeclareHelpers\n ...> declare_extension(\"My Extension\", readme: \"MY_README.md\")\n ...> end","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#declare_extension/2-examples"},{"type":"function","title":"Bonfire.Common.Modularity.DeclareHelpers.generate_link/3","doc":"Generates a map representing a link with metadata for the extension with the given name, module, and options.","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#generate_link/3"},{"type":"function","title":"Examples - Bonfire.Common.Modularity.DeclareHelpers.generate_link/3","doc":"iex> Bonfire.Common.Modularity.DeclareHelpers.generate_link(:bonfire_common, Bonfire.Common, href: \"/my_extension\")\n %{\n name: :bonfire_common,\n module: Bonfire.Common,\n app: :bonfire_common,\n href: \"/my_extension\",\n type: :link\n }","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#generate_link/3-examples"},{"type":"module","title":"Bonfire.Common.Module.Override","doc":"Utility to clone a module under a new name","ref":"Bonfire.Common.Module.Override.html"},{"type":"function","title":"Bonfire.Common.Module.Override.clone/2","doc":"Clone the existing module under a new name","ref":"Bonfire.Common.Module.Override.html#clone/2"},{"type":"function","title":"Bonfire.Common.Module.Override.clone_original/2","doc":"","ref":"Bonfire.Common.Module.Override.html#clone_original/2"},{"type":"function","title":"Bonfire.Common.Module.Override.module_name_atom/1","doc":"","ref":"Bonfire.Common.Module.Override.html#module_name_atom/1"},{"type":"function","title":"Bonfire.Common.Module.Override.module_name_string/1","doc":"","ref":"Bonfire.Common.Module.Override.html#module_name_string/1"},{"type":"function","title":"Bonfire.Common.Module.Override.module_original_name_atom/2","doc":"","ref":"Bonfire.Common.Module.Override.html#module_original_name_atom/2"},{"type":"function","title":"Bonfire.Common.Module.Override.module_original_name_str/2","doc":"","ref":"Bonfire.Common.Module.Override.html#module_original_name_str/2"},{"type":"module","title":"Bonfire.Common.Needles","doc":"Helpers for handling `Needle` Pointers","ref":"Bonfire.Common.Needles.html"},{"type":"function","title":"Bonfire.Common.Needles.dataloader/1","doc":"Resolves pointers for GraphQL API batch loading.","ref":"Bonfire.Common.Needles.html#dataloader/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.dataloader/1","doc":"iex> Bonfire.Common.Needles.dataloader(context)\n %Dataloader{...}","ref":"Bonfire.Common.Needles.html#dataloader/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.exists?/2","doc":"Checks if an object exists based on the given filters.","ref":"Bonfire.Common.Needles.html#exists?/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.exists?/2","doc":"iex> Bonfire.Common.Needles.exists?(\"some_id\")\n true\n\n iex> Bonfire.Common.Needles.exists?(\"non_existent_id\")\n false","ref":"Bonfire.Common.Needles.html#exists?/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.filter_one/1","doc":"Filters a single pointer from a query result.","ref":"Bonfire.Common.Needles.html#filter_one/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.filter_one/1","doc":"iex> Bonfire.Common.Needles.filter_one(\"http://url\")\n [canonical_uri: \"http://url\"]","ref":"Bonfire.Common.Needles.html#filter_one/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.filters/3","doc":"Applies filters to a query.","ref":"Bonfire.Common.Needles.html#filters/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.filters/3","doc":"iex> Bonfire.Common.Needles.filters(query, filters)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#filters/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.follow!/2","doc":"Follows one or more pointers and returns the schema struct.","ref":"Bonfire.Common.Needles.html#follow!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.follow!/2","doc":"iex> Bonfire.Common.Needles.follow!(%Pointer{id: \"some_id\"})\n %SomeRecord{}\n\n iex> Bonfire.Common.Needles.follow!([%Pointer{id: \"some_id\"}])\n [%SomeRecord{}]","ref":"Bonfire.Common.Needles.html#follow!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.follow_function_error/2","doc":"","ref":"Bonfire.Common.Needles.html#follow_function_error/2"},{"type":"function","title":"Bonfire.Common.Needles.forge!/1","doc":"Forge a pointer from a pointable object.\n\nDoes not hit the database, is safe so long as the provided struct participates in the meta abstraction.","ref":"Bonfire.Common.Needles.html#forge!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.forge!/1","doc":"iex> Bonfire.Common.Needles.forge!(%{__struct__: MySchema, id: \"some_id\"})\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#forge!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.forge!/2","doc":"Forges a pointer to a participating meta entity\n\nDoes not hit the database, is safe so long as the entry we wish to\nsynthesise a pointer for represents a legitimate entry in the database.","ref":"Bonfire.Common.Needles.html#forge!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.forge!/2","doc":"iex> Bonfire.Common.Needles.forge!(:my_table, \"some_id\")\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#forge!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.get/2","doc":"Retrieves an object by its ID.","ref":"Bonfire.Common.Needles.html#get/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.get/2","doc":"iex> Bonfire.Common.Needles.get(\"existing_id\")\n {:ok, %Pointer{id: \"existing_id\", ...}}\n\n iex> Bonfire.Common.Needles.get(\"non_existent_id\")\n {:error, :not_found}","ref":"Bonfire.Common.Needles.html#get/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.get!/2","doc":"Retrieves an object by its ID. Raises `NotFound` if the object cannot be found.","ref":"Bonfire.Common.Needles.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.get!/2","doc":"iex> Bonfire.Common.Needles.get!(\"existing_id\")\n %Pointer{id: \"existing_id\", ...}\n\n iex> Bonfire.Common.Needles.get!(\"non_existent_id\")\n ** (Needle.NotFound) ...","ref":"Bonfire.Common.Needles.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.id_binary/1","doc":"Filters an object by its binary ID.","ref":"Bonfire.Common.Needles.html#id_binary/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.id_binary/1","doc":"iex> Bonfire.Common.Needles.id_binary(id: \"some_id\")","ref":"Bonfire.Common.Needles.html#id_binary/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.id_filter/2","doc":"Filters an object by its ID.","ref":"Bonfire.Common.Needles.html#id_filter/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.id_filter/2","doc":"iex> Bonfire.Common.Needles.id_filter(query, id: \"some_id\")","ref":"Bonfire.Common.Needles.html#id_filter/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.list!/2","doc":"Retrieves a list of objects based on pointers or IDs.","ref":"Bonfire.Common.Needles.html#list!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list!/2","doc":"iex> Bonfire.Common.Needles.list!([\"id1\", \"id2\"])\n [%Pointer{id: \"id1\", ...}, %Pointer{id: \"id2\", ...}]\n\n iex> Bonfire.Common.Needles.list!([%Pointer{id: \"id1\"}, %Pointer{id: \"id2\"}])\n [%Pointer{id: \"id1\", ...}, %Pointer{id: \"id2\", ...}]","ref":"Bonfire.Common.Needles.html#list!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.list_by_type!/3","doc":"Retrieves objects based on type and filters.","ref":"Bonfire.Common.Needles.html#list_by_type!/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list_by_type!/3","doc":"iex> Bonfire.Common.Needles.list_by_type!(:my_table, [filter: value])\n [%Pointer{...}, %Pointer{...}]","ref":"Bonfire.Common.Needles.html#list_by_type!/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.list_ids/0","doc":"Retrieves a list of known IDs","ref":"Bonfire.Common.Needles.html#list_ids/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list_ids/0","doc":"iex> Bonfire.Common.Needles.list_ids()\n [\"id1\", \"id2\"]","ref":"Bonfire.Common.Needles.html#list_ids/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.many/2","doc":"Retrieves many objects based on the provided filters","ref":"Bonfire.Common.Needles.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.many/2","doc":"iex> Bonfire.Common.Needles.many([id: \"some_id\"])\n {:ok, [%Pointer{id: \"some_id\", ...}]}\n\n iex> Bonfire.Common.Needles.many([id: \"non_existing_id\"])\n {:ok, []}","ref":"Bonfire.Common.Needles.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.many!/2","doc":"Retrieves many objects based on the provided filters\n\n iex> Bonfire.Common.Needles.many!([id: \"some_id\"])\n [%Pointer{id: \"some_id\", ...}]","ref":"Bonfire.Common.Needles.html#many!/2"},{"type":"function","title":"Bonfire.Common.Needles.maybe_forge/1","doc":"Turns a thing into a pointer if it is not already or returns nil.","ref":"Bonfire.Common.Needles.html#maybe_forge/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.maybe_forge/1","doc":"iex> Bonfire.Common.Needles.maybe_forge(%Pointer{id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge(%{pointer_id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge(%{id: \"existing_id\"})\n nil","ref":"Bonfire.Common.Needles.html#maybe_forge/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.maybe_forge!/1","doc":"Turns a thing into a pointer if it is not already. Errors if it cannot be performed.\n\n iex> Bonfire.Common.Needles.maybe_forge!(%Pointer{id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge!(%{pointer_id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge!(%{id: \"non_existing_id\"})\n ** (RuntimeError) ...","ref":"Bonfire.Common.Needles.html#maybe_forge!/1"},{"type":"function","title":"Bonfire.Common.Needles.maybe_resolve/4","doc":"Resolves associations or fields based on the given parent and context.","ref":"Bonfire.Common.Needles.html#maybe_resolve/4"},{"type":"function","title":"Examples - Bonfire.Common.Needles.maybe_resolve/4","doc":"iex> Bonfire.Common.Needles.maybe_resolve(parent, field, args, context)\n {:ok, resolved_data}","ref":"Bonfire.Common.Needles.html#maybe_resolve/4-examples"},{"type":"function","title":"Bonfire.Common.Needles.one/2","doc":"Retrieves an object by its ID or pointer.","ref":"Bonfire.Common.Needles.html#one/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.one/2","doc":"iex> Bonfire.Common.Needles.get(\"some_id\")\n {:ok, %Pointer{id: \"some_id\", ...}}\n\n iex> Bonfire.Common.Needles.get([id: \"some_id\"])\n {:ok, %Pointer{id: \"existing_id\", ...}}","ref":"Bonfire.Common.Needles.html#one/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.one!/2","doc":"Retrieves a single object based on the provided filters with bang.\n\n iex> Bonfire.Common.Needles.one!(\"some_id\")\n %Pointer{id: \"some_id\", ...}\n\n iex> Bonfire.Common.Needles.one!([id: \"some_id\"])\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#one!/2"},{"type":"function","title":"Bonfire.Common.Needles.pointer_preloads/2","doc":"Preloads associations based on the given preloads option.","ref":"Bonfire.Common.Needles.html#pointer_preloads/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.pointer_preloads/2","doc":"iex> Bonfire.Common.Needles.pointer_preloads(query, :with_creator)\n %Ecto.Query{...}\n\n iex> Bonfire.Common.Needles.pointer_preloads(query, :tags)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#pointer_preloads/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.pointer_query/2","doc":"Prepares a query for pointers.","ref":"Bonfire.Common.Needles.html#pointer_query/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.pointer_query/2","doc":"iex> Bonfire.Common.Needles.pointer_query(query, opts)\n %Ecto.Query{...}\n\n iex> Bonfire.Common.Needles.pointer_query([id: \"some_id\"], opts)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#pointer_query/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.preload!/2","doc":"Follows one or more pointers and adds the pointed records to the `pointed` attrs.\n\n iex> Bonfire.Common.Needles.preload!(%Pointer{id: \"some_id\"})\n %Pointer{id: \"some_id\", pointed: %SomeRecord{}}\n\n iex> Bonfire.Common.Needles.preload!([%Pointer{id: \"some_id\"}])\n [%Pointer{id: \"some_id\", pointed: %SomeRecord{}}]","ref":"Bonfire.Common.Needles.html#preload!/2"},{"type":"function","title":"Bonfire.Common.Needles.query/3","doc":"Queries a dataset based on provided filters.","ref":"Bonfire.Common.Needles.html#query/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.query/3","doc":"iex> Bonfire.Common.Needles.query(filters)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#query/3-examples"},{"type":"module","title":"Bonfire.Common.Needles.Pointers.Queries","doc":"Queries for `Needle` Pointers","ref":"Bonfire.Common.Needles.Pointers.Queries.html"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Common.Needles.Pointers.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query/1","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query/1"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query/2","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query/2"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query_incl_deleted/0","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query_incl_deleted/0"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.schema_module/0","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#schema_module/0"},{"type":"module","title":"Bonfire.Common.Needles.Preload","doc":"Helpers for preloading `Needle` Pointer associations. See also `Bonfire.Common.Repo.Preload`","ref":"Bonfire.Common.Needles.Preload.html"},{"type":"function","title":"Bonfire.Common.Needles.Preload.access_key/2","doc":"Generates an access function based on a key and default value.","ref":"Bonfire.Common.Needles.Preload.html#access_key/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.access_key/2","doc":"iex> Bonfire.Common.Needles.Preload.access_key(:key)","ref":"Bonfire.Common.Needles.Preload.html#access_key/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.custom_access_key_fun/3","doc":"Creates a custom access function for nested keys with an optional transformation function.","ref":"Bonfire.Common.Needles.Preload.html#custom_access_key_fun/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.custom_access_key_fun/3","doc":"iex> Bonfire.Common.Needles.Preload.custom_access_key_fun(:key)\n #Function<...>","ref":"Bonfire.Common.Needles.Preload.html#custom_access_key_fun/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"Conditionally preloads nested pointers in object(s) based on provided keys and options.\n\nThis function handles various cases including nested keys for preloading. It supports preloading pointers in objects, lists of objects, and nested structures. The function processes lists of keys for deeply nested preloading.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3"},{"type":"function","title":"Parameters - Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"- `object`: The object in which nested pointers may be preloaded. This can be a map, list, or other data structures.\n - `keys`: A list of nested keys for preloading pointers. The keys can be deeply nested to access and preload pointers at various levels (like in `proload` as opposed to `maybe_preload`)\n - `opts`: Options for preloading, which may include configuration for how pointers are fetched and handled.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers(%{key: %{nested_key: %Ecto.AssociationNotLoaded{}}}, [key: [:nested_key]], [])\n %{key: %{nested_key: %LoadedObject{}}}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers(%{edges: []}, [:key], [])\n %{edges: []}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers([%{key: %Ecto.AssociationNotLoaded{}}], [:key], [])\n [%{key: %LoadedObject{}}]","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_pointer/2","doc":"Preloads a single pointer if the provided value is a `Needle.Pointer`.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointer/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_pointer/2","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_pointer(%Needle.Pointer{...}, [])\n %LoadedObject{}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointer(\"not_a_pointer\", [])\n \"not_a_pointer\"","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointer/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"Conditionally preloads pointers in an object based on provided keys and options.\n\nThis function handles various cases including tuples with `{:ok, obj}`, maps with an `:edges` key, lists of objects, and individual objects. It supports both single and nested keys for preloading.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3"},{"type":"function","title":"Parameters - Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"- `object`: The object(s) in which pointers may be preloaded. This can be a map, list, tuple, or other data structures.\n - `keys`: A list of keys or a single key for preloading pointers. Nested keys can be specified for deeper levels of preloading.\n - `opts`: Options for preloading, which may include configuration for how pointers are fetched and handled.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{edges: [...]}, [:key], [])\n %{edges: [...]}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{key: %Ecto.AssociationNotLoaded{}}, [:key], [])\n %{key: %LoadedObject{}}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{key: %{nested_key: %Ecto.AssociationNotLoaded{}}}, [:key, :nested_key], [])\n %{key: %{nested_key: %LoadedObject{}}}","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3-examples"},{"type":"module","title":"Bonfire.Common.Needles.Tables","doc":"Helpers for querying `Needle` types/tables","ref":"Bonfire.Common.Needles.Tables.html"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_ids/0","doc":"Lists IDs of all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_ids/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_ids/0","doc":"iex> Bonfire.Common.Needles.Tables.list_ids()\n [\"id1\", \"id2\"]","ref":"Bonfire.Common.Needles.Tables.html#list_ids/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_schemas/0","doc":"Lists schemas of all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_schemas/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_schemas/0","doc":"iex> Bonfire.Common.Needles.Tables.list_schemas()\n [:schema1, :schema2]","ref":"Bonfire.Common.Needles.Tables.html#list_schemas/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_tables/1","doc":"Lists all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_tables/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_tables/1","doc":"iex> Bonfire.Common.Needles.Tables.list_tables()\n [%Table{}]\n\n iex> Bonfire.Common.Needles.Tables.list_tables(:db)\n %{\"table_name\" => %Table{}}","ref":"Bonfire.Common.Needles.Tables.html#list_tables/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_tables_debug/0","doc":"Lists and debugs all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_tables_debug/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_tables_debug/0","doc":"iex> Bonfire.Common.Needles.Tables.list_tables_debug()\n [{:ok, \"table1\"}, {:error, \"Code and DB have differing IDs for the same table\", \"table2\", \"id2a\", \"id2b\"}, {:error, \"Table present in DB but not in code\", \"table3\"}]","ref":"Bonfire.Common.Needles.Tables.html#list_tables_debug/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.many/1","doc":"Retrieves details of multiple tables based on filters.","ref":"Bonfire.Common.Needles.Tables.html#many/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.many/1","doc":"iex> Bonfire.Common.Needles.Tables.many(%{field: \"value\"})\n {:ok, [%Table{}]}","ref":"Bonfire.Common.Needles.Tables.html#many/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.one/1","doc":"Retrieves a single record by ID or filters.","ref":"Bonfire.Common.Needles.Tables.html#one/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.one/1","doc":"iex> Bonfire.Common.Needles.Tables.one(\"valid_ulid\")\n {:ok, %Table{}}\n\n iex> Bonfire.Common.Needles.Tables.one(%{field: \"value\"})\n %Table{}","ref":"Bonfire.Common.Needles.Tables.html#one/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.one!/1","doc":"Retrieves a single record by filters, raising an error if not found.","ref":"Bonfire.Common.Needles.Tables.html#one!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.one!/1","doc":"iex> Bonfire.Common.Needles.Tables.one!(%{field: \"value\"})\n %Table{}","ref":"Bonfire.Common.Needles.Tables.html#one!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.schema_or_table!/1","doc":"Retrieves the schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#schema_or_table!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.schema_or_table!/1","doc":"iex> Bonfire.Common.Needles.Tables.schema_or_table!(\"valid_id\")\n MySchema\n\n iex> Bonfire.Common.Needles.Tables.schema_or_table!(\"table_name\")\n MySchema","ref":"Bonfire.Common.Needles.Tables.html#schema_or_table!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table!/1","doc":"Retrieves the Table that a pointer points to.","ref":"Bonfire.Common.Needles.Tables.html#table!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table!/1","doc":"iex> Bonfire.Common.Needles.Tables.table!(%Pointer{table_id: \"valid_id\"})\n %Table{}\n\n iex> Bonfire.Common.Needles.Tables.table!(\"valid_id\")\n %Table{}\n\n iex> Bonfire.Common.Needles.Tables.table!(\"invalid_id\")\n # throws error","ref":"Bonfire.Common.Needles.Tables.html#table!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table_fields/1","doc":"Retrieves fields of a table given a schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#table_fields/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table_fields/1","doc":"iex> Bonfire.Common.Needles.Tables.table_fields(MySchema)\n [:field1, :field2]\n\n iex> Bonfire.Common.Needles.Tables.table_fields(\"table_name\")\n [:field1, :field2]","ref":"Bonfire.Common.Needles.Tables.html#table_fields/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table_fields_meta/1","doc":"Retrieves metadata about fields of a table given a schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#table_fields_meta/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table_fields_meta/1","doc":"iex> Bonfire.Common.Needles.Tables.table_fields_meta(MySchema)\n [%{column_name: \"field1\", data_type: \"type\", column_default: nil, is_nullable: \"NO\"}]\n\n iex> Bonfire.Common.Needles.Tables.table_fields_meta(\"table_name\")\n [%{column_name: \"field1\", data_type: \"type\", column_default: nil, is_nullable: \"NO\"}]","ref":"Bonfire.Common.Needles.Tables.html#table_fields_meta/1-examples"},{"type":"module","title":"Bonfire.Common.Needles.Tables.Queries","doc":"Queries for `Bonfire.Common.Needles.Tables`","ref":"Bonfire.Common.Needles.Tables.Queries.html"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Common.Needles.Tables.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.query/1","doc":"","ref":"Bonfire.Common.Needles.Tables.Queries.html#query/1"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.query/2","doc":"","ref":"Bonfire.Common.Needles.Tables.Queries.html#query/2"},{"type":"module","title":"Bonfire.Common.Opts","doc":"Helpers to handle functions' `opts` parameter (usually a `Keyword` list)","ref":"Bonfire.Common.Opts.html"},{"type":"function","title":"Bonfire.Common.Opts.maybe_from_opts/3","doc":"Retrieves the value associated with a key from options (list or map), or returns a fallback if the key is not present or if the value is empty.\n\nThis function looks for the key in the options and returns its value if present. If the key is not found or the value is empty, it returns the provided fallback value.","ref":"Bonfire.Common.Opts.html#maybe_from_opts/3"},{"type":"function","title":"Examples - Bonfire.Common.Opts.maybe_from_opts/3","doc":"iex> maybe_from_opts([key: \"value\"], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts([key: nil], :key, \"default\")\n \"default\"\n\n iex> maybe_from_opts(%{key: \"value\"}, :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{missing_key: \"value\"}, :key, \"default\")\n \"default\"\n\n iex> maybe_from_opts([context: %{key: \"value\"}], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts([context: %{key: \"value\"}], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{context: %{key: \"value\"}}, :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{context: %{key: \"value\"}}, :key, \"default\")\n \"value\"","ref":"Bonfire.Common.Opts.html#maybe_from_opts/3-examples"},{"type":"function","title":"Bonfire.Common.Opts.to_options/1","doc":"Converts various types of input (e.g. map, user, socket, tuple) into a standardized keyword list for use as function options.\n\nThis function handles different types of inputs and converts them to keyword lists. The conversion logic includes:\n\n- Extracting assigns from Phoenix socket maps, dropping specific keys.\n- Wrapping user structs into a keyword list with the key `:current_user`.\n- Wrapping other structs into a keyword list with the key `:context`.\n- Converting tuples, maps, and lists into keyword lists or wrapping them as context.","ref":"Bonfire.Common.Opts.html#to_options/1"},{"type":"function","title":"Examples - Bonfire.Common.Opts.to_options/1","doc":"iex> to_options(%{assigns: %{user: \"user_data\"}})\n [user: \"user_data\"]\n\n iex> to_options(%Bonfire.Data.Identity.User{})\n [current_user: %Bonfire.Data.Identity.User{}]\n\n iex> to_options(%{key: \"value\"})\n [key: \"value\"]\n\n iex> to_options({:key, \"value\"})\n [key: \"value\"]\n\n iex> to_options([{:key, \"value\"}])\n [{:key, \"value\"}]\n\n iex> to_options(%{other: \"data\"})\n [other: \"data\"]\n \n iex> to_options(%{\"non_existing_other\"=> \"data\"})\n [__item_discarded__: true]","ref":"Bonfire.Common.Opts.html#to_options/1-examples"},{"type":"module","title":"Bonfire.Common.PubSub","doc":"Pub/sub helpers for subscribing and broadcasting to topics","ref":"Bonfire.Common.PubSub.html"},{"type":"function","title":"Bonfire.Common.PubSub.broadcast/2","doc":"Broadcast some data for realtime updates, for example to a feed or thread","ref":"Bonfire.Common.PubSub.html#broadcast/2"},{"type":"macro","title":"Bonfire.Common.PubSub.broadcast_with_telemetry/2","doc":"Broadcast while attaching telemetry info. The receiving module must `use Bonfire.Common.PubSub` to correctly unwrap the Event","ref":"Bonfire.Common.PubSub.html#broadcast_with_telemetry/2"},{"type":"function","title":"Bonfire.Common.PubSub.broadcast_with_telemetry/3","doc":"","ref":"Bonfire.Common.PubSub.html#broadcast_with_telemetry/3"},{"type":"function","title":"Bonfire.Common.PubSub.current_function/1","doc":"","ref":"Bonfire.Common.PubSub.html#current_function/1"},{"type":"function","title":"Bonfire.Common.PubSub.subscribe/2","doc":"Subscribe to something for realtime updates, like a feed or thread","ref":"Bonfire.Common.PubSub.html#subscribe/2"},{"type":"module","title":"Bonfire.Common.PubSub.Event","doc":"","ref":"Bonfire.Common.PubSub.Event.html"},{"type":"behaviour","title":"Bonfire.Common.QueryModule","doc":"Properly query some data using the appropriate module depending on its schema.\nBack by a global cache of known query_modules to be queried by their schema, or vice versa.","ref":"Bonfire.Common.QueryModule.html"},{"type":"function","title":"Bonfire.Common.QueryModule.app_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#app_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.apply_error/2","doc":"","ref":"Bonfire.Common.QueryModule.html#apply_error/2"},{"type":"callback","title":"Bonfire.Common.QueryModule.context_module/0","doc":"Points to the related context module","ref":"Bonfire.Common.QueryModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.QueryModule.linked_context_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#linked_context_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.linked_schema_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#linked_schema_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.maybe_query/3","doc":"","ref":"Bonfire.Common.QueryModule.html#maybe_query/3"},{"type":"function","title":"Bonfire.Common.QueryModule.maybe_query_module/1","doc":"","ref":"Bonfire.Common.QueryModule.html#maybe_query_module/1"},{"type":"function","title":"Bonfire.Common.QueryModule.modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.query_function_error/3","doc":"","ref":"Bonfire.Common.QueryModule.html#query_function_error/3"},{"type":"callback","title":"Bonfire.Common.QueryModule.query_module/0","doc":"Declares a query module","ref":"Bonfire.Common.QueryModule.html#c:query_module/0"},{"type":"function","title":"Bonfire.Common.QueryModule.query_module/1","doc":"Get a Queryable identified by name or id.","ref":"Bonfire.Common.QueryModule.html#query_module/1"},{"type":"function","title":"Bonfire.Common.QueryModule.query_module!/1","doc":"Look up a Queryable by name or id, throw :not_found if not found.","ref":"Bonfire.Common.QueryModule.html#query_module!/1"},{"type":"function","title":"Bonfire.Common.QueryModule.query_modules/1","doc":"Look up many ids at once, throw :not_found if any of them are not found","ref":"Bonfire.Common.QueryModule.html#query_modules/1"},{"type":"callback","title":"Bonfire.Common.QueryModule.schema_module/0","doc":"Points to the related schema module","ref":"Bonfire.Common.QueryModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.Repo","doc":"Main Ecto Repo.\n\nNote: functions are defined in `Bonfire.Common.RepoTemplate`","ref":"Bonfire.Common.Repo.html"},{"type":"function","title":"Bonfire.Common.Repo.aggregate/3","doc":"","ref":"Bonfire.Common.Repo.html#aggregate/3"},{"type":"function","title":"Bonfire.Common.Repo.aggregate/4","doc":"","ref":"Bonfire.Common.Repo.html#aggregate/4"},{"type":"function","title":"Bonfire.Common.Repo.all/2","doc":"","ref":"Bonfire.Common.Repo.html#all/2"},{"type":"function","title":"Bonfire.Common.Repo.checked_out?/0","doc":"","ref":"Bonfire.Common.Repo.html#checked_out?/0"},{"type":"function","title":"Bonfire.Common.Repo.checkout/2","doc":"","ref":"Bonfire.Common.Repo.html#checkout/2"},{"type":"function","title":"Bonfire.Common.Repo.child_spec/1","doc":"","ref":"Bonfire.Common.Repo.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Repo.config/0","doc":"","ref":"Bonfire.Common.Repo.html#config/0"},{"type":"function","title":"Bonfire.Common.Repo.default_options/1","doc":"","ref":"Bonfire.Common.Repo.html#default_options/1"},{"type":"function","title":"Bonfire.Common.Repo.default_repo_opts/0","doc":"","ref":"Bonfire.Common.Repo.html#default_repo_opts/0"},{"type":"function","title":"Bonfire.Common.Repo.delete/2","doc":"","ref":"Bonfire.Common.Repo.html#delete/2"},{"type":"function","title":"Bonfire.Common.Repo.delete!/2","doc":"","ref":"Bonfire.Common.Repo.html#delete!/2"},{"type":"function","title":"Bonfire.Common.Repo.delete_all/2","doc":"","ref":"Bonfire.Common.Repo.html#delete_all/2"},{"type":"function","title":"Bonfire.Common.Repo.delete_many/1","doc":"Execute a query to delete all matching records.","ref":"Bonfire.Common.Repo.html#delete_many/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.delete_many/1","doc":"iex> delete_many(from u in User, where: u.id < 100)\n {:ok, _count}","ref":"Bonfire.Common.Repo.html#delete_many/1-examples"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#disconnect_all/2"},{"type":"function","title":"Bonfire.Common.Repo.exists?/2","doc":"","ref":"Bonfire.Common.Repo.html#exists?/2"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#explain/3"},{"type":"function","title":"Bonfire.Common.Repo.fetch/2","doc":"Execute a query for one result where the primary key matches the given id, and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.Repo.html#fetch/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch/2","doc":"iex> fetch(User, 1)\n {:ok, %User{}}\n\n iex> fetch(User, 999)\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#fetch/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.fetch_all/2","doc":"Execute a query for multiple results given one or multiple IDs.","ref":"Bonfire.Common.Repo.html#fetch_all/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch_all/2","doc":"iex> fetch_all(User, [1, 2, 3])\n [%User{}, %User{}, %User{}]\n\n iex> fetch_all(User, 999)\n []","ref":"Bonfire.Common.Repo.html#fetch_all/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.fetch_by/2","doc":"Execute a query for one result (using a keyword list to specify the key/value to query with), and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.Repo.html#fetch_by/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch_by/2","doc":"iex> fetch_by(User, name: \"Alice\")\n {:ok, %User{}}\n\n iex> fetch_by(User, name: \"Nonexistent\")\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#fetch_by/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.find/3","doc":"Like `single/1`, except on failure, adds an error to the changeset.","ref":"Bonfire.Common.Repo.html#find/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.find/3","doc":"iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 1, changeset)\n {:ok, %User{}}\n\n iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 999, changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.Repo.html#find/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.get/3","doc":"","ref":"Bonfire.Common.Repo.html#get/3"},{"type":"function","title":"Bonfire.Common.Repo.get!/3","doc":"","ref":"Bonfire.Common.Repo.html#get!/3"},{"type":"function","title":"Bonfire.Common.Repo.get_by/3","doc":"","ref":"Bonfire.Common.Repo.html#get_by/3"},{"type":"function","title":"Bonfire.Common.Repo.get_by!/3","doc":"","ref":"Bonfire.Common.Repo.html#get_by!/3"},{"type":"function","title":"Bonfire.Common.Repo.get_dynamic_repo/0","doc":"","ref":"Bonfire.Common.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Bonfire.Common.Repo.in_transaction?/0","doc":"","ref":"Bonfire.Common.Repo.html#in_transaction?/0"},{"type":"function","title":"Bonfire.Common.Repo.insert/2","doc":"","ref":"Bonfire.Common.Repo.html#insert/2"},{"type":"function","title":"Bonfire.Common.Repo.insert!/2","doc":"","ref":"Bonfire.Common.Repo.html#insert!/2"},{"type":"function","title":"Bonfire.Common.Repo.insert_all/3","doc":"","ref":"Bonfire.Common.Repo.html#insert_all/3"},{"type":"function","title":"Bonfire.Common.Repo.insert_all_or_ignore/2","doc":"Insert all or ignore a list of maps into a schema.","ref":"Bonfire.Common.Repo.html#insert_all_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_all_or_ignore/2","doc":"iex> insert_all_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#insert_all_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_ignore/1","doc":"Insert or ignore a changeset or struct into a schema.","ref":"Bonfire.Common.Repo.html#insert_or_ignore/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_or_ignore/1","doc":"iex> insert_or_ignore(%Ecto.Changeset{})\n {:ok, _result}\n\n iex> insert_or_ignore(%MySchema{field: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#insert_or_ignore/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_ignore/2","doc":"Insert or ignore a map (or iterate over a list of maps) into a schema.","ref":"Bonfire.Common.Repo.html#insert_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_or_ignore/2","doc":"iex> insert_or_ignore(MySchema, %{field: \"value\"})\n [{:ok, _result}]\n\n iex> insert_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n [{:ok, _result}]","ref":"Bonfire.Common.Repo.html#insert_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_update/2","doc":"","ref":"Bonfire.Common.Repo.html#insert_or_update/2"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_update!/2","doc":"","ref":"Bonfire.Common.Repo.html#insert_or_update!/2"},{"type":"function","title":"Bonfire.Common.Repo.load/2","doc":"","ref":"Bonfire.Common.Repo.html#load/2"},{"type":"function","title":"Bonfire.Common.Repo.make_subquery/1","doc":"","ref":"Bonfire.Common.Repo.html#make_subquery/1"},{"type":"function","title":"Bonfire.Common.Repo.many/2","doc":"Execute a query for multiple results and return the results.","ref":"Bonfire.Common.Repo.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.many/2","doc":"iex> many(from u in User)\n [%User{}, %User{}]\n\n iex> many(from u in User, return: :query)\n #Ecto.Query<...>","ref":"Bonfire.Common.Repo.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.many_paginated/3","doc":"Execute a query for multiple results and return one page of results.\nThis uses the main implementation for pagination, which is cursor-based and powered by the `Paginator` library.","ref":"Bonfire.Common.Repo.html#many_paginated/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.many_paginated/3","doc":"iex> many_paginated(User, [limit: 10])\n %Paginator.Page{}","ref":"Bonfire.Common.Repo.html#many_paginated/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.maybe_one/2","doc":"Execute a query for one result and return either a result or a fallback value (`nil` by default).","ref":"Bonfire.Common.Repo.html#maybe_one/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.maybe_one/2","doc":"iex> maybe_one(from u in User, where: u.id == 1)\n %User{}\n\n iex> maybe_one(from u in User, where: u.id == 999, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.Repo.html#maybe_one/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.maybe_preload/3","doc":"","ref":"Bonfire.Common.Repo.html#maybe_preload/3"},{"type":"function","title":"Bonfire.Common.Repo.maybe_where_ilike/5","doc":"Add an `ilike` clause to a query if the user query is safe.","ref":"Bonfire.Common.Repo.html#maybe_where_ilike/5"},{"type":"function","title":"Examples - Bonfire.Common.Repo.maybe_where_ilike/5","doc":"iex> maybe_where_ilike(Needle.Pointer, :id, \"Alice\")\n #Ecto.Query<...>\n\n iex> maybe_where_ilike(Needle.Pointer, :id, \"Al%ice\")\n Needle.Pointer \n # ^ unchanged due to unsafe query","ref":"Bonfire.Common.Repo.html#maybe_where_ilike/5-examples"},{"type":"function","title":"Bonfire.Common.Repo.migrate/0","doc":"","ref":"Bonfire.Common.Repo.html#migrate/0"},{"type":"function","title":"Bonfire.Common.Repo.one/2","doc":"","ref":"Bonfire.Common.Repo.html#one/2"},{"type":"function","title":"Bonfire.Common.Repo.one!/2","doc":"","ref":"Bonfire.Common.Repo.html#one!/2"},{"type":"function","title":"Bonfire.Common.Repo.paginate/2","doc":"Different implementation for pagination using Scrivener (used by eg. rauversion).","ref":"Bonfire.Common.Repo.html#paginate/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.paginate/2","doc":"iex> paginate(User, page: 1, page_size: 10)\n %Scrivener.Page{}","ref":"Bonfire.Common.Repo.html#paginate/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.pluck/3","doc":"Select and return only specific fields (specified as an atom or list of atoms)","ref":"Bonfire.Common.Repo.html#pluck/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.pluck/3","doc":"> pluck(:id)\n [id1, id2]\n\n > pluck([:id, :inserted_at])\n [%{id: id1, inserted_at: _}, %{id: id2, inserted_at: _}]","ref":"Bonfire.Common.Repo.html#pluck/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.preload/3","doc":"","ref":"Bonfire.Common.Repo.html#preload/3"},{"type":"function","title":"Bonfire.Common.Repo.preload_all/2","doc":"","ref":"Bonfire.Common.Repo.html#preload_all/2"},{"type":"function","title":"Bonfire.Common.Repo.preload_mixins/2","doc":"","ref":"Bonfire.Common.Repo.html#preload_mixins/2"},{"type":"function","title":"Bonfire.Common.Repo.prepare_query/3","doc":"","ref":"Bonfire.Common.Repo.html#prepare_query/3"},{"type":"function","title":"Bonfire.Common.Repo.put/1","doc":"Like `insert/1`, but understands remapping changeset errors to attr\nnames from config (and only config, no overrides at present!)","ref":"Bonfire.Common.Repo.html#put/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.put/1","doc":"iex> changeset = %Ecto.Changeset{valid?: false}\n iex> put(changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.Repo.html#put/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.put_dynamic_repo/1","doc":"","ref":"Bonfire.Common.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Bonfire.Common.Repo.put_many/1","doc":"Like `put/1` but for multiple `changesets`","ref":"Bonfire.Common.Repo.html#put_many/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.put_many/1","doc":"iex> changesets = [%{valid?: true}, %{valid?: false}]\n iex> put_many(changesets)\n {:error, [%{valid?: false}]}\n\n iex> changesets = [%{valid?: true}, %{valid?: true}]\n iex> put_many(changesets)\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#put_many/1-examples"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query!/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query_many/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query_many!/3"},{"type":"function","title":"Bonfire.Common.Repo.reload/2","doc":"","ref":"Bonfire.Common.Repo.html#reload/2"},{"type":"function","title":"Bonfire.Common.Repo.reload!/2","doc":"","ref":"Bonfire.Common.Repo.html#reload!/2"},{"type":"function","title":"Bonfire.Common.Repo.rollback/1","doc":"","ref":"Bonfire.Common.Repo.html#rollback/1"},{"type":"function","title":"Bonfire.Common.Repo.single/1","doc":"Execute a query for one result and return either an `{:ok, result}` or `{:error, :not_found}` tuple.","ref":"Bonfire.Common.Repo.html#single/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.single/1","doc":"iex> single(from u in User, where: u.id == 1)\n {:ok, %User{}}\n\n iex> single(from u in User, where: u.id == 999)\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#single/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.sql/3","doc":"Executes raw SQL query.","ref":"Bonfire.Common.Repo.html#sql/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.sql/3","doc":"> YourModule.sql(\"SELECT * FROM pointers\")","ref":"Bonfire.Common.Repo.html#sql/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.start_link/1","doc":"","ref":"Bonfire.Common.Repo.html#start_link/1"},{"type":"function","title":"Bonfire.Common.Repo.stop/1","doc":"","ref":"Bonfire.Common.Repo.html#stop/1"},{"type":"function","title":"Bonfire.Common.Repo.stream/2","doc":"","ref":"Bonfire.Common.Repo.html#stream/2"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#to_sql/2"},{"type":"function","title":"Bonfire.Common.Repo.trace/1","doc":"Can be used to log specific queries (by calling function) in production.","ref":"Bonfire.Common.Repo.html#trace/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.trace/1","doc":"iex> trace(fn -> Repo.all(User) end)\n [%User{}, %User{}]","ref":"Bonfire.Common.Repo.html#trace/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.transact_many/1","doc":"","ref":"Bonfire.Common.Repo.html#transact_many/1"},{"type":"function","title":"Bonfire.Common.Repo.transact_with/2","doc":"Run a transaction, similar to `Repo.transaction/1`, but it expects an ok or error\ntuple. If an error tuple is returned, the transaction is aborted.","ref":"Bonfire.Common.Repo.html#transact_with/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.transact_with/2","doc":"iex> transact_with(fn -> {:ok, \"success\"} end)\n \"success\"\n\n iex> transact_with(fn -> {:error, \"failure\"} end)\n ** (Ecto.RollbackError) Rolling back the DB transaction, error reason: failure","ref":"Bonfire.Common.Repo.html#transact_with/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.transaction/2","doc":"","ref":"Bonfire.Common.Repo.html#transaction/2"},{"type":"function","title":"Bonfire.Common.Repo.update/2","doc":"","ref":"Bonfire.Common.Repo.html#update/2"},{"type":"function","title":"Bonfire.Common.Repo.update!/2","doc":"","ref":"Bonfire.Common.Repo.html#update!/2"},{"type":"function","title":"Bonfire.Common.Repo.update_all/3","doc":"","ref":"Bonfire.Common.Repo.html#update_all/3"},{"type":"function","title":"Bonfire.Common.Repo.upsert/3","doc":"Inserts or updates data in the database with upsert semantics.\n\n* `cs` - The changeset or schema to insert or update.\n* `keys_or_attrs_to_update` - A list of keys or a map of attributes to update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.Repo.html#upsert/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.upsert/3","doc":"iex> upsert(%Ecto.Changeset{}, [:field1, :field2])\n {:ok, _result}\n\n iex> upsert(%Ecto.Changeset{}, %{field1: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#upsert/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.upsert_all/3","doc":"Insert or update all entries with upsert semantics.\n\n* `schema` - The schema or table name to insert or update.\n* `data` - A list of maps containing the data to insert or update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.Repo.html#upsert_all/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.upsert_all/3","doc":"iex> upsert_all(User, [%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n {:ok, _result}\n\n iex> upsert_all(User, [%{id: 1, name: \"Alice Updated\"}], [:id])\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#upsert_all/3-examples"},{"type":"module","title":"Bonfire.Common.Repo.Delete","doc":"Helpers for deleting Ecto data","ref":"Bonfire.Common.Repo.Delete.html"},{"type":"function","title":"Bonfire.Common.Repo.Delete.deletion_result/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#deletion_result/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.deletion_result!/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#deletion_result!/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.hard_delete/1","doc":"Actually deletes an entry from the database.","ref":"Bonfire.Common.Repo.Delete.html#hard_delete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.hard_delete/1","doc":"iex> hard_delete(some_entry)\n {:ok, some_entry}\n\n iex> hard_delete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#hard_delete/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.hard_delete!/1","doc":"Actually deletes an entry from the database, or throws an error.","ref":"Bonfire.Common.Repo.Delete.html#hard_delete!/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.hard_delete!/1","doc":"iex> hard_delete!(some_entry)\n some_entry\n\n iex> hard_delete!(non_existent_entry)\n ** (RuntimeError) :deletion_error","ref":"Bonfire.Common.Repo.Delete.html#hard_delete!/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.maybe_allow_delete?/2","doc":"","ref":"Bonfire.Common.Repo.Delete.html#maybe_allow_delete?/2"},{"type":"function","title":"Bonfire.Common.Repo.Delete.schema/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#schema/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete/1","doc":"Marks an entry as deleted in the database.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete/1","doc":"iex> soft_delete(some_entry)\n {:ok, some_entry}\n\n iex> soft_delete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#soft_delete/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete!/1","doc":"Marks an entry as deleted in the database or throws an error.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete!/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete!/1","doc":"iex> soft_delete!(some_entry)\n some_entry\n\n iex> soft_delete!(non_existent_entry)\n ** (RuntimeError) :deletion_error","ref":"Bonfire.Common.Repo.Delete.html#soft_delete!/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete_changeset/4","doc":"Creates a changeset for marking an entity as deleted.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete_changeset/4"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete_changeset/4","doc":"iex> soft_delete_changeset(some_entry)\n %Ecto.Changeset{...}\n\n iex> soft_delete_changeset({SomeSchema, some_entry}, :deleted_at, nil, \"was already deleted\")\n %Ecto.Changeset{...}","ref":"Bonfire.Common.Repo.Delete.html#soft_delete_changeset/4-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.undelete/1","doc":"Marks an entry as not deleted.","ref":"Bonfire.Common.Repo.Delete.html#undelete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.undelete/1","doc":"iex> undelete(some_entry)\n {:ok, some_entry}\n\n iex> undelete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#undelete/1-examples"},{"type":"module","title":"Bonfire.Common.Repo.Filter","doc":"`query_filter` brings convenience and shortens the boilterplate of ecto queries\n\nCommon filters available include:\n\n- `preload` - Preloads fields onto the query results\n- `start_date` - Query for items inserted after this date\n- `end_date` - Query for items inserted before this date\n- `before` - Get items with IDs before this value\n- `after` - Get items with IDs after this value\n- `ids` - Get items with a list of ids\n- `first` - Gets the first n items\n- `last` - Gets the last n items\n- `limit` - Gets the first n items\n- `offset` - Offsets limit by n items\n- `search` - ***Warning:*** This requires schemas using this to have a `&by_search(query, val)` function\n\nYou are also able to filter on any natural field of a model, as well as use\n\n- gte/gt\n- lte/lt\n- like/ilike\n- is_nil/not(is_nil)\n\n```elixir\nquery_filter(User, %{name: %{ilike: \"steve\"}})\nquery_filter(User, %{name: %{ilike: \"steve\"}}, :last_name, :asc)\nquery_filter(User, %{name: %{age: %{gte: 18, lte: 30}}})\nquery_filter(User, %{name: %{is_banned: %{!=: nil}}})\nquery_filter(User, %{name: %{is_banned: %{==: nil}}})\n\nmy_query = query_filter(User, %{name: \"Billy\"})\nquery_filter(my_query, %{last_name: \"Joe\"})\n```","ref":"Bonfire.Common.Repo.Filter.html"},{"type":"function","title":"Bonfire.Common.Repo.Filter.query_filter/4","doc":"","ref":"Bonfire.Common.Repo.Filter.html#query_filter/4"},{"type":"module","title":"Bonfire.Common.Repo.Preload","doc":"Helpers for preloading Ecto struct associations","ref":"Bonfire.Common.Repo.Preload.html"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preload/3","doc":"Conditionally preloads associations based on provided options.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preload/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preload/3","doc":"iex> maybe_preload(some_struct, [:assoc1, :assoc2])\n %{...}\n\n iex> maybe_preload({:ok, some_struct}, [:assoc1, :assoc2])\n {:ok, %{...}}","ref":"Bonfire.Common.Repo.Preload.html#maybe_preload/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preloads_per_nested_schema/4","doc":"Conditionally preloads associations for nested schemas.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_nested_schema/4"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preloads_per_nested_schema/4","doc":"iex> maybe_preloads_per_nested_schema(objects, path, preloads)\n [%{...}, %{...}]","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_nested_schema/4-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preloads_per_schema/3","doc":"Conditionally preloads associations for a schema.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_schema/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preloads_per_schema/3","doc":"iex> maybe_preloads_per_schema(some_struct, {Schema, [:assoc1, :assoc2]})\n\n iex> maybe_preloads_per_schema(pointer_struct, {PointerSchema, [:assoc1, :assoc2]})","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_schema/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.preload_all/2","doc":"Preloads all associations for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#preload_all/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.preload_all/2","doc":"iex> preload_all(some_struct)","ref":"Bonfire.Common.Repo.Preload.html#preload_all/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.preload_mixins/2","doc":"Preloads mixin associations for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#preload_mixins/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.preload_mixins/2","doc":"iex> preload_mixins(some_struct)","ref":"Bonfire.Common.Repo.Preload.html#preload_mixins/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.schema_mixins/1","doc":"Retrieves schema mixins for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#schema_mixins/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.schema_mixins/1","doc":"iex> schema_mixins(some_struct)\n [:assoc1, :assoc2]","ref":"Bonfire.Common.Repo.Preload.html#schema_mixins/1-examples"},{"type":"module","title":"Bonfire.Common.Repo.Utils","doc":"Helper functions for changesets","ref":"Bonfire.Common.Repo.Utils.html"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_disabled/1","doc":"Keeps disabled_at in accord with is_disabled","ref":"Bonfire.Common.Repo.Utils.html#change_disabled/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_muted/1","doc":"Keeps muted_at in accord with is_muted","ref":"Bonfire.Common.Repo.Utils.html#change_muted/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_public/1","doc":"Keeps published_at in accord with is_public","ref":"Bonfire.Common.Repo.Utils.html#change_public/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_synced_timestamp/3","doc":"If a changeset includes a change to `bool_field`, we ensure that the\n`timestamp` field is updated if required. In the case of true, this\nmeans setting it to now if it is null and in the case of false, this\nmeans setting it to null if it is not null.","ref":"Bonfire.Common.Repo.Utils.html#change_synced_timestamp/3"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_synced_timestamps/5","doc":"If a changeset includes a change to `bool_field`, we change two\ntimestamps columns (representing activated and deactivated) so that\nonly one is set to a non-null value at a time.","ref":"Bonfire.Common.Repo.Utils.html#change_synced_timestamps/5"},{"type":"macro","title":"Bonfire.Common.Repo.Utils.match_admin/0","doc":"","ref":"Bonfire.Common.Repo.Utils.html#match_admin/0"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_email/2","doc":"Validates an email for correctness","ref":"Bonfire.Common.Repo.Utils.html#validate_email/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_email_domain/2","doc":"","ref":"Bonfire.Common.Repo.Utils.html#validate_email_domain/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_exactly_one/3","doc":"","ref":"Bonfire.Common.Repo.Utils.html#validate_exactly_one/3"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_http_url/2","doc":"Validates that a URL uses HTTP(S) and has a correct format.","ref":"Bonfire.Common.Repo.Utils.html#validate_http_url/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_not_expired/4","doc":"Validates that the entity has not expired","ref":"Bonfire.Common.Repo.Utils.html#validate_not_expired/4"},{"type":"module","title":"Bonfire.Common.RepoTemplate","doc":"Common functions useful in Ecto Repos","ref":"Bonfire.Common.RepoTemplate.html"},{"type":"module","title":"Bonfire.Common.RuntimeConfig","doc":"Config and helpers for this library","ref":"Bonfire.Common.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.skip_test_tags/1","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#skip_test_tags/1"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.test_formatters/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#test_formatters/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.test_formatters/1","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#test_formatters/1"},{"type":"behaviour","title":"Bonfire.Common.SchemaModule","doc":"Find a context or query module via its schema, backed by a global cache of known schema modules to be queried by their schema, or vice versa (eg. via ContextModule).","ref":"Bonfire.Common.SchemaModule.html"},{"type":"function","title":"Bonfire.Common.SchemaModule.app_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.context_module/0","doc":"Points to the related context module","ref":"Bonfire.Common.SchemaModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.linked_context_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#linked_context_modules/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.linked_query_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#linked_query_modules/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#modules/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.query_module/0","doc":"Points to the related query module","ref":"Bonfire.Common.SchemaModule.html#c:query_module/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.schema_module/0","doc":"Declares a schema module","ref":"Bonfire.Common.SchemaModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.Settings","doc":"Helpers to get app/extension settings, or to override a config key.\n\nThis module provides functionality for fetching and updating application and extension settings. The process for fetching settings follows a bottom-up system of overrides:\n\n1. **User-specific settings:** \n If `opts` contains `current_user`, settings are fetched from the user's settings.\n\n2. **Account-specific settings:** \n If no settings are found for the user and `opts` contains `current_account`, settings are fetched from the account's settings.\n\n3. **Instance-specific settings:** \n NOTE: Changes to instance settings are stored both in the database and the OTP app config/application environment, and are loaded from the DB into OTP config at app startup by `Bonfire.Common.Settings.LoadInstanceConfig`.\n\n4. **Default OTP config:** \n If no settings are found at the user or account level, instance settings are loaded from OTP application configuration via `Bonfire.Common.Config`.\n\n5. **Default value:** \n If no settings are found in the previous steps, the provided `default` value is returned.","ref":"Bonfire.Common.Settings.html"},{"type":"function","title":"Bonfire.Common.Settings.do_get_in/2","doc":"","ref":"Bonfire.Common.Settings.html#do_get_in/2"},{"type":"function","title":"Bonfire.Common.Settings.get/3","doc":"Retrieves the setting value for a given config key or nested key path.\n\nAs explained above, this function checks settings in the following order:\n1. **User settings** (if `opts` contains `current_user`).\n2. **Account settings** (if `opts` contains `current_account` and no user settings are found).\n3. **Instance settings**.\n4. **OTP application config (includes compile time and runtime config)**.\n5. **Default value** (if no settings are found).","ref":"Bonfire.Common.Settings.html#get/3"},{"type":"function","title":"Examples - Bonfire.Common.Settings.get/3","doc":"iex> get(:test_key)\n \"test_value\"\n\n iex> get([:non_existing_extension, :sub_key])\n nil\n\n iex> get(:non_existing_key, \"default\")\n \"default\"\n\n iex> get(:otp_app)\n :bonfire\n\n iex> get([:bonfire_common, :otp_app])\n :bonfire\n \n iex> get([:bonfire_common, :otp_app])\n :bonfire\n\n iex> get([Bonfire.Common.Localise.Cldr, :gettext])\n Bonfire.Common.Localise.Gettext\n\n iex> get([:bonfire_common, Bonfire.Common.Localise.Cldr, :gettext])\n Bonfire.Common.Localise.Gettext","ref":"Bonfire.Common.Settings.html#get/3-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.get/3","doc":"* `:otp_app` - Optionally specifies the OTP application for which to fetch settings. If none is specified, it will look at the (first) key and check if it references a known OTP application (i.e. an extension) or a module, in which case it will fetch settings from that application. Otherwise it will look in the configured top-level OTP app (see `Config.top_level_otp_app/0`). \n * `:scope` - Optionally defines the scope for settings retrieval (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#get/3-options"},{"type":"function","title":"Bonfire.Common.Settings.get!/2","doc":"Retrieves the setting value for a given config key like in `get/3`, but raises an exception if the key is not found, ensuring that the setting must be present.","ref":"Bonfire.Common.Settings.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Settings.get!/2","doc":"iex> get!(:test_key)\n \"test_value\"\n\n iex> get!(:non_existing_key)\n ** (RuntimeError) Missing setting or configuration value: :non_existing_key","ref":"Bonfire.Common.Settings.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Settings.load_instance_settings/0","doc":"","ref":"Bonfire.Common.Settings.html#load_instance_settings/0"},{"type":"function","title":"Bonfire.Common.Settings.put/3","doc":"Sets a value for a specific key or list of nested keys.\n\nThis function updates the configuration with the provided value. You can specify a single key or a list of nested keys.","ref":"Bonfire.Common.Settings.html#put/3"},{"type":"function","title":"Examples - Bonfire.Common.Settings.put/3","doc":"# when no scope or current_user are passed in opts:\n > put(:some_key, \"new_value\")\n {:error, \"You need to be authenticated to change settings.\"}\n\n # when the scope is :instance but an admin isn't passed as current_user in opts:\n > put(:some_key, \"new_value\", scope: :instance)\n ** (Bonfire.Fail) You do not have permission to change instance settings. Please contact an admin.\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = put(:some_key, \"new_value\", skip_boundary_check: true, scope: :instance)\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = put([:top_key, :sub_key], \"new_value\", skip_boundary_check: true, scope: \"instance\")","ref":"Bonfire.Common.Settings.html#put/3-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.put/3","doc":"* `:otp_app` - Specifies the OTP application for which to set settings. If not specified, it decides where to put it using the same logic as `get/3`.\n * `:scope` - Defines the scope for settings (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#put/3-options"},{"type":"function","title":"Bonfire.Common.Settings.reset_all/0","doc":"Resets all settings.\n\nThis function deletes all settings from the database, including instance-specific settings and user-specific settings for all users. Please be careful!","ref":"Bonfire.Common.Settings.html#reset_all/0"},{"type":"function","title":"Examples - Bonfire.Common.Settings.reset_all/0","doc":"> reset_all()\n {:ok, %{}}","ref":"Bonfire.Common.Settings.html#reset_all/0-examples"},{"type":"function","title":"Bonfire.Common.Settings.reset_instance/0","doc":"Resets settings for the instance scope.\n\nThis function deletes the settings associated with the whole instance and returns the result.","ref":"Bonfire.Common.Settings.html#reset_instance/0"},{"type":"function","title":"Examples - Bonfire.Common.Settings.reset_instance/0","doc":"> reset_instance()\n {:ok, %Bonfire.Data.Identity.Settings{id: \"some_id\"}}","ref":"Bonfire.Common.Settings.html#reset_instance/0-examples"},{"type":"function","title":"Bonfire.Common.Settings.set/2","doc":"Sets multiple settings at once.\n\nThis function accepts a map or keyword list of settings to be updated. It determines the appropriate scope and updates the settings accordingly.","ref":"Bonfire.Common.Settings.html#set/2"},{"type":"function","title":"Examples - Bonfire.Common.Settings.set/2","doc":"> {:ok, %Bonfire.Data.Identity.Settings{}} = set(%{some_key: \"value\", another_key: \"another_value\"}, skip_boundary_check: true, scope: :instance)\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = set([some_key: \"value\", another_key: \"another_value\"], skip_boundary_check: true, scope: \"instance\")","ref":"Bonfire.Common.Settings.html#set/2-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.set/2","doc":"* `:otp_app` - Specifies the OTP application for which to set settings.\n * `:scope` - Defines the scope for settings (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#set/2-options"},{"type":"module","title":"Bonfire.Common.Settings.LiveHandler","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.input_name/1","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#input_name/1"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.maybe_assign_input_value_from_keys/1","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#maybe_assign_input_value_from_keys/1"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.scoped/2","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#scoped/2"},{"type":"macro","title":"Bonfire.Common.Settings.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Common.Settings.LoadInstanceConfig","doc":"Loads instance Settings (see `Bonfire.Common.Settings`) from DB into OTP config / application env (see `Bonfire.Common.Config`)\n\nWhile this module is a GenServer, it is only responsible for querying the settings, putting them in Config, and then exits with :ignore having done so.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.load_config/0","doc":"","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#load_config/0"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#start_link/1"},{"type":"module","title":"Bonfire.Common.Simulation","doc":"Fake data generators","ref":"Bonfire.Common.Simulation.html"},{"type":"function","title":"Bonfire.Common.Simulation.ap_url_base/0","doc":"Picks a unique random url for an ap endpoint","ref":"Bonfire.Common.Simulation.html#ap_url_base/0"},{"type":"function","title":"Bonfire.Common.Simulation.base64/0","doc":"Generates random base64 text","ref":"Bonfire.Common.Simulation.html#base64/0"},{"type":"function","title":"Bonfire.Common.Simulation.bool/0","doc":"Generates a random boolean","ref":"Bonfire.Common.Simulation.html#bool/0"},{"type":"function","title":"Bonfire.Common.Simulation.canonical_url/0","doc":"Picks a random canonical url and makes it unique","ref":"Bonfire.Common.Simulation.html#canonical_url/0"},{"type":"function","title":"Bonfire.Common.Simulation.content_type/0","doc":"Generate a random content type","ref":"Bonfire.Common.Simulation.html#content_type/0"},{"type":"function","title":"Bonfire.Common.Simulation.content_url/0","doc":"Picks a remote url from a set of available ones.","ref":"Bonfire.Common.Simulation.html#content_url/0"},{"type":"function","title":"Bonfire.Common.Simulation.date_of_birth/0","doc":"Generates a random date of birth based on an age range of 18-99","ref":"Bonfire.Common.Simulation.html#date_of_birth/0"},{"type":"function","title":"Bonfire.Common.Simulation.domain/0","doc":"Generates a random domain name","ref":"Bonfire.Common.Simulation.html#domain/0"},{"type":"function","title":"Bonfire.Common.Simulation.email/0","doc":"Generates a random unique email","ref":"Bonfire.Common.Simulation.html#email/0"},{"type":"function","title":"Bonfire.Common.Simulation.email_user/0","doc":"Generates the first half of an email address","ref":"Bonfire.Common.Simulation.html#email_user/0"},{"type":"function","title":"Bonfire.Common.Simulation.falsehood/0","doc":"Returns false","ref":"Bonfire.Common.Simulation.html#falsehood/0"},{"type":"function","title":"Bonfire.Common.Simulation.float/0","doc":"Generate a random floating point number","ref":"Bonfire.Common.Simulation.html#float/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_date/0","doc":"Picks a date up to 300 days in the future, not including today","ref":"Bonfire.Common.Simulation.html#future_date/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_datetime/0","doc":"Picks a datetime up to 300 days in the future, not including today","ref":"Bonfire.Common.Simulation.html#future_datetime/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_datetime_iso/0","doc":"Same as future_datetime, but as an ISO8601 formatted string.","ref":"Bonfire.Common.Simulation.html#future_datetime_iso/0"},{"type":"function","title":"Bonfire.Common.Simulation.icon/0","doc":"Picks an icon url","ref":"Bonfire.Common.Simulation.html#icon/0"},{"type":"function","title":"Bonfire.Common.Simulation.image/0","doc":"Picks an image url","ref":"Bonfire.Common.Simulation.html#image/0"},{"type":"function","title":"Bonfire.Common.Simulation.integer/0","doc":"Generate a random signed integer","ref":"Bonfire.Common.Simulation.html#integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.license/0","doc":"A random license for content","ref":"Bonfire.Common.Simulation.html#license/0"},{"type":"function","title":"Bonfire.Common.Simulation.location/0","doc":"Returns a city and country","ref":"Bonfire.Common.Simulation.html#location/0"},{"type":"function","title":"Bonfire.Common.Simulation.long_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#long_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.long_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#long_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.markdown/0","doc":"","ref":"Bonfire.Common.Simulation.html#markdown/0"},{"type":"function","title":"Bonfire.Common.Simulation.maybe_bool/0","doc":"Generate a random boolean that can also be nil","ref":"Bonfire.Common.Simulation.html#maybe_bool/0"},{"type":"function","title":"Bonfire.Common.Simulation.maybe_one_of/1","doc":"","ref":"Bonfire.Common.Simulation.html#maybe_one_of/1"},{"type":"function","title":"Bonfire.Common.Simulation.med_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#med_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.med_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#med_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.name/0","doc":"Picks a name","ref":"Bonfire.Common.Simulation.html#name/0"},{"type":"function","title":"Bonfire.Common.Simulation.neg_integer/0","doc":"Generate a random negative integer","ref":"Bonfire.Common.Simulation.html#neg_integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.one_of/1","doc":"","ref":"Bonfire.Common.Simulation.html#one_of/1"},{"type":"function","title":"Bonfire.Common.Simulation.paragraph/0","doc":"Generates a random paragraph","ref":"Bonfire.Common.Simulation.html#paragraph/0"},{"type":"function","title":"Bonfire.Common.Simulation.password/0","doc":"Generates a random password string","ref":"Bonfire.Common.Simulation.html#password/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_date/0","doc":"Picks a date up to 300 days in the past, not including today","ref":"Bonfire.Common.Simulation.html#past_date/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_datetime/0","doc":"Picks a datetime up to 300 days in the past, not including today","ref":"Bonfire.Common.Simulation.html#past_datetime/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_datetime_iso/0","doc":"Same as past_datetime, but as an ISO8601 formatted string.","ref":"Bonfire.Common.Simulation.html#past_datetime_iso/0"},{"type":"function","title":"Bonfire.Common.Simulation.path/0","doc":"Picks a path from a set of available files.","ref":"Bonfire.Common.Simulation.html#path/0"},{"type":"function","title":"Bonfire.Common.Simulation.pos_integer/0","doc":"Generate a random positive integer","ref":"Bonfire.Common.Simulation.html#pos_integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.preferred_username/0","doc":"Picks a unique preferred_username","ref":"Bonfire.Common.Simulation.html#preferred_username/0"},{"type":"function","title":"Bonfire.Common.Simulation.short_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#short_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.short_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#short_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.signing_key/0","doc":"Picks a fake signing key","ref":"Bonfire.Common.Simulation.html#signing_key/0"},{"type":"function","title":"Bonfire.Common.Simulation.some/2","doc":"Repeats a function count times if count_or_range is a positive integer.\n\nIf count_or_range is a positive range, a random number from this\nrange is selected and that value used as a count","ref":"Bonfire.Common.Simulation.html#some/2"},{"type":"function","title":"Bonfire.Common.Simulation.summary/0","doc":"Picks a summary text paragraph","ref":"Bonfire.Common.Simulation.html#summary/0"},{"type":"function","title":"Bonfire.Common.Simulation.title/0","doc":"","ref":"Bonfire.Common.Simulation.html#title/0"},{"type":"function","title":"Bonfire.Common.Simulation.truth/0","doc":"Returns true","ref":"Bonfire.Common.Simulation.html#truth/0"},{"type":"function","title":"Bonfire.Common.Simulation.uid/1","doc":"Generates a random unique ID, optionally for a specific schema","ref":"Bonfire.Common.Simulation.html#uid/1"},{"type":"function","title":"Bonfire.Common.Simulation.ulid/0","doc":"Generates a random unique ULID","ref":"Bonfire.Common.Simulation.html#ulid/0"},{"type":"function","title":"Bonfire.Common.Simulation.url/0","doc":"Generates a random url","ref":"Bonfire.Common.Simulation.html#url/0"},{"type":"function","title":"Bonfire.Common.Simulation.username/0","doc":"Generates a random username","ref":"Bonfire.Common.Simulation.html#username/0"},{"type":"function","title":"Bonfire.Common.Simulation.uuid/0","doc":"Generates a random unique UUID","ref":"Bonfire.Common.Simulation.html#uuid/0"},{"type":"function","title":"Bonfire.Common.Simulation.verb/0","doc":"A verb to be used for an activity.","ref":"Bonfire.Common.Simulation.html#verb/0"},{"type":"function","title":"Bonfire.Common.Simulation.website/0","doc":"A website address","ref":"Bonfire.Common.Simulation.html#website/0"},{"type":"module","title":"Bonfire.Common.StartupTimer","doc":"Open the console without starting the app: `iex -S mix run --no-start` or `just imix run --no-start`\n\nAnd then run `Bonfire.Common.StartupTimer.run()`","ref":"Bonfire.Common.StartupTimer.html"},{"type":"function","title":"Bonfire.Common.StartupTimer.run/1","doc":"","ref":"Bonfire.Common.StartupTimer.html#run/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive","doc":"This utility allows to get the same effect of using\n`fcwatch | mix test --stale --listen-on-stdin` to watch for\ncode changes and run stale tests, but with more control and\nwithout the starting time penalty.\n\nNote that watching requires fswatch on your system.\nEg on Mac run `brew install fswatch`.\n\nTo use it, in your project's `.iex` file add:\n```\nunless GenServer.whereis(Bonfire.Common.Test.Interactive) do\n {:ok, pid} = Bonfire.Common.Test.Interactive.start_link()\n # Process will not exit when the iex goes out\n Process.unlink(pid)\nend\nimport Bonfire.Common.Test.Interactive.Helpers\n```\nThen to call `iex` and run tests just do:\n```\nMIX_ENV=test iex -S mix\n```\nThe `Bonfire.Common.Test.Interactive.Helpers` allows to call `f` and `s` and `a`\nto run failed, stale and all tests respectively.\nYou can call `w` to watch tests and `uw` to unwatch.\nThere is a really simple throttle mecanism that disallow running the suite concurrently.","ref":"Bonfire.Common.Test.Interactive.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Test.Interactive.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_all_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_all_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_failed_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_failed_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_stale_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_stale_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.setup_test_repo/1","doc":"Sets up database options for tests\n\nYou can tell a specific test to not wrap in a transaction and rollback with:\n`@tag db_sandbox: false`","ref":"Bonfire.Common.Test.Interactive.html#setup_test_repo/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.start_link/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#start_link/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.unlock/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#unlock/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.unwatch_tests/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#unwatch_tests/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.watch_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#watch_tests/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive.Helpers","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.f/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#f/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.ready/0","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#ready/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.s/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#s/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.ta/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#ta/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.uw/0","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#uw/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.w/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#w/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive.Observer","doc":"","ref":"Bonfire.Common.Test.Interactive.Observer.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Observer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Test.Interactive.Observer.html#child_spec/1"},{"type":"module","title":"Bonfire.Common.TestInstanceRepo","doc":"Special Ecto Repo used for federation testing.\n\nNote: more generic functions are defined in `Bonfire.Common.RepoTemplate`","ref":"Bonfire.Common.TestInstanceRepo.html"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.aggregate/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#aggregate/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.aggregate/4","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#aggregate/4"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.apply/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#apply/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.checked_out?/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#checked_out?/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.checkout/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#checkout/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.child_spec/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.config/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#config/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_endpoint/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_endpoint/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_options/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_options/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_repo/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_repo/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_repo_opts/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_repo_opts/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete_all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete_many/1","doc":"Execute a query to delete all matching records.","ref":"Bonfire.Common.TestInstanceRepo.html#delete_many/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.delete_many/1","doc":"iex> delete_many(from u in User, where: u.id < 100)\n {:ok, _count}","ref":"Bonfire.Common.TestInstanceRepo.html#delete_many/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#disconnect_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.exists?/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#exists?/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#explain/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch/2","doc":"Execute a query for one result where the primary key matches the given id, and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch/2","doc":"iex> fetch(User, 1)\n {:ok, %User{}}\n\n iex> fetch(User, 999)\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#fetch/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch_all/2","doc":"Execute a query for multiple results given one or multiple IDs.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_all/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch_all/2","doc":"iex> fetch_all(User, [1, 2, 3])\n [%User{}, %User{}, %User{}]\n\n iex> fetch_all(User, 999)\n []","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_all/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch_by/2","doc":"Execute a query for one result (using a keyword list to specify the key/value to query with), and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_by/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch_by/2","doc":"iex> fetch_by(User, name: \"Alice\")\n {:ok, %User{}}\n\n iex> fetch_by(User, name: \"Nonexistent\")\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_by/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.find/3","doc":"Like `single/1`, except on failure, adds an error to the changeset.","ref":"Bonfire.Common.TestInstanceRepo.html#find/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.find/3","doc":"iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 1, changeset)\n {:ok, %User{}}\n\n iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 999, changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.TestInstanceRepo.html#find/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get!/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_by/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_by/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_by!/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_by!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_dynamic_repo/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.in_transaction?/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#in_transaction?/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_all/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_all_or_ignore/2","doc":"Insert all or ignore a list of maps into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_all_or_ignore/2","doc":"iex> insert_all_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_ignore/1","doc":"Insert or ignore a changeset or struct into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_or_ignore/1","doc":"iex> insert_or_ignore(%Ecto.Changeset{})\n {:ok, _result}\n\n iex> insert_or_ignore(%MySchema{field: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_ignore/2","doc":"Insert or ignore a map (or iterate over a list of maps) into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_or_ignore/2","doc":"iex> insert_or_ignore(MySchema, %{field: \"value\"})\n [{:ok, _result}]\n\n iex> insert_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n [{:ok, _result}]","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_update/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_update/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_update!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_update!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.load/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#load/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.make_subquery/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#make_subquery/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.many/2","doc":"Execute a query for multiple results and return the results.","ref":"Bonfire.Common.TestInstanceRepo.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.many/2","doc":"iex> many(from u in User)\n [%User{}, %User{}]\n\n iex> many(from u in User, return: :query)\n #Ecto.Query<...>","ref":"Bonfire.Common.TestInstanceRepo.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.many_paginated/3","doc":"Execute a query for multiple results and return one page of results.\nThis uses the main implementation for pagination, which is cursor-based and powered by the `Paginator` library.","ref":"Bonfire.Common.TestInstanceRepo.html#many_paginated/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.many_paginated/3","doc":"iex> many_paginated(User, [limit: 10])\n %Paginator.Page{}","ref":"Bonfire.Common.TestInstanceRepo.html#many_paginated/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_declare_test_instance/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_declare_test_instance/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_one/2","doc":"Execute a query for one result and return either a result or a fallback value (`nil` by default).","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_one/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.maybe_one/2","doc":"iex> maybe_one(from u in User, where: u.id == 1)\n %User{}\n\n iex> maybe_one(from u in User, where: u.id == 999, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_one/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_preload/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_preload/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_where_ilike/5","doc":"Add an `ilike` clause to a query if the user query is safe.","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_where_ilike/5"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.maybe_where_ilike/5","doc":"iex> maybe_where_ilike(Needle.Pointer, :id, \"Alice\")\n #Ecto.Query<...>\n\n iex> maybe_where_ilike(Needle.Pointer, :id, \"Al%ice\")\n Needle.Pointer \n # ^ unchanged due to unsafe query","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_where_ilike/5-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.one/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#one/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.one!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#one!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.paginate/2","doc":"Different implementation for pagination using Scrivener (used by eg. rauversion).","ref":"Bonfire.Common.TestInstanceRepo.html#paginate/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.paginate/2","doc":"iex> paginate(User, page: 1, page_size: 10)\n %Scrivener.Page{}","ref":"Bonfire.Common.TestInstanceRepo.html#paginate/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.pluck/3","doc":"Select and return only specific fields (specified as an atom or list of atoms)","ref":"Bonfire.Common.TestInstanceRepo.html#pluck/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.pluck/3","doc":"> pluck(:id)\n [id1, id2]\n\n > pluck([:id, :inserted_at])\n [%{id: id1, inserted_at: _}, %{id: id2, inserted_at: _}]","ref":"Bonfire.Common.TestInstanceRepo.html#pluck/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload_all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload_mixins/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload_mixins/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.prepare_query/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#prepare_query/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.process_put/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#process_put/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put/1","doc":"Like `insert/1`, but understands remapping changeset errors to attr\nnames from config (and only config, no overrides at present!)","ref":"Bonfire.Common.TestInstanceRepo.html#put/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.put/1","doc":"iex> changeset = %Ecto.Changeset{valid?: false}\n iex> put(changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.TestInstanceRepo.html#put/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put_dynamic_repo/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put_many/1","doc":"Like `put/1` but for multiple `changesets`","ref":"Bonfire.Common.TestInstanceRepo.html#put_many/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.put_many/1","doc":"iex> changesets = [%{valid?: true}, %{valid?: false}]\n iex> put_many(changesets)\n {:error, [%{valid?: false}]}\n\n iex> changesets = [%{valid?: true}, %{valid?: true}]\n iex> put_many(changesets)\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#put_many/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query_many/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query_many!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.reload/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#reload/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.reload!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#reload!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.rollback/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#rollback/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.single/1","doc":"Execute a query for one result and return either an `{:ok, result}` or `{:error, :not_found}` tuple.","ref":"Bonfire.Common.TestInstanceRepo.html#single/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.single/1","doc":"iex> single(from u in User, where: u.id == 1)\n {:ok, %User{}}\n\n iex> single(from u in User, where: u.id == 999)\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#single/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.sql/3","doc":"Executes raw SQL query.","ref":"Bonfire.Common.TestInstanceRepo.html#sql/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.sql/3","doc":"> YourModule.sql(\"SELECT * FROM pointers\")","ref":"Bonfire.Common.TestInstanceRepo.html#sql/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.start_link/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#start_link/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.stop/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#stop/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.stream/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#stream/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#to_sql/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.trace/1","doc":"Can be used to log specific queries (by calling function) in production.","ref":"Bonfire.Common.TestInstanceRepo.html#trace/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.trace/1","doc":"iex> trace(fn -> Repo.all(User) end)\n [%User{}, %User{}]","ref":"Bonfire.Common.TestInstanceRepo.html#trace/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transact_many/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#transact_many/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transact_with/2","doc":"Run a transaction, similar to `Repo.transaction/1`, but it expects an ok or error\ntuple. If an error tuple is returned, the transaction is aborted.","ref":"Bonfire.Common.TestInstanceRepo.html#transact_with/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.transact_with/2","doc":"iex> transact_with(fn -> {:ok, \"success\"} end)\n \"success\"\n\n iex> transact_with(fn -> {:error, \"failure\"} end)\n ** (Ecto.RollbackError) Rolling back the DB transaction, error reason: failure","ref":"Bonfire.Common.TestInstanceRepo.html#transact_with/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transaction/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#transaction/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update_all/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update_all/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.upsert/3","doc":"Inserts or updates data in the database with upsert semantics.\n\n* `cs` - The changeset or schema to insert or update.\n* `keys_or_attrs_to_update` - A list of keys or a map of attributes to update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.TestInstanceRepo.html#upsert/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.upsert/3","doc":"iex> upsert(%Ecto.Changeset{}, [:field1, :field2])\n {:ok, _result}\n\n iex> upsert(%Ecto.Changeset{}, %{field1: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#upsert/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.upsert_all/3","doc":"Insert or update all entries with upsert semantics.\n\n* `schema` - The schema or table name to insert or update.\n* `data` - A list of maps containing the data to insert or update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.TestInstanceRepo.html#upsert_all/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.upsert_all/3","doc":"iex> upsert_all(User, [%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n {:ok, _result}\n\n iex> upsert_all(User, [%{id: 1, name: \"Alice Updated\"}], [:id])\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#upsert_all/3-examples"},{"type":"module","title":"Bonfire.Common.Text","doc":"Helpers for handling plain or rich text (markdown, HTML, etc)","ref":"Bonfire.Common.Text.html"},{"type":"function","title":"Bonfire.Common.Text.blank?/1","doc":"Checks if a string is blank.","ref":"Bonfire.Common.Text.html#blank?/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.blank?/1","doc":"iex> blank?(nil)\n true\n\n iex> blank?(\" \")\n true\n\n iex> blank?(\"not blank\")\n false","ref":"Bonfire.Common.Text.html#blank?/1-examples"},{"type":"function","title":"Bonfire.Common.Text.camelise/1","doc":"Converts a string to CamelCase.","ref":"Bonfire.Common.Text.html#camelise/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.camelise/1","doc":"iex> camelise(\"hello world\")\n \"HelloWorld\"","ref":"Bonfire.Common.Text.html#camelise/1-examples"},{"type":"function","title":"Bonfire.Common.Text.code_syntax/2","doc":"Highlights code using Makeup or falls back to Phoenix.HTML if unsupported.","ref":"Bonfire.Common.Text.html#code_syntax/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.code_syntax/2","doc":"> code_syntax(\"defmodule Test {}\", \"test.ex\")\n #=> \" defmodule Test {} \"","ref":"Bonfire.Common.Text.html#code_syntax/2-examples"},{"type":"function","title":"Bonfire.Common.Text.contains?/2","doc":"Checks if a string contains a substring.","ref":"Bonfire.Common.Text.html#contains?/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.contains?/2","doc":"iex> contains?(\"hello world\", \"world\")\n true\n\n iex> contains?(\"hello world\", \"foo\")\n false","ref":"Bonfire.Common.Text.html#contains?/2-examples"},{"type":"function","title":"Bonfire.Common.Text.contains_html?/1","doc":"Checks if a string contains HTML tags.","ref":"Bonfire.Common.Text.html#contains_html?/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.contains_html?/1","doc":"iex> contains_html?(\" Test \")\n true\n\n iex> contains_html?(\"Just text\")\n false","ref":"Bonfire.Common.Text.html#contains_html?/1-examples"},{"type":"function","title":"Bonfire.Common.Text.hash/2","doc":"Hashes the input using a specified algorithm.","ref":"Bonfire.Common.Text.html#hash/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.hash/2","doc":"iex> hash(\"data\", algorithm: :sha256)\n \"Om6weQ85rIfJTzhWst0sXREOaBFgImGpqSPTuyOtyLc\"\n\n iex> hash(\"data\")\n \"jXd_OF09_siBXSD3SWAm3A\"","ref":"Bonfire.Common.Text.html#hash/2-examples"},{"type":"function","title":"Bonfire.Common.Text.list_checkboxes/1","doc":"Lists all checkboxes from the text.","ref":"Bonfire.Common.Text.html#list_checkboxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_checkboxes/1","doc":"> list_checkboxes(\"* [ ] task\n* [x] done\")\n [[\" \", \"task\"], [\" \", \"done\"]]","ref":"Bonfire.Common.Text.html#list_checkboxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.list_checked_boxes/1","doc":"Lists checked boxes from the text.","ref":"Bonfire.Common.Text.html#list_checked_boxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_checked_boxes/1","doc":"> list_checked_boxes(\"* [x] done\")\n [[\"done\"]]","ref":"Bonfire.Common.Text.html#list_checked_boxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.list_unchecked_boxes/1","doc":"Lists unchecked boxes from the text.","ref":"Bonfire.Common.Text.html#list_unchecked_boxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_unchecked_boxes/1","doc":"> list_unchecked_boxes(\"* [ ] task\")\n [[\"task\"]]","ref":"Bonfire.Common.Text.html#list_unchecked_boxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.make_local_links_live/1","doc":"Makes local links within content live.","ref":"Bonfire.Common.Text.html#make_local_links_live/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.make_local_links_live/1","doc":"> make_local_links_live(\" Link \")\n \" Link \"","ref":"Bonfire.Common.Text.html#make_local_links_live/1-examples"},{"type":"function","title":"Bonfire.Common.Text.markdown_as_html_earmark/2","doc":"","ref":"Bonfire.Common.Text.html#markdown_as_html_earmark/2"},{"type":"function","title":"Bonfire.Common.Text.markdown_as_html_mdex/2","doc":"","ref":"Bonfire.Common.Text.html#markdown_as_html_mdex/2"},{"type":"function","title":"Bonfire.Common.Text.markdown_checkboxes/1","doc":"Converts markdown checkboxes to HTML checkboxes.","ref":"Bonfire.Common.Text.html#markdown_checkboxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.markdown_checkboxes/1","doc":"> markdown_checkboxes(\"* [ ] task\n* [x] done\")\n \" task done \"","ref":"Bonfire.Common.Text.html#markdown_checkboxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_emote/3","doc":"Converts text to emotes if the Emote module is enabled.","ref":"Bonfire.Common.Text.html#maybe_emote/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_emote/3","doc":"iex> maybe_emote(\":smile:\", nil, [])\n \"😄\"","ref":"Bonfire.Common.Text.html#maybe_emote/3-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_markdown_to_html/2","doc":"Converts the input content from markdown to HTML if the markdown library is enabled.\nIf the content starts with an HTML tag or if the markdown library is not enabled, it skips conversion.\n\n > Bonfire.Common.Text.maybe_markdown_to_html(\"*Hello World*\", [])\n \" Hello World \"\n\n iex> Bonfire.Common.Text.maybe_markdown_to_html(\" Hello \", [])\n \" Hello \"\n\n > Bonfire.Common.Text.maybe_markdown_to_html(\"Not markdown\", [])\n \" Not markdown \"","ref":"Bonfire.Common.Text.html#maybe_markdown_to_html/2"},{"type":"function","title":"Bonfire.Common.Text.maybe_normalize_html/1","doc":"Normalizes HTML content, handling various edge cases.","ref":"Bonfire.Common.Text.html#maybe_normalize_html/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_normalize_html/1","doc":"iex> maybe_normalize_html(\" Test \")\n \"Test\"\n\n iex> maybe_normalize_html(\" \")\n \"\"","ref":"Bonfire.Common.Text.html#maybe_normalize_html/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_other_custom_emoji/2","doc":"","ref":"Bonfire.Common.Text.html#maybe_other_custom_emoji/2"},{"type":"function","title":"Bonfire.Common.Text.maybe_render_templated/2","doc":"Renders templated content if the `Solid` library is enabled.","ref":"Bonfire.Common.Text.html#maybe_render_templated/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_render_templated/2","doc":"> maybe_render_templated(\"Hello {{name}}\", %{name: \"World\"})\n \"Hello World\"","ref":"Bonfire.Common.Text.html#maybe_render_templated/2-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_sane_html/1","doc":"Sanitizes HTML content to ensure it is safe.\n\nIt is recommended to call this before storing any that data is coming in from the user or from a remote instance","ref":"Bonfire.Common.Text.html#maybe_sane_html/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_sane_html/1","doc":"> maybe_sane_html(\" alert('XSS') \")\n #=> \"alert('XSS')\" (if HtmlSanitizeEx is enabled)","ref":"Bonfire.Common.Text.html#maybe_sane_html/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_to_snake/1","doc":"Converts input to snake_case.","ref":"Bonfire.Common.Text.html#maybe_to_snake/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_to_snake/1","doc":"iex> maybe_to_snake(\"CamelCase\")\n \"camel_case\"","ref":"Bonfire.Common.Text.html#maybe_to_snake/1-examples"},{"type":"function","title":"Bonfire.Common.Text.normalise_links/2","doc":"Normalizes links in the content based on format.","ref":"Bonfire.Common.Text.html#normalise_links/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.normalise_links/2","doc":"> normalise_links(\" Actor \", :markdown)\n \" Actor \"","ref":"Bonfire.Common.Text.html#normalise_links/2-examples"},{"type":"function","title":"Bonfire.Common.Text.random_string/1","doc":"Generates a random string of a given length.","ref":"Bonfire.Common.Text.html#random_string/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.random_string/1","doc":"iex> random_string(5) |> String.length()\n 5\n\n > random_string()\n #=> a string of length 10","ref":"Bonfire.Common.Text.html#random_string/1-examples"},{"type":"function","title":"Bonfire.Common.Text.regex_list/2","doc":"","ref":"Bonfire.Common.Text.html#regex_list/2"},{"type":"function","title":"Bonfire.Common.Text.sentence_truncate/3","doc":"Truncates a string to a maximum length, ensuring it ends on a sentence boundary.","ref":"Bonfire.Common.Text.html#sentence_truncate/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.sentence_truncate/3","doc":"iex> sentence_truncate(\"Hello world. This is a test.\", 12)\n \"Hello world.\"\n\n iex> sentence_truncate(\"Hello world. This is a test.\", 12, \"...\")\n \"Hello world....\"","ref":"Bonfire.Common.Text.html#sentence_truncate/3-examples"},{"type":"function","title":"Bonfire.Common.Text.slug/1","doc":"Generates a URL-friendly slug from the given text.\nThe text is downcased, trimmed, spaces are replaced with dashes, and it is URI-encoded.\n\n iex> Bonfire.Common.Text.slug(\"Hello World!\")\n \"hello-world!\"\n\n iex> Bonfire.Common.Text.slug(\"Elixir Programming\")\n \"elixir-programming\"\n\n iex> Bonfire.Common.Text.slug(\"Special & Characters\")\n \"special-&-characters\"","ref":"Bonfire.Common.Text.html#slug/1"},{"type":"function","title":"Bonfire.Common.Text.split_lines/1","doc":"Splits a string into lines.","ref":"Bonfire.Common.Text.html#split_lines/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.split_lines/1","doc":"iex> split_lines(\"line1\\nline2\\r\\nline3\\rline4\")\n [\"line1\", \"line2\", \"line3\", \"line4\"]","ref":"Bonfire.Common.Text.html#split_lines/1-examples"},{"type":"function","title":"Bonfire.Common.Text.strlen/1","doc":"Returns the length of the input based on its type.","ref":"Bonfire.Common.Text.html#strlen/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.strlen/1","doc":"iex> strlen(\"hello\")\n 5\n\n iex> strlen([1, 2, 3])\n 3\n\n iex> strlen(%{})\n 0\n\n iex> strlen(nil)\n 0\n\n iex> strlen(0)\n 0\n\n iex> strlen(123)\n 1","ref":"Bonfire.Common.Text.html#strlen/1-examples"},{"type":"function","title":"Bonfire.Common.Text.text_only/1","doc":"Extracts text from safe or regular content.","ref":"Bonfire.Common.Text.html#text_only/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.text_only/1","doc":"iex> text_only(\" Text \")\n \"Text\"\n\n iex> text_only({:safe, \" Safe Text \"})\n \"Safe Text\"","ref":"Bonfire.Common.Text.html#text_only/1-examples"},{"type":"function","title":"Bonfire.Common.Text.truncate/3","doc":"Truncates a string to a maximum length, optionally adding a suffix.","ref":"Bonfire.Common.Text.html#truncate/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.truncate/3","doc":"iex> truncate(\"Hello world\", 5)\n \"Hello\"\n\n iex> truncate(\"Hello world\", 5, \"...\")\n \"He...\"\n\n iex> truncate(\"Hello world\", 7, \"...\")\n \"Hell...\"","ref":"Bonfire.Common.Text.html#truncate/3-examples"},{"type":"function","title":"Bonfire.Common.Text.underscore_truncate/2","doc":"Truncates the input string at the last underscore (`_`) if its length exceeds the given length.\nIf the input string is shorter than or equal to the given length, it returns the string as is.\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 4)\n \"abc\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 10)\n \"abc_def\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 5)\n \"abc\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 0)","ref":"Bonfire.Common.Text.html#underscore_truncate/2"},{"type":"function","title":"Bonfire.Common.Text.upcase_first/1","doc":"Converts the first character of a binary to uppercase.","ref":"Bonfire.Common.Text.html#upcase_first/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.upcase_first/1","doc":"iex> upcase_first(\"hello\")\n \"Hello\"","ref":"Bonfire.Common.Text.html#upcase_first/1-examples"},{"type":"function","title":"Bonfire.Common.Text.verb_infinitive/1","doc":"Converts an English conjugated verb to its infinitive form using the `Verbs` library. Currently only supports irregular verbs.","ref":"Bonfire.Common.Text.html#verb_infinitive/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.verb_infinitive/1","doc":"> verb_infinitive(\"running\")\n \"run\"","ref":"Bonfire.Common.Text.html#verb_infinitive/1-examples"},{"type":"module","title":"Bonfire.Common.TextExtended","doc":"","ref":"Bonfire.Common.TextExtended.html"},{"type":"function","title":"Bonfire.Common.TextExtended.blank?/1","doc":"Returns the length of the input based on its type.","ref":"Bonfire.Common.TextExtended.html#blank?/1"},{"type":"function","title":"Examples - Bonfire.Common.TextExtended.blank?/1","doc":"iex> strlen(\"hello\")\n 5\n\n iex> strlen([1, 2, 3])\n 3\n\n iex> strlen(%{})\n 0\n\n iex> strlen(nil)\n 0\n\n iex> strlen(0)\n 0\n\n iex> strlen(123)\n 1","ref":"Bonfire.Common.TextExtended.html#blank?/1-examples"},{"type":"function","title":"Bonfire.Common.TextExtended.camelise/1","doc":"","ref":"Bonfire.Common.TextExtended.html#camelise/1"},{"type":"function","title":"Bonfire.Common.TextExtended.code_syntax/2","doc":"","ref":"Bonfire.Common.TextExtended.html#code_syntax/2"},{"type":"function","title":"Bonfire.Common.TextExtended.contains?/2","doc":"","ref":"Bonfire.Common.TextExtended.html#contains?/2"},{"type":"function","title":"Bonfire.Common.TextExtended.contains_html?/1","doc":"","ref":"Bonfire.Common.TextExtended.html#contains_html?/1"},{"type":"function","title":"Bonfire.Common.TextExtended.hash/1","doc":"","ref":"Bonfire.Common.TextExtended.html#hash/1"},{"type":"function","title":"Bonfire.Common.TextExtended.hash/2","doc":"","ref":"Bonfire.Common.TextExtended.html#hash/2"},{"type":"function","title":"Bonfire.Common.TextExtended.list_checkboxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_checkboxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.list_checked_boxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_checked_boxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.list_unchecked_boxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_unchecked_boxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.make_local_links_live/1","doc":"","ref":"Bonfire.Common.TextExtended.html#make_local_links_live/1"},{"type":"function","title":"Bonfire.Common.TextExtended.markdown_as_html_earmark/2","doc":"","ref":"Bonfire.Common.TextExtended.html#markdown_as_html_earmark/2"},{"type":"function","title":"Bonfire.Common.TextExtended.markdown_as_html_mdex/2","doc":"","ref":"Bonfire.Common.TextExtended.html#markdown_as_html_mdex/2"},{"type":"function","title":"Bonfire.Common.TextExtended.markdown_checkboxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#markdown_checkboxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/3","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/3"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_markdown_to_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_markdown_to_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_markdown_to_html/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_markdown_to_html/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_normalize_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_normalize_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_other_custom_emoji/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_other_custom_emoji/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_render_templated/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_render_templated/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_sane_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_sane_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_to_snake/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_to_snake/1"},{"type":"function","title":"Bonfire.Common.TextExtended.normalise_links/1","doc":"","ref":"Bonfire.Common.TextExtended.html#normalise_links/1"},{"type":"function","title":"Bonfire.Common.TextExtended.normalise_links/2","doc":"","ref":"Bonfire.Common.TextExtended.html#normalise_links/2"},{"type":"function","title":"Bonfire.Common.TextExtended.random_string/0","doc":"","ref":"Bonfire.Common.TextExtended.html#random_string/0"},{"type":"function","title":"Bonfire.Common.TextExtended.random_string/1","doc":"","ref":"Bonfire.Common.TextExtended.html#random_string/1"},{"type":"function","title":"Bonfire.Common.TextExtended.regex_list/2","doc":"","ref":"Bonfire.Common.TextExtended.html#regex_list/2"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/3","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/3"},{"type":"function","title":"Bonfire.Common.TextExtended.slug/1","doc":"","ref":"Bonfire.Common.TextExtended.html#slug/1"},{"type":"function","title":"Bonfire.Common.TextExtended.split_lines/1","doc":"","ref":"Bonfire.Common.TextExtended.html#split_lines/1"},{"type":"function","title":"Bonfire.Common.TextExtended.strlen/1","doc":"","ref":"Bonfire.Common.TextExtended.html#strlen/1"},{"type":"function","title":"Bonfire.Common.TextExtended.text_only/1","doc":"","ref":"Bonfire.Common.TextExtended.html#text_only/1"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/3","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/3"},{"type":"function","title":"Bonfire.Common.TextExtended.underscore_truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#underscore_truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.underscore_truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#underscore_truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.upcase_first/1","doc":"","ref":"Bonfire.Common.TextExtended.html#upcase_first/1"},{"type":"function","title":"Bonfire.Common.TextExtended.verb_infinitive/1","doc":"","ref":"Bonfire.Common.TextExtended.html#verb_infinitive/1"},{"type":"module","title":"Bonfire.Common.Types","doc":"Helpers for handling the type of objects (structs and more)","ref":"Bonfire.Common.Types.html"},{"type":"function","title":"Bonfire.Common.Types.all_object_type_names/0","doc":"Outputs the names of all object types for the purpose of adding to the localisation strings (as long as the output is piped through to `Bonfire.Common.Localise.Gettext.localise_strings/1` at compile time)\n\n > all_object_type_names()\n [\"User\", \"Delete this User\", \"Post\", \"Delete this Post\", ...]","ref":"Bonfire.Common.Types.html#all_object_type_names/0"},{"type":"function","title":"Bonfire.Common.Types.defines_struct?/1","doc":"Takes an object or module name and checks if it defines a struct.","ref":"Bonfire.Common.Types.html#defines_struct?/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.defines_struct?/1","doc":"iex> defines_struct?(Needle.Pointer)\n true\n\n iex> defines_struct?(%{__struct__: Bonfire.Common})\n true\n\n iex> defines_struct?(%{some_key: \"some_value\"})\n false","ref":"Bonfire.Common.Types.html#defines_struct?/1-examples"},{"type":"function","title":"Bonfire.Common.Types.is_numeric/1","doc":"Takes a value and returns true if it's a number or can be converted to a float.","ref":"Bonfire.Common.Types.html#is_numeric/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.is_numeric/1","doc":"iex> is_numeric(123)\n true\n\n iex> is_numeric(\"123.45\")\n true\n\n iex> is_numeric(\"abc\")\n false","ref":"Bonfire.Common.Types.html#is_numeric/1-examples"},{"type":"function","title":"Bonfire.Common.Types.is_uid?/2","doc":"Takes a string and returns true if it is a valid UUID or ULID.","ref":"Bonfire.Common.Types.html#is_uid?/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.is_uid?/2","doc":"iex> is_uid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> is_uid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uid?(\"invalid_id\")\n false","ref":"Bonfire.Common.Types.html#is_uid?/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_convert_ulids/1","doc":"Takes a map or list of maps, and if the value of a key in the map is a ULID, it replaces it with the corresponding Crockford Base32 encoded string.","ref":"Bonfire.Common.Types.html#maybe_convert_ulids/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_convert_ulids/1","doc":"iex> maybe_convert_ulids(%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"})\n %{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}\n\n iex> maybe_convert_ulids([%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}])\n [%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}]","ref":"Bonfire.Common.Types.html#maybe_convert_ulids/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom/1","doc":"Takes a string and returns an atom if it can be converted to one, else returns the input itself.","ref":"Bonfire.Common.Types.html#maybe_to_atom/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom/1","doc":"iex> maybe_to_atom(\"atom_name\")\n :atom_name\n\n iex> maybe_to_atom(\"def_non_existing_atom\")\n \"def_non_existing_atom\"","ref":"Bonfire.Common.Types.html#maybe_to_atom/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom!/1","doc":"Takes a string or an atom and returns an atom if it is one or can be converted to one, else returns nil.","ref":"Bonfire.Common.Types.html#maybe_to_atom!/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom!/1","doc":"iex> maybe_to_atom!(\"atom_name\")\n :atom_name\n\n iex> maybe_to_atom!(\"def_non_existing_atom\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_atom!/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom_or_module/3","doc":"Takes a string or atom and attempts to convert it to an atom or module, depending on the flags.","ref":"Bonfire.Common.Types.html#maybe_to_atom_or_module/3"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom_or_module/3","doc":"iex> maybe_to_atom_or_module(:some_atom, true, true)\n :some_atom\n\n iex> maybe_to_atom_or_module(\"Enum\", true, true)\n Enum","ref":"Bonfire.Common.Types.html#maybe_to_atom_or_module/3-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_float/2","doc":"Converts a value to a floating-point number if possible. If the value cannot be converted to a float, it returns a fallback value (which defaults to 0 if not provided).","ref":"Bonfire.Common.Types.html#maybe_to_float/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_float/2","doc":"iex> maybe_to_float(123)\n 123\n\n iex> maybe_to_float(\"123.45\")\n 123.45\n\n iex> maybe_to_float(\"abc\", 0.0)\n 0.0","ref":"Bonfire.Common.Types.html#maybe_to_float/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_integer/2","doc":"Converts a value to an integer if possible. If the value is not an integer, it attempts to convert it to a float and then rounds it to the nearest integer. Otherwise it returns a fallback value (which defaults to 0 if not provided).","ref":"Bonfire.Common.Types.html#maybe_to_integer/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_integer/2","doc":"iex> maybe_to_integer(123.45)\n 123\n\n iex> maybe_to_integer(\"123\")\n 123\n\n iex> maybe_to_integer(\"abc\", 0)\n 0","ref":"Bonfire.Common.Types.html#maybe_to_integer/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_module/2","doc":"Takes a string and returns the corresponding Elixir module if it exists and is not disabled in the app.","ref":"Bonfire.Common.Types.html#maybe_to_module/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_module/2","doc":"iex> maybe_to_module(\"Enum\")\n Enum\n\n iex> maybe_to_module(\"NonExistentModule\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_module/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_snake_atom/1","doc":"Takes a string as input, converts it to snake_case, and converts it to an atom if such an atom exists, otherwise returns nil.","ref":"Bonfire.Common.Types.html#maybe_to_snake_atom/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_snake_atom/1","doc":"iex> maybe_to_snake_atom(\"SomeString\")\n :some_string\n\n iex> maybe_to_snake_atom(\"DefNonExistingAtom\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_snake_atom/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_string/1","doc":"Handles multiple cases where the input value is of a different type (atom, list, tuple, etc.) and returns a string representation of it.","ref":"Bonfire.Common.Types.html#maybe_to_string/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_string/1","doc":"iex> maybe_to_string(:some_atom)\n \"some_atom\"\n\n iex> maybe_to_string([1, 2, 3])\n \"[1, 2, 3]\"\n\n iex> maybe_to_string({:a, :tuple})\n \"a: tuple\"","ref":"Bonfire.Common.Types.html#maybe_to_string/1-examples"},{"type":"function","title":"Bonfire.Common.Types.module_to_human_readable/1","doc":"Takes a module name (as a string or an atom) and converts it to a human-readable string. \n\nIt removes the `Elixir.` prefix (if it exists) and any other prefixes (e.g., `Bonfire.Common.`) and converts the final part of the module name to a string in title case (e.g., `Types`).","ref":"Bonfire.Common.Types.html#module_to_human_readable/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.module_to_human_readable/1","doc":"iex> module_to_human_readable(\"Elixir.Bonfire.Common.Types\")\n \"Types\"\n\n iex> module_to_human_readable(Bonfire.Common.Types)\n \"Types\"","ref":"Bonfire.Common.Types.html#module_to_human_readable/1-examples"},{"type":"function","title":"Bonfire.Common.Types.module_to_str/1","doc":"Takes a module atom and converts it to a string, or a string and removes the `Elixir.` prefix if it exists.","ref":"Bonfire.Common.Types.html#module_to_str/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.module_to_str/1","doc":"iex> module_to_str(SomeModule)\n \"SomeModule\"\n\n iex> module_to_str(Elixir.SomeModule)\n \"SomeModule\"","ref":"Bonfire.Common.Types.html#module_to_str/1-examples"},{"type":"function","title":"Bonfire.Common.Types.object_type/1","doc":"Takes an object, module name, or string, and returns the type of the object. \n\nThe function uses various patterns to match different object types (such as associations, Pointables, edges/verbs, etc.). If none of the patterns match, the function returns nil.","ref":"Bonfire.Common.Types.html#object_type/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.object_type/1","doc":"iex> object_type(%Ecto.Association.NotLoaded{})\n nil\n\n > object_type(%{table_id: \"601NTERTAB1EF0RA11TAB1ES00\"})\n Needle.Table\n\n iex> object_type(%{pointer_id: \"User\"})\n Bonfire.Data.Identity.User\n\n iex> object_type(\"User\")\n Bonfire.Data.Identity.User\n\n iex> object_type(:some_atom)\n :some_atom","ref":"Bonfire.Common.Types.html#object_type/1-examples"},{"type":"function","title":"Bonfire.Common.Types.object_type_display/1","doc":"Outputs a human-readable representation of an object type.","ref":"Bonfire.Common.Types.html#object_type_display/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.object_type_display/1","doc":"iex> object_type_display(:user)\n \"user\"\n\n > object_type_display(%Bonfire.Data.Social.APActivity{})\n \"apactivity\"","ref":"Bonfire.Common.Types.html#object_type_display/1-examples"},{"type":"function","title":"Bonfire.Common.Types.sanitise_name/1","doc":"Used for mapping schema types to user-friendly names. Given a string representing a schema type name, returns a sanitised version of it, or nil for object types (or mixins) that shouldn't be displayed.","ref":"Bonfire.Common.Types.html#sanitise_name/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.sanitise_name/1","doc":"iex> sanitise_name(\"Apactivity\")\n \"Federated Object\"\n\n iex> sanitise_name(\"Settings\")\n \"Setting\"\n\n iex> sanitise_name(\"Created\")\n nil","ref":"Bonfire.Common.Types.html#sanitise_name/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_id/1","doc":"Given a schema module, returns its table ID (i.e. Pointable ULID).","ref":"Bonfire.Common.Types.html#table_id/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.table_id/1","doc":"> table_id(Bonfire.Data.Social.APActivity)\n \"30NF1REAPACTTAB1ENVMBER0NE\"","ref":"Bonfire.Common.Types.html#table_id/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_type/1","doc":"Given an object or module name, returns its respective table table ID (i.e. Pointable ULID).","ref":"Bonfire.Common.Types.html#table_type/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.table_type/1","doc":"> table_type(%Bonfire.Data.Social.APActivity{})\n \"30NF1REAPACTTAB1ENVMBER0NE\"\n \n iex> table_type(%Needle.Pointer{table_id: \"30NF1REAPACTTAB1ENVMBER0NE\"})\n \"30NF1REAPACTTAB1ENVMBER0NE\"\n\n > table_type(Bonfire.Data.Social.APActivity)\n \"30NF1REAPACTTAB1ENVMBER0NE\"","ref":"Bonfire.Common.Types.html#table_type/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_types/1","doc":"Given a list of schema types, returns a list of their respective table types. Filters out any empty values. \n\n > table_types([%Needle.Pointer{table_id: \"30NF1REAPACTTAB1ENVMBER0NE\"}, %Bonfire.Data.Social.APActivity{}])\n [\"30NF1REAPACTTAB1ENVMBER0NE\"]\n\n Given a single schema type, it returns its respective table type.\n\n > table_types(Bonfire.Data.Social.APActivity)\n [\"30NF1REAPACTTAB1ENVMBER0NE\"]","ref":"Bonfire.Common.Types.html#table_types/1"},{"type":"function","title":"Bonfire.Common.Types.typeof/1","doc":"Takes an object and returns its data type as a module name or atom.","ref":"Bonfire.Common.Types.html#typeof/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.typeof/1","doc":"iex> typeof(%{__struct__: Ecto.Schema})\n Ecto.Schema\n\n iex> typeof(%{__context__: nil, __changed__: nil})\n :assigns\n\n iex> typeof(nil)\n :empty\n\n iex> typeof(%Ecto.Changeset{})\n Ecto.Changeset\n\n iex> typeof([1, 2])\n List\n\n iex> typeof([])\n :empty\n\n iex> typeof(\"string\")\n String\n\n iex> typeof(:atom)\n Atom\n\n iex> typeof(123)\n Integer\n\n iex> typeof(%{id: 1})\n Map\n\n iex> typeof(%{})\n :empty\n\n iex> typeof(3.14)\n Float\n\n iex> typeof({:ok, 42})\n Tuple\n\n iex> typeof(fn -> :ok end)\n Function\n\n iex> typeof(self())\n Process\n\n iex> typeof(Port.open({:spawn, \"cat\"}, [:binary]))\n Port\n\n iex> typeof(make_ref())\n :reference\n\n iex> typeof(%{__struct__: Bonfire.Classify.Category})\n Bonfire.Classify.Category","ref":"Bonfire.Common.Types.html#typeof/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uid/2","doc":"Takes an object and returns a single ULID (Universally Unique Lexicographically Sortable Identifier) ID(s) if present in the object.","ref":"Bonfire.Common.Types.html#uid/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.uid/2","doc":"iex> uid(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid(%{pointer: %{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid(%{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n \n iex> uid(\"01J3MNBPD0VX96MFY9B15BCHYP\")\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n > uid([\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"])\n # ** (ArgumentError) Expected an ID (ULID or UUID) or an object or list containing a single one, but got several\n\n iex> uid(\"invalid_id\")\n nil\n\n iex> uid(\"invalid_id\", :fallback)\n :fallback","ref":"Bonfire.Common.Types.html#uid/2-examples"},{"type":"function","title":"Bonfire.Common.Types.uid!/1","doc":"Takes an object and returns the ULID (Universally Unique Lexicographically Sortable Identifier) ID if present in the object. Throws an error if a ULID ID is not present.","ref":"Bonfire.Common.Types.html#uid!/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.uid!/1","doc":"iex> uid!(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid!(\"invalid_id\")\n ** (RuntimeError) Expected an object or ID (ULID)","ref":"Bonfire.Common.Types.html#uid!/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uid_or_uids/1","doc":"","ref":"Bonfire.Common.Types.html#uid_or_uids/1"},{"type":"function","title":"Bonfire.Common.Types.uids/1","doc":"Takes an object or list of objects and returns a list of ULIDs (Universally Unique Lexicographically Sortable Identifier) ID(s) if present.","ref":"Bonfire.Common.Types.html#uids/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.uids/1","doc":"iex> uids(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids(%{pointer: %{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}})\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids([%{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}])\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n \n iex> uids(\"01J3MNBPD0VX96MFY9B15BCHYP\")\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids([\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"])\n [\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"]\n\n iex> uids(\"invalid_id\")\n []","ref":"Bonfire.Common.Types.html#uids/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uids_or/2","doc":"","ref":"Bonfire.Common.Types.html#uids_or/2"},{"type":"module","title":"Bonfire.Common.URIs","doc":"URI/URL/path helpers","ref":"Bonfire.Common.URIs.html"},{"type":"function","title":"Bonfire.Common.URIs.base_domain/1","doc":"Returns the base domain from the given URI or endpoint.\n\n iex> base_domain(%URI{host: \"example.com\", port: 443})\n \"example.com\"","ref":"Bonfire.Common.URIs.html#base_domain/1"},{"type":"function","title":"Bonfire.Common.URIs.base_uri/1","doc":"Returns the homepage URI (as struct) of the local instance.\n\n > %URI{scheme: \"http\", host: \"localhost\"} = base_uri(:my_endpoint)","ref":"Bonfire.Common.URIs.html#base_uri/1"},{"type":"function","title":"Bonfire.Common.URIs.base_url/1","doc":"Return the homepage URL (as string) of the local instance","ref":"Bonfire.Common.URIs.html#base_url/1"},{"type":"function","title":"Bonfire.Common.URIs.based_url/2","doc":"Removes the scheme from a URL to get the display URL.\n\n iex> display_url(\"https://example.com/path\")\n \"example.com/path\"\n\n iex> display_url(\"http://example.com/path\")\n \"example.com/path\"\n\n iex> display_url(\"/path\")\n \"/path\"","ref":"Bonfire.Common.URIs.html#based_url/2"},{"type":"function","title":"Bonfire.Common.URIs.canonical_url/1","doc":"Returns the canonical URL (i.e., the one used for ActivityPub federation) of an object.","ref":"Bonfire.Common.URIs.html#canonical_url/1"},{"type":"function","title":"Examples - Bonfire.Common.URIs.canonical_url/1","doc":"iex> canonical_url(%{canonical_uri: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{canonical_url: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{\"canonicalUrl\" => \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{peered: %{canonical_uri: \"http://example.com\"}})\n \"http://example.com\"\n\n iex> canonical_url(%{character: %{canonical_uri: \"http://example.com\"}})\n \"http://example.com\"\n\n iex> canonical_url(%{character: %{peered: %{canonical_uri: \"http://example.com\"}}})\n \"http://example.com\"\n\n iex> canonical_url(%{peered: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{created: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{character: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{character: %{peered: %{}}})\n nil\n\n iex> canonical_url(%{path: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{other: \"data\"})\n nil","ref":"Bonfire.Common.URIs.html#canonical_url/1-examples"},{"type":"function","title":"Bonfire.Common.URIs.display_url/1","doc":"","ref":"Bonfire.Common.URIs.html#display_url/1"},{"type":"function","title":"Bonfire.Common.URIs.fallback/1","doc":"","ref":"Bonfire.Common.URIs.html#fallback/1"},{"type":"function","title":"Bonfire.Common.URIs.fallback/2","doc":"","ref":"Bonfire.Common.URIs.html#fallback/2"},{"type":"function","title":"Bonfire.Common.URIs.fallback/3","doc":"","ref":"Bonfire.Common.URIs.html#fallback/3"},{"type":"function","title":"Bonfire.Common.URIs.is_uri?/1","doc":"Returns true if the given string is a valid URI.\n\n iex> is_uri?(\"http://example.com\")\n true\n\n iex> is_uri?(\"invalid_uri\")\n false","ref":"Bonfire.Common.URIs.html#is_uri?/1"},{"type":"function","title":"Bonfire.Common.URIs.maybe_generate_canonical_url/1","doc":"","ref":"Bonfire.Common.URIs.html#maybe_generate_canonical_url/1"},{"type":"function","title":"Bonfire.Common.URIs.path/3","doc":"Returns the path (URL on the local instance) for the given object/struct (eg. a User), view or schema module, or path name (atom defined in routes), along with optional arguments.\n\nReturns the path (URL on the local instance) for the given object/struct (e.g., a User), view or schema module, or path name (atom defined in routes), along with optional arguments.","ref":"Bonfire.Common.URIs.html#path/3"},{"type":"function","title":"Examples - Bonfire.Common.URIs.path/3","doc":"> path(:user, [1], [])\n \"/users/1\"\n\n > path(User, [1], [])\n \"/users/1\"\n\n > path(%{id: \"1\"}, :show, [])\n \"/users/1/show\"\n\n > path(%{id: \"1\"}, [some: :args], [])\n \"/users/1/some_args\"\n\n iex> path(\"12345\", [some: :args], [])\n nil","ref":"Bonfire.Common.URIs.html#path/3-examples"},{"type":"function","title":"Bonfire.Common.URIs.path_by_id/4","doc":"","ref":"Bonfire.Common.URIs.html#path_by_id/4"},{"type":"function","title":"Bonfire.Common.URIs.remote_canonical_url/1","doc":"","ref":"Bonfire.Common.URIs.html#remote_canonical_url/1"},{"type":"function","title":"Bonfire.Common.URIs.static_path/2","doc":"Generates a static path based on the given path and endpoint module.\n\n > static_path(\"/assets/image.png\")\n \"/assets/image.png\"","ref":"Bonfire.Common.URIs.html#static_path/2"},{"type":"function","title":"Bonfire.Common.URIs.url_path/2","doc":"Returns the full URL (including domain and path) for a given object, module, or path name.\n\n > url_path(:user, [1])\n \"http://localhost:4000/discussion/user/1\"","ref":"Bonfire.Common.URIs.html#url_path/2"},{"type":"function","title":"Bonfire.Common.URIs.validate_uri/1","doc":"Validates a URI string.","ref":"Bonfire.Common.URIs.html#validate_uri/1"},{"type":"function","title":"Examples - Bonfire.Common.URIs.validate_uri/1","doc":"iex> {:ok, %URI{scheme: \"http\", host: \"example.com\"}} = validate_uri(\"http://example.com\")\n\n iex> {:error, %URI{scheme: nil, host: nil}} = validate_uri(\"invalid_uri\")","ref":"Bonfire.Common.URIs.html#validate_uri/1-examples"},{"type":"module","title":"Bonfire.Common.Utils","doc":"Various very commonly used utility functions for the Bonfire application.\n\nThis module should contain only a few generic and/or heavily-used functions, and any other functions should be in more specific modules (or in other extensions altogether) for e.g.: \n- `Bonfire.Common.Enums` for functions around maps, structs, keyword lists, and the like\n- `Bonfire.Common.Types` for object types\n- `Bonfire.Common.URIs` and `Linkify` for URI handling\n- `Bonfire.Common.DatesTimes` for date/time helpers\n- `Bonfire.Common.E` to extract nested data from an object\n- `Bonfire.Common.Errors` and `Bonfire.Fail` for error handling\n- `Bonfire.Common.Extend` for functions around modularity\n- `Bonfire.Common.Opts` for handling function options\n- `Bonfire.Common.Config` for handling app-wide config\n- `Bonfire.Common.Settings` for handling account/user/instance level settings\n- `Bonfire.Common.HTTP` for HTTP requests\n- `Bonfire.Common.Cache` for caching\n- `Bonfire.Common.Text` for plain or rich text\n- `Bonfire.Common.Localise` for app localisation\n- `Bonfire.Common.Media` and `Bonfire.Files` for avatars/images/videos/etc\n- `Bonfire.Common.Repo` and `Needle` for database access\n- `Bonfire.Common.PubSub` for pub/sub\n\nWe may also want to consider reusing functions from existing utils libraries when possible and contributing missing ones there, for example:\n- https://hexdocs.pm/moar/readme.html\n- https://hexdocs.pm/bunch/api-reference.html\n- https://hexdocs.pm/swiss/api-reference.html\n- https://hexdocs.pm/wuunder_utils/api-reference.html\n- https://github.com/cozy-elixir","ref":"Bonfire.Common.Utils.html"},{"type":"function","title":"Bonfire.Common.Utils.apply_error/3","doc":"","ref":"Bonfire.Common.Utils.html#apply_error/3"},{"type":"function","title":"Bonfire.Common.Utils.apply_task/3","doc":"Runs a function asynchronously in a Task. Simply a shorthand for calling functions in `Task` and `Task.Supervisor` but with support for multi-tenancy in the spawned process. \n\n- `Task.async/1` the caller creates a new process links and monitors it. Once the task action finishes, a message is sent to the caller with the result. `Task.await/2` is used to read the message sent by the task. When using `async`, you *must* `await` a reply as they are always sent. \n\n- `Task.start_link/1` is suggested instead if you are not expecting a reply. It starts a statically supervised task as part of a supervision tree, linked to the calling process (meaning it will be stopped when the caller stops). \n\n- `Task.start/1` can be used for fire-and-forget tasks, like side-effects, when you have no interest on its results nor if it completes successfully (because if the server is shut down it won't be restarted).\n\nFor more serious tasks, consider using `Oban` or `apply_task_supervised/3` for supervised tasks when possible:\n\n- `Task.Supervisor.start_child/2` allows you to start a fire-and-forget task when you don't care about its results or if it completes successfully or not.\n\n- `Task.Supervisor.async/2` + `Task.await/2` allows you to execute tasks concurrently and retrieve its result. If the task fails, the caller will also fail.","ref":"Bonfire.Common.Utils.html#apply_task/3"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.apply_task/3","doc":"- `function`: The type of task to start (e.g. `:async`, `:start_link`, or `:start`).\n- `fun`: The function to execute async.\n- `opts`: Options for task execution, including:\n - `:module` - The module to use for task execution (defaults to `Task`).","ref":"Bonfire.Common.Utils.html#apply_task/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.apply_task/3","doc":"> apply_task(:async, fn -> IO.puts(\"Async task\") end)\n # Output: \"Async task\"\n\n > {apply_task(:start, fn -> IO.puts(\"Fire-and-forget task\") end)\n # Output: \"Fire-and-forget task\"\n\n > apply_task(:start_link, fn -> IO.puts(\"Supervised task\") end)\n # Output: \"Supervised task\"","ref":"Bonfire.Common.Utils.html#apply_task/3-examples"},{"type":"function","title":"Bonfire.Common.Utils.apply_task_supervised/3","doc":"Runs a function asynchronously using `Task.Supervisor`. This is similar to `apply_task/3` but specifically uses `Task.Supervisor` for supervision.","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.apply_task_supervised/3","doc":"- `module`: The supervisor module to use for task execution\n - `fun`: The function to execute async\n - `opts`: Options for task execution, including:\n - `:function` - The `Task.Supervisor` function to use for task execution (defaults to `:async`).","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.apply_task_supervised/3","doc":"> apply_task_supervised(MySupervisor, fn -> IO.puts(\"Supervised async task\") end)\n ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started\n # because `MySupervisor` is not defined and/or started ^","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account/2","doc":"Returns the current account from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current account.","ref":"Bonfire.Common.Utils.html#current_account/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account/2","doc":"iex> Bonfire.Common.Utils.current_account(%{current_account: %{id: \"account1\"}})\n %{id: \"account1\"}\n\n iex> Bonfire.Common.Utils.current_account(%{assigns: %{current_account: %{id: \"account2\"}}})\n %{id: \"account2\"}\n\n iex> Bonfire.Common.Utils.current_account(%{socket: %{assigns: %{current_account: %{id: \"account3\"}}}})\n %{id: \"account3\"}\n\n iex> Bonfire.Common.Utils.current_account([current_account: %{id: \"account4\"}])\n %{id: \"account4\"}","ref":"Bonfire.Common.Utils.html#current_account/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_and_or_user_ids/1","doc":"Returns a list of current account IDs and/or user IDs.\n\nThis function returns a keyword list with the current account IDs and/or user IDs.","ref":"Bonfire.Common.Utils.html#current_account_and_or_user_ids/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_and_or_user_ids/1","doc":"iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\", current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\", user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n \n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account: %{id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}, current_user: %{id: \"5EVSER1S0STENS1B1YHVMAN01D\"}})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\", user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n [user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{})\n []","ref":"Bonfire.Common.Utils.html#current_account_and_or_user_ids/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_auth!/2","doc":"(Re)authenticates the current account using the provided password.\n\nRaises an exception if the credentials are invalid.","ref":"Bonfire.Common.Utils.html#current_account_auth!/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_auth!/2","doc":"> Bonfire.Common.Utils.current_account_auth!(%{current_account: %{id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}}, \"wrong-password\")\n ** (Bonfire.Fail.Auth) We couldn't find an account with the details you provided.","ref":"Bonfire.Common.Utils.html#current_account_auth!/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_id/2","doc":"Returns the current account ID from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current account ID.","ref":"Bonfire.Common.Utils.html#current_account_id/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_id/2","doc":"iex> Bonfire.Common.Utils.current_account_id(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(%{assigns: %{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(%{socket: %{assigns: %{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}}})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(\"2CC0VNTSARE1S01AT10NGR0VPS\")\n \"2CC0VNTSARE1S01AT10NGR0VPS\"","ref":"Bonfire.Common.Utils.html#current_account_id/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user/2","doc":"Returns the current user from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current user (or current user ID if that's all that's available).","ref":"Bonfire.Common.Utils.html#current_user/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user/2","doc":"iex> Bonfire.Common.Utils.current_user(%{current_user: %{id: \"user1\"}})\n %{id: \"user1\"}\n\n iex> Bonfire.Common.Utils.current_user(%{assigns: %{current_user: %{id: \"user2\"}}})\n %{id: \"user2\"}\n\n iex> Bonfire.Common.Utils.current_user(%{socket: %{assigns: %{current_user: %{id: \"user3\"}}}})\n %{id: \"user3\"}\n\n iex> Bonfire.Common.Utils.current_user([current_user: %{id: \"user4\"}])\n %{id: \"user4\"}\n\n iex> Bonfire.Common.Utils.current_user(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n \"5EVSER1S0STENS1B1YHVMAN01D\"","ref":"Bonfire.Common.Utils.html#current_user/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_auth!/2","doc":"(Re)authenticates the current user using the provided password.\n\nRaises an exception if the credentials are invalid.","ref":"Bonfire.Common.Utils.html#current_user_auth!/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_auth!/2","doc":"> Bonfire.Common.Utils.current_user_auth!(%{current_user: %{id: \"user1\"}}, \"password123\")\n ** (Bonfire.Fail.Auth) We couldn't find an account with the details you provided.","ref":"Bonfire.Common.Utils.html#current_user_auth!/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_id/2","doc":"Returns the current user ID from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current user ID.","ref":"Bonfire.Common.Utils.html#current_user_id/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_id/2","doc":"iex> Bonfire.Common.Utils.current_user_id(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(%{assigns: %{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"}})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(%{assigns: %{__context__: %{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"}}})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(\"5EVSER1S0STENS1B1YHVMAN01D\")\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n \n iex> Bonfire.Common.Utils.current_user_id(\"invalid id\")\n nil","ref":"Bonfire.Common.Utils.html#current_user_id/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_required!/1","doc":"Ensures that the current user is present and raises an exception if not logged in.","ref":"Bonfire.Common.Utils.html#current_user_required!/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_required!/1","doc":"iex> Bonfire.Common.Utils.current_user_required!(%{current_user: %{id: \"user1\"}})\n %{id: \"user1\"}\n\n > Bonfire.Common.Utils.current_user_required!(%{})\n ** (Bonfire.Fail.Auth) You need to log in first.","ref":"Bonfire.Common.Utils.html#current_user_required!/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.declared_extension/0","doc":"","ref":"Bonfire.Common.Utils.html#declared_extension/0"},{"type":"function","title":"Bonfire.Common.Utils.empty?/1","doc":"Checks if the given value is `nil`, an empty enumerable, or an empty string.","ref":"Bonfire.Common.Utils.html#empty?/1"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.empty?/1","doc":"- `v`: The value to check.","ref":"Bonfire.Common.Utils.html#empty?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.empty?/1","doc":"iex> empty?(nil)\n true\n\n iex> empty?(\"\")\n true\n\n iex> empty?([])\n true\n\n iex> empty?([1, 2, 3])\n false\n\n iex> empty?(\"hello\")\n false","ref":"Bonfire.Common.Utils.html#empty?/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe/2","doc":"Applies the given function if the first parameter is not `nil`.","ref":"Bonfire.Common.Utils.html#maybe/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.maybe/2","doc":"- `val`: The value to check.\n - `change_fn`: A function to apply if `val` is not `nil`.","ref":"Bonfire.Common.Utils.html#maybe/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.maybe/2","doc":"iex> maybe(nil, fn x -> x * 2 end)\n nil\n\n iex> maybe(3, fn x -> x * 2 end)\n 6","ref":"Bonfire.Common.Utils.html#maybe/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe_apply/4","doc":"Helper for calling hypothetical functions another modules. \n \nAttempts to apply a function from a specified module with the given arguments and returns the result. \n\nReturns an error if the function is not defined, unless a fallback function was provided to be invoked, or a fallback value to be returned.","ref":"Bonfire.Common.Utils.html#maybe_apply/4"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.maybe_apply/4","doc":"- `module`: The module to check for the function.\n - `funs`: A list of function names (atoms) to try.\n - `args`: Arguments to pass to the function.\n - `opts`: Options for error handling and fallback. Options include:\n - `:fallback_fun` - A function to call if the primary function is not found.\n - `:fallback_return` - A default return value if the function cannot be applied.","ref":"Bonfire.Common.Utils.html#maybe_apply/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.maybe_apply/4","doc":"iex> maybe_apply(Enum, :map, [[1, 2, 3], &(&1 * 2)])\n [2, 4, 6]\n\n iex> maybe_apply(Enum, [:nonexistent_fun], [])\n {:error, \"None of the functions [:nonexistent_fun] are defined at Elixir.Enum with arity 0\"}\n\n iex> maybe_apply(Enum, [:nonexistent_fun], [], fallback_fun: fn error, _args, _opts -> raise \"Failed\" end)\n ** (RuntimeError) Failed\n\n iex> maybe_apply(SomeModule, [:some_fun], [1, 2, 3], fallback_return: \"Failed\")\n # Output: [warning] maybe_apply: No such module (Elixir.SomeModule) could be loaded. - with args: ([1, 2, 3])\n \"Failed\"","ref":"Bonfire.Common.Utils.html#maybe_apply/4-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe_apply_fallback/3","doc":"","ref":"Bonfire.Common.Utils.html#maybe_apply_fallback/3"},{"type":"function","title":"Bonfire.Common.Utils.maybe_from_opts/3","doc":"Returns the value of a key from options keyword list or map, or a fallback if not present or empty.","ref":"Bonfire.Common.Utils.html#maybe_from_opts/3"},{"type":"function","title":"Bonfire.Common.Utils.nothing?/1","doc":"Checks if the given value is `nil`, `false`, `0`, or an empty value (using `empty?/1`).","ref":"Bonfire.Common.Utils.html#nothing?/1"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.nothing?/1","doc":"- `v`: The value to check.","ref":"Bonfire.Common.Utils.html#nothing?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.nothing?/1","doc":"iex> nothing?(nil)\n true\n\n iex> nothing?(false)\n true\n\n iex> nothing?(0)\n true\n\n iex> nothing?(\"\")\n true\n\n iex> nothing?([1, 2, 3])\n false\n\n iex> nothing?(\"hello\")\n false","ref":"Bonfire.Common.Utils.html#nothing?/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.ok_unwrap/2","doc":"Unwraps an `{:ok, val}` tuple, returning the value. If not OK, returns a fallback value (default is `nil`).","ref":"Bonfire.Common.Utils.html#ok_unwrap/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.ok_unwrap/2","doc":"- `val`: The value or tuple to unwrap.\n - `fallback`: The fallback value if the tuple is an error.","ref":"Bonfire.Common.Utils.html#ok_unwrap/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.ok_unwrap/2","doc":"iex> ok_unwrap({:ok, 42})\n 42\n\n iex> ok_unwrap({:error, \"something went wrong\"}, \"default\")\n \"default\"\n\n iex> ok_unwrap(:error, \"default\")\n \"default\"\n\n iex> ok_unwrap(nil, \"default\")\n \"default\"","ref":"Bonfire.Common.Utils.html#ok_unwrap/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.round_nearest/1","doc":"Rounds a number and uses `Bonfire.Common.Localise.Cldr.Number.to_string/2` function to format into a human readable string.","ref":"Bonfire.Common.Utils.html#round_nearest/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.round_nearest/1","doc":"iex> round_nearest(1234)\n \"1K\"\n\n iex> round_nearest(1600000)\n \"2M\"","ref":"Bonfire.Common.Utils.html#round_nearest/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.round_nearest/2","doc":"Rounds a number to the nearest specified target.","ref":"Bonfire.Common.Utils.html#round_nearest/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.round_nearest/2","doc":"- `num`: The number to round.\n - `target`: The target to round to (optional).","ref":"Bonfire.Common.Utils.html#round_nearest/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.round_nearest/2","doc":"iex> round_nearest(1234, 10)\n 1230\n\n iex> round_nearest(1234, 100)\n 1200\n\n iex> round_nearest(1234, 1000)\n 1000","ref":"Bonfire.Common.Utils.html#round_nearest/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.to_options/1","doc":"Converts a map, user, socket, tuple, etc, to a keyword list for standardised use as function options.","ref":"Bonfire.Common.Utils.html#to_options/1"},{"type":"module","title":"Bonfire.Ecto","doc":"`Bonfire.Ecto` contains `Ecto` transactional support as acts for `Bonfire.Epics`","ref":"Bonfire.Ecto.html"},{"type":"module","title":"Introduction - Bonfire.Ecto","doc":"`Bonfire.Ecto` is designed to facilitate complex Ecto transaction handling within an Elixir application that uses `Bonfire.Epics` to execute a sequence of operations (or `Acts`). These modules provide a structured way to manage database transactions as a series of acts and managing them within an `Epic`, offering flexibility and control over database interactions, ensuring that transactions are executed efficiently.","ref":"Bonfire.Ecto.html#module-introduction"},{"type":"module","title":"Modules Overview - Bonfire.Ecto","doc":"1. `Bonfire.Ecto.Acts.Begin`\n - Responsible for initiating a transaction if certain conditions are met. It ensures that the transaction is only started when it is sensible to do so, based on the current state of the `Epic`.\n\n2. `Bonfire.Ecto.Acts.Work`\n - Handles queued database operations within a transaction. Operations are queued using the `Bonfire.Ecto.Acts.Work.add/2` function and executed if there are no errors in the `Epic` or changesets.\n\n3. `Bonfire.Ecto.Acts.Commit`\n - A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.html#module-modules-overview"},{"type":"module","title":"Usage - Bonfire.Ecto","doc":"#### 1. Initial Setup\n\nEnsure that you have `Ecto` and `Bonfire.Epics` installed and configured in your application, and then install this linrary.\n\n#### 2. Using `Bonfire.Ecto.Acts.Begin`\n\nRefer to `Bonfire.Epics` docs to define some `Act`s and `Epic`s: https://github.com/bonfire-networks/bonfire_epics\n\n#### 3. Queue database operation(s) in an Act \n\nQueue operations by calling the `Bonfire.Ecto.Acts.Work.add/2` function, providing the epic and a key representing the changeset to be processed.\n\n```elixir\nepic = Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n```\n\n#### 3. Add the three `Bonfire.Ecto` Acts to your Epic\n```\n # First come the Acts that prepare the changeset and call `Bonfire.Ecto.Acts.Work.add/2` to queue it\n\n # Open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Then can come some Acts that process the result of the transaction \n```","ref":"Bonfire.Ecto.html#module-usage"},{"type":"module","title":"Bonfire.Ecto.Acts.Begin","doc":"An Act that enters a transaction unless it senses that it would be futile.","ref":"Bonfire.Ecto.Acts.Begin.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Begin.run/2","doc":"Runs the given act(s) within a transaction if no errors are detected in the epic.\n\nThis function takes the modules before the `Commit` module in the `epic.next` list, runs them,\nand then processes the remaining modules. If there are any errors in the epic, it avoids\nentering a transaction.","ref":"Bonfire.Ecto.Acts.Begin.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Begin.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Begin.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Begin.run/2","doc":"iex> epic = %Epic{next: [%{module: OtherModule}, %{module: Commit}], errors: []}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Begin.run(epic, act)\n %Epic{next: [], errors: []}\n\n iex> epic = %Epic{next: [%{module: OtherModule}, %{module: Commit}], errors: [\"error\"]}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Begin.run(epic, act)\n %Epic{next: [], errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Begin.html#run/2-examples"},{"type":"module","title":"Bonfire.Ecto.Acts.Commit","doc":"A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.Acts.Commit.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Commit.run/2","doc":"","ref":"Bonfire.Ecto.Acts.Commit.html#run/2"},{"type":"module","title":"Bonfire.Ecto.Acts.Delete","doc":"","ref":"Bonfire.Ecto.Acts.Delete.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"Attempts to delete the given objects or struct from the repository.\n\nThis function handles the deletion of objects, whether they are a list, a `Needle.Pointer`, or a regular struct. It returns the number of objects deleted.","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"- `objects` - The object(s) to be deleted, can be a list or a single struct.\n - `repo` - The repository module to use for deletion.","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"iex> objects = [%SomeStruct{id: 1}, %SomeStruct{id: 2}]\n iex> repo = MyApp.Repo\n iex> Bonfire.Ecto.Acts.Delete.maybe_delete(objects, repo)\n {:ok, 2}\n\n iex> object = %SomeStruct{id: 1}\n iex> repo = MyApp.Repo\n iex> Bonfire.Ecto.Acts.Delete.maybe_delete(object, repo)\n {:ok, 1}","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2-examples"},{"type":"function","title":"Bonfire.Ecto.Acts.Delete.run/2","doc":"Runs the delete act, marking the specified changeset or struct for deletion.\n\nThis function marks an object for deletion based on the `:on` key in the act options.\nIf associations are specified for deletion, they will be processed as well.","ref":"Bonfire.Ecto.Acts.Delete.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Delete.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Delete.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Delete.run/2","doc":"iex> epic = %Epic{assigns: %{some_key: %SomeStruct{}}, errors: []}\n iex> act = %{options: %{on: :some_key}}\n iex> Bonfire.Ecto.Acts.Delete.run(epic, act)\n %Epic{assigns: %{some_key: %SomeStruct{}}, errors: []}\n\n iex> epic = %Epic{assigns: %{some_key: %SomeStruct{}}, errors: [\"error\"]}\n iex> act = %{options: %{on: :some_key}}\n iex> Bonfire.Ecto.Acts.Delete.run(epic, act)\n %Epic{assigns: %{some_key: %SomeStruct{}}, errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Delete.html#run/2-examples"},{"type":"module","title":"Bonfire.Ecto.Acts.Work","doc":"An act that performs queued up work in a transaction.\n\nWork is queued up with calls to `add/2` in earlier acts and when run, this act will apply the\nappropriate actions.\n\nOnly runs if there are no epic or changesets errors.","ref":"Bonfire.Ecto.Acts.Work.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Work.add/2","doc":"Records that a particular key contains an `Ecto.Changeset` that needs to be processed (inserted, updated, upserted, or deleted).\n\nCall this in earlier acts to queue work for in-transaction processing.\n\nIf you wish to delete, you must ensure you set the changeset's `:action` key to `:delete`.","ref":"Bonfire.Ecto.Acts.Work.html#add/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Work.add/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `key` - The key representing the changeset to be processed.","ref":"Bonfire.Ecto.Acts.Work.html#add/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Work.add/2","doc":"iex> epic = %Epic{}\n iex> Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}}","ref":"Bonfire.Ecto.Acts.Work.html#add/2-examples"},{"type":"function","title":"Bonfire.Ecto.Acts.Work.run/2","doc":"Runs the queued work within a transaction if no errors are detected in the epic.\n\nThis function retrieves the list of keys scheduled for processing, validates them,\nand performs the appropriate actions (`:insert`, `:update`, `:upsert`, `:delete`) in a transaction.","ref":"Bonfire.Ecto.Acts.Work.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Work.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Work.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Work.run/2","doc":"iex> epic = %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: []}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Work.run(epic, act)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: []}\n\n iex> epic = %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: [\"error\"]}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Work.run(epic, act)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Work.html#run/2-examples"},{"type":"module","title":"Bonfire.Epics","doc":"Epics are a extensible way of structuring tasks.\n\nThis library is designed to provide a structured way to define and execute complex workflows in Elixir applications. It introduces the concept of \"Epics\" and \"Acts\" to organize and run sequences of operations.","ref":"Bonfire.Epics.html"},{"type":"module","title":"Key components and concepts: - Bonfire.Epics","doc":"- `Bonfire.Epics.Epic`: An Epic represents a complete workflow or process. It's a container that holds a sequence of Acts to be executed, along with state information, errors, and assigned values.\n- `Bonfire.Epics.Act`: An Act is an individual step or operation within an Epic. Each Act is typically a module that implements a specific task or functionality.\n- Execution Flow & Parallel Execution: Epics are executed by running their Acts in sequence. The library provides mechanisms to define, modify, and run these sequences. The library supports running multiple Acts in parallel for improved performance in certain scenarios.\n- Shared State: An Epic can maintain state throughout its execution using the 'assigns' map, allowing data to be passed between Acts.\n- Configurable: Epics can be defined in configuration, including at runtime, making it easy to set up and modify workflows without changing code.\n- Database Transactions: See the `Bonfire.Ecto` library for helpers to queue changeset operations within Acts and then run them all together in a single transaction: https://github.com/bonfire-networks/bonfire_ecto\n- Error Handling: The library includes built-in error handling, allowing errors to be captured and associated with specific Acts within an Epic.\n\nThis library is particularly useful for applications that need to manage complex, multi-step tasks with error handling and state management. It provides a flexible and extensible way to define, configure, and execute these processes, making it easier to maintain and modify complex workflows.","ref":"Bonfire.Epics.html#module-key-components-and-concepts"},{"type":"module","title":"How it works - Bonfire.Epics","doc":"1. Each Act is implemented as a module with a `run/2` function that performs a specific task.\n2. Users define an Epic, either in code or configuration, as sequences of Acts.\n3. When the Epic is run, it executes each Act in sequence (or with some Acts optionally running in parallel), maintaining state and handling errors along the way. Acts can update the Epic's state, adding errors, and assigning values that can be used by subsequent Acts.\n4. After all Acts are executed, the final state of the Epic is returned, including any errors or assigned values.","ref":"Bonfire.Epics.html#module-how-it-works"},{"type":"module","title":"1. How to write an Act - Bonfire.Epics","doc":"Write a module with a `run/2` function that takes an Epic and an Act, performs a specific task, and returns an Epic.\n\n```elixir\ndefmodule Bonfire.Label.Acts.LabelObject do\n @moduledoc \"\"\"\n Takes an object and label and returns a changeset for labeling that object. \n Implements `Bonfire.Epics.Act`.\n\n Epic Options:\n * `:current_user` - user that will create the page, required.\n\n Act Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.\n \"\"\"\n\n use Arrows\n import Bonfire.Epics\n\n @doc false\n def run(epic, act) do\n current_user = Bonfire.Common.Utils.current_user(epic.assigns[:options])\n\n cond do\n epic.errors != [] ->\n maybe_debug(\n epic,\n act,\n length(epic.errors),\n \"Skipping due to epic errors\"\n )\n\n epic\n\n not (is_struct(current_user) or is_binary(current_user)) ->\n maybe_debug(\n epic,\n act,\n current_user,\n \"Skipping due to missing current_user\"\n )\n\n epic\n\n true ->\n as = Keyword.get(act.options, :as) || Keyword.get(act.options, :on, :label)\n object_key = Keyword.get(act.options, :object, :object)\n\n label = Keyword.get(epic.assigns[:options], as, [])\n object = Keyword.get(epic.assigns[:options], object_key, nil)\n\n Bonfire.Label.Labelling.label_object(label, object,\n return: :changeset,\n current_user: current_user\n )\n |> Map.put(:action, :insert)\n |> Bonfire.Epics.Epic.assign(epic, as, ...)\n |> Bonfire.Ecto.Acts.Work.add(:label)\n end\n end\nend\n```","ref":"Bonfire.Epics.html#module-1-how-to-write-an-act"},{"type":"module","title":"2. How to define an Epic - Bonfire.Epics","doc":"","ref":"Bonfire.Epics.html#module-2-how-to-define-an-epic"},{"type":"module","title":"Simple Epic where each Act executes sequentially - Bonfire.Epics","doc":"```elixir\n @page_act_opts [on: :page, attrs: :page_attrs]\n\n config :bonfire_pages, Bonfire.Pages,\n epics: [\n create: [\n # Create a changeset for insertion\n {Bonfire.Pages.Acts.Page.Create, @page_act_opts},\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, @page_act_opts},\n # a caretaker,\n {Bonfire.Me.Acts.Caretaker, @page_act_opts},\n # and a creator,\n {Bonfire.Me.Acts.Creator, @page_act_opts},\n # and possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, @page_act_opts},\n # possibly with uploaded files,\n {Bonfire.Files.Acts.AttachMedia, @page_act_opts},\n # with extracted tags fully hooked up,\n {Bonfire.Tag.Acts.Tag, @page_act_opts},\n # and the appropriate boundaries established,\n {Bonfire.Boundaries.Acts.SetBoundaries, @page_act_opts},\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, @page_act_opts}\n ]\n ]\n```","ref":"Bonfire.Epics.html#module-simple-epic-where-each-act-executes-sequentially"},{"type":"module","title":"Advanced Epic, where some Acts execute in parallel - Bonfire.Epics","doc":"```elixir\n config :bonfire_posts, Bonfire.Posts,\n epics: [\n publish: [\n # Create a changeset for insertion\n Bonfire.Posts.Acts.Posts.Publish,\n # These next 3 Acts are run in parallel\n [\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, on: :post},\n\n # assign a caretaker,\n {Bonfire.Me.Acts.Caretaker, on: :post},\n\n # record the creator,\n {Bonfire.Me.Acts.Creator, on: :post}\n ],\n # These next 4 Acts are run in parallel (they run after the previous 3 because they depend on the outputs of those Acts)\n [\n # possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, on: :post},\n\n # possibly occurring in a thread,\n {Bonfire.Social.Acts.Threaded, on: :post},\n\n # with extracted tags/mentions fully hooked up,\n {Bonfire.Tag.Acts.Tag, on: :post},\n\n # maybe set as sensitive,\n {Bonfire.Social.Acts.Sensitivity, on: :post}\n ],\n # These next 3 Acts are run in parallel (they run after the previous 4 because they depend on the outputs of those Acts)\n [\n # possibly with uploaded/linked media (optionally depends on URLPreviews),\n {Bonfire.Files.Acts.AttachMedia, on: :post},\n\n # with appropriate boundaries established (depends on Threaded),\n {Bonfire.Boundaries.Acts.SetBoundaries, on: :post},\n\n # summarised by an activity (possibly appearing in feeds),\n {Bonfire.Social.Acts.Activity, on: :post}\n ],\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Preload data & Publish live feed updates via (in-memory) PubSub\n {Bonfire.Social.Acts.LivePush, on: :post},\n\n # These steps are run in parallel\n [\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, on: :post},\n\n # Prepare JSON for federation and add to queue (oban).\n {Bonfire.Social.Acts.Federate, on: :post}\n ],\n\n # Once the activity/object exists (depends on federation being done)\n {Bonfire.Tags.Acts.AutoBoost, on: :post}\n ]\n ]\n```","ref":"Bonfire.Epics.html#module-advanced-epic-where-some-acts-execute-in-parallel"},{"type":"module","title":"3. How to run an Epic - Bonfire.Epics","doc":"```elixir\nBonfire.Epics.run_epic(Bonfire.Posts, :publish, on: :post)\n```","ref":"Bonfire.Epics.html#module-3-how-to-run-an-epic"},{"type":"module","title":"Copyright and License - Bonfire.Epics","doc":"Copyright (c) 2022 Bonfire Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Bonfire.Epics.html#module-copyright-and-license"},{"type":"macro","title":"Bonfire.Epics.maybe_debug/3","doc":"","ref":"Bonfire.Epics.html#maybe_debug/3"},{"type":"macro","title":"Bonfire.Epics.maybe_debug/4","doc":"","ref":"Bonfire.Epics.html#maybe_debug/4"},{"type":"function","title":"Bonfire.Epics.run_epic/3","doc":"Runs a series of `Bonfire.Epics.Epic` operations based on configured Acts for this module.","ref":"Bonfire.Epics.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Epics.run_epic/3","doc":"- `config_key`: The config key from which to load the Epic definition, such as a module name.\n- `type`: The type of epic operation to run.\n- `options`: Options for the epic operation, including `:on` for the key in the epic assigns to return on success (default to `:result`).","ref":"Bonfire.Epics.html#run_epic/3-parameters"},{"type":"function","title":"Returns - Bonfire.Epics.run_epic/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Epics.html#run_epic/3-returns"},{"type":"function","title":"Examples - Bonfire.Epics.run_epic/3","doc":"# runs an Epic defined in config at `config :bonfire_posts, Bonfire.Posts, epics: [publish: [...]]`\n iex> Bonfire.Epics.run_epic(Bonfire.Posts, :publish, [on: :post])\n {:ok, %{}}","ref":"Bonfire.Epics.html#run_epic/3-examples"},{"type":"macro","title":"Bonfire.Epics.smart/4","doc":"Like `debug`, but will omit fully outputting the inspectable thing\nand still print the message if only `:debug` is set","ref":"Bonfire.Epics.html#smart/4"},{"type":"behaviour","title":"Bonfire.Epics.Act","doc":"Represents an individual Act within an Epic.\n\nAn Act is a struct containing a module to be executed, options, and metadata.\n\nThis module provides functionality to create new Acts and define their behavior. See `Bonfire.Epics` docs for an example Act.","ref":"Bonfire.Epics.Act.html"},{"type":"macro","title":"Bonfire.Epics.Act.debug/3","doc":"","ref":"Bonfire.Epics.Act.html#debug/3"},{"type":"function","title":"Bonfire.Epics.Act.new/1","doc":"Creates a new Act for the given module.","ref":"Bonfire.Epics.Act.html#new/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/1","doc":"- `module`: The module to be executed.","ref":"Bonfire.Epics.Act.html#new/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/1","doc":"iex> Bonfire.Epics.Act.new(MyActModule)\n %Bonfire.Epics.Act{module: MyActModule, options: [], meta: nil}","ref":"Bonfire.Epics.Act.html#new/1-examples"},{"type":"function","title":"Bonfire.Epics.Act.new/2","doc":"Creates a new Act for the given module, with options.","ref":"Bonfire.Epics.Act.html#new/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/2","doc":"- `module`: The module to be executed.\n- `options`: A keyword list of options for the Act.","ref":"Bonfire.Epics.Act.html#new/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/2","doc":"iex> Bonfire.Epics.Act.new(MyActModule, [option1: :value1])\n %Bonfire.Epics.Act{module: MyActModule, options: [option1: :value1], meta: nil}","ref":"Bonfire.Epics.Act.html#new/2-examples"},{"type":"function","title":"Bonfire.Epics.Act.new/3","doc":"Creates a new Act for the given module, with options and metadata.","ref":"Bonfire.Epics.Act.html#new/3"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/3","doc":"- `module`: The module to be executed.\n- `options`: A keyword list of options for the Act.\n- `meta`: Any additional metadata for the Act.","ref":"Bonfire.Epics.Act.html#new/3-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/3","doc":"iex> Bonfire.Epics.Act.new(MyActModule, [option1: :value1], %{extra: \"data\"})\n %Bonfire.Epics.Act{module: MyActModule, options: [option1: :value1], meta: %{extra: \"data\"}}","ref":"Bonfire.Epics.Act.html#new/3-examples"},{"type":"callback","title":"Bonfire.Epics.Act.run/2","doc":"Callback for running an Act.\n\nThis function should be implemented by modules that define Acts.","ref":"Bonfire.Epics.Act.html#c:run/2"},{"type":"callback","title":"Parameters - Bonfire.Epics.Act.run/2","doc":"- `epic`: The current Epic struct.\n- `act`: The current Act struct.","ref":"Bonfire.Epics.Act.html#c:run/2-parameters"},{"type":"callback","title":"Returns - Bonfire.Epics.Act.run/2","doc":"The return value can be one of the following:\n- `Epic.t()`\n- `Act.t()`\n- `{:ok, Epic.t()}`\n- `{:ok, Act.t()}`\n- `{:ok, Epic.t(), Act.t()}`\n- `{:error, any}`","ref":"Bonfire.Epics.Act.html#c:run/2-returns"},{"type":"type","title":"Bonfire.Epics.Act.ret/0","doc":"","ref":"Bonfire.Epics.Act.html#t:ret/0"},{"type":"type","title":"Bonfire.Epics.Act.t/0","doc":"Represents an Act struct.\n\n- `:module` - The module to be executed.\n- `:options` - A keyword list of options for the Act.\n- `:meta` - Any additional metadata for the Act.","ref":"Bonfire.Epics.Act.html#t:t/0"},{"type":"module","title":"Bonfire.Epics.Debug","doc":"","ref":"Bonfire.Epics.Debug.html"},{"type":"function","title":"Bonfire.Epics.Debug.do_maybe_debug/4","doc":"","ref":"Bonfire.Epics.Debug.html#do_maybe_debug/4"},{"type":"function","title":"Bonfire.Epics.Debug.opts/2","doc":"","ref":"Bonfire.Epics.Debug.html#opts/2"},{"type":"module","title":"Bonfire.Epics.Epic","doc":"Represents and manages an Epic, which is a sequence of Acts to be executed.\n\nAn Epic is a struct containing lists of previous and next steps, errors, and assigns.\n\nThis module provides functionality to create, modify, and run Epics, as well as handle errors\nand debugging.","ref":"Bonfire.Epics.Epic.html"},{"type":"function","title":"Bonfire.Epics.Epic.add_error/2","doc":"Adds an error to the Epic.","ref":"Bonfire.Epics.Epic.html#add_error/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.add_error/2","doc":"- `epic`: The Epic struct.\n- `error`: The Error struct to add.","ref":"Bonfire.Epics.Epic.html#add_error/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.add_error/2","doc":"iex> epic = %Bonfire.Epics.Epic{}\n iex> error = %Bonfire.Epics.Error{error: \"Something went wrong\"}\n iex> Bonfire.Epics.Epic.add_error(epic, error)\n %Bonfire.Epics.Epic{errors: [%Bonfire.Epics.Error{error: \"Something went wrong\"}]}","ref":"Bonfire.Epics.Epic.html#add_error/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.add_error/5","doc":"","ref":"Bonfire.Epics.Epic.html#add_error/5"},{"type":"function","title":"Bonfire.Epics.Epic.append/2","doc":"Appends Act(s) to the end of the Epic's next steps.","ref":"Bonfire.Epics.Epic.html#append/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.append/2","doc":"- `self`: The Epic struct.\n- `acts`: A list of Acts or a single Act to append.","ref":"Bonfire.Epics.Epic.html#append/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.append/2","doc":"iex> epic = %Bonfire.Epics.Epic{next: [Act1]}\n iex> Bonfire.Epics.Epic.append(epic, [Act2])\n %Bonfire.Epics.Epic{next: [Act1, Act2]}","ref":"Bonfire.Epics.Epic.html#append/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.assign/3","doc":"Assigns a value to the Epic's assigns.","ref":"Bonfire.Epics.Epic.html#assign/3"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.assign/3","doc":"- `self`: The Epic struct.\n- `name`: The atom key for the assign.\n- `value`: The value to assign.","ref":"Bonfire.Epics.Epic.html#assign/3-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.assign/3","doc":"iex> epic = %Bonfire.Epics.Epic{}\n iex> Bonfire.Epics.Epic.assign(epic, :foo, \"bar\")\n %Bonfire.Epics.Epic{assigns: %{foo: \"bar\"}}","ref":"Bonfire.Epics.Epic.html#assign/3-examples"},{"type":"macro","title":"Bonfire.Epics.Epic.debug/3","doc":"","ref":"Bonfire.Epics.Epic.html#debug/3"},{"type":"function","title":"Bonfire.Epics.Epic.from_config!/2","doc":"Loads an epic from the app's config.","ref":"Bonfire.Epics.Epic.html#from_config!/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.from_config!/2","doc":"- `config_key`: The config key to load, such as a module atom (in which case it will load it from that module's app config).\n- `name`: The name atom of the epic in the config.","ref":"Bonfire.Epics.Epic.html#from_config!/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.from_config!/2","doc":"iex> Bonfire.Epics.Epic.from_config!(MyApp.Module, :my_epic)\n %Bonfire.Epics.Epic{...}\n\n iex> Bonfire.Epics.Epic.from_config!(:my_key, :my_other_epic)\n %Bonfire.Epics.Epic{...}","ref":"Bonfire.Epics.Epic.html#from_config!/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.from_spec!/1","doc":"Creates an `Epic` from a specification of steps.","ref":"Bonfire.Epics.Epic.html#from_spec!/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.from_spec!/1","doc":"- `acts`: A list of act specifications.","ref":"Bonfire.Epics.Epic.html#from_spec!/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.from_spec!/1","doc":"iex> Bonfire.Epics.Epic.from_spec!([MyAct, {OtherAct, [option: :value]}])\n %Bonfire.Epics.Epic{...}","ref":"Bonfire.Epics.Epic.html#from_spec!/1-examples"},{"type":"macro","title":"Bonfire.Epics.Epic.maybe_debug/3","doc":"","ref":"Bonfire.Epics.Epic.html#maybe_debug/3"},{"type":"function","title":"Bonfire.Epics.Epic.new/1","doc":"Creates a new Epic with the given list of next steps.","ref":"Bonfire.Epics.Epic.html#new/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.new/1","doc":"- `next`: A list of Acts to be executed.","ref":"Bonfire.Epics.Epic.html#new/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.new/1","doc":"iex> Bonfire.Epics.Epic.new([MyAct, OtherAct])\n %Bonfire.Epics.Epic{next: [MyAct, OtherAct]}","ref":"Bonfire.Epics.Epic.html#new/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.prepend/2","doc":"Prepends Act(s) to the beginning of the Epic's next steps.","ref":"Bonfire.Epics.Epic.html#prepend/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.prepend/2","doc":"- `self`: The Epic struct.\n- `acts`: A list of Acts or a single Act to prepend.","ref":"Bonfire.Epics.Epic.html#prepend/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.prepend/2","doc":"iex> epic = %Bonfire.Epics.Epic{next: [Act2]}\n iex> Bonfire.Epics.Epic.prepend(epic, [Act1])\n %Bonfire.Epics.Epic{next: [Act1, Act2]}","ref":"Bonfire.Epics.Epic.html#prepend/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.render_errors/1","doc":"Renders all errors in the Epic as a string.","ref":"Bonfire.Epics.Epic.html#render_errors/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.render_errors/1","doc":"- `epic`: The Epic struct containing errors.","ref":"Bonfire.Epics.Epic.html#render_errors/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.render_errors/1","doc":"iex> epic = %Bonfire.Epics.Epic{errors: [%Bonfire.Epics.Error{error: \"Error 1\"}, %Bonfire.Epics.Error{error: \"Error 2\"}]}\n iex> Bonfire.Epics.Epic.render_errors(epic)\n \"Error 1\\nError 2\"","ref":"Bonfire.Epics.Epic.html#render_errors/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.run/1","doc":"Runs the Epic, executing each Act in sequence (with some Acts optionally running in parallel).","ref":"Bonfire.Epics.Epic.html#run/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.run/1","doc":"- `epic`: The Epic struct to run.","ref":"Bonfire.Epics.Epic.html#run/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.run/1","doc":"iex> epic = Bonfire.Epics.Epic.new([MyAct, OtherAct])\n iex> Bonfire.Epics.Epic.run(epic)\n %Bonfire.Epics.Epic{prev: [OtherAct, MyAct], next: [], ...}","ref":"Bonfire.Epics.Epic.html#run/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.update/4","doc":"Updates an assign in the Epic using a function.","ref":"Bonfire.Epics.Epic.html#update/4"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.update/4","doc":"- `self`: The Epic struct.\n- `name`: The atom key for the assign.\n- `default`: The default value if the assign doesn't exist.\n- `fun`: The function to apply to the current value.","ref":"Bonfire.Epics.Epic.html#update/4-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.update/4","doc":"iex> epic = %Bonfire.Epics.Epic{assigns: %{count: 1}}\n iex> Bonfire.Epics.Epic.update(epic, :count, 0, &(&1 + 1))\n %Bonfire.Epics.Epic{assigns: %{count: 2}}","ref":"Bonfire.Epics.Epic.html#update/4-examples"},{"type":"type","title":"Bonfire.Epics.Epic.t/0","doc":"Represents an Epic struct.\n\n- `:prev` - List of Acts that have already been run.\n- `:next` - List of remaining Acts to be run (may be modified during run).\n- `:errors` - List of errors (accrued during run).\n- `:assigns` - Map of assigned values (may be modified during run).","ref":"Bonfire.Epics.Epic.html#t:t/0"},{"type":"exception","title":"Bonfire.Epics.Error","doc":"","ref":"Bonfire.Epics.Error.html"},{"type":"function","title":"Bonfire.Epics.Error.message/1","doc":"","ref":"Bonfire.Epics.Error.html#message/1"},{"type":"module","title":"Bonfire.Epics.Test","doc":"","ref":"Bonfire.Epics.Test.html"},{"type":"macro","title":"Bonfire.Epics.Test.assert_epic_ok/1","doc":"","ref":"Bonfire.Epics.Test.html#assert_epic_ok/1"},{"type":"function","title":"Bonfire.Epics.Test.debug_error/1","doc":"","ref":"Bonfire.Epics.Test.html#debug_error/1"},{"type":"module","title":"Bonfire.Files","doc":"File management extension for Bonfire. \n\nBonfire Files wraps the `Entrepot` a file management library, \nadding support for media type checking, image resizing, and the like, \nalong with creating a [pointable][1] table for storage of file data.\n\n[1]: https://github.com/bonfire-networks/needle","ref":"Bonfire.Files.html"},{"type":"module","title":"Configuration - Bonfire.Files","doc":"","ref":"Bonfire.Files.html#module-configuration"},{"type":"module","title":"TODO's - Bonfire.Files","doc":"- Generate docs\n- More tests\n\n\nThis module contains general functions for handling files, and also an Ecto schema which is a multimixin for storing one or more media attached to a Pointable object.\n\nAn uploader definition must be provided for each upload, or will be automatically chosen based on the file type.\n\nA few definitions exist as defaults inside of this namespace, but you can also define\nyour own - a `Bonfire.Files.Definition` is an extension of `Waffle.Definition`,\nhowever the `allowed_media_types/0` and `max_file_size/0` callback are added,\nwith which you need to define what media types are accepted for these types of uploads.\n(You can also return `:all` to accept all media types).\n\nTo use the uploader:\n\n iex> {:ok, media} = Bonfire.Files.upload(MyUploader, creator_or_context, %{path: \"./150.png\"})\n iex> media.media_type\n \"image/png\"\n iex> Bonfire.Files.remote_url(MyUploader, media)\n \"/uploads/my/01F3AY6JV30G06BY4DR9BTW5EH\"","ref":"Bonfire.Files.html#module-todo-s"},{"type":"function","title":"Bonfire.Files.ap_publish_activity/1","doc":"","ref":"Bonfire.Files.html#ap_publish_activity/1"},{"type":"function","title":"Bonfire.Files.ap_receive_attachments/2","doc":"","ref":"Bonfire.Files.html#ap_receive_attachments/2"},{"type":"function","title":"Bonfire.Files.data_url/2","doc":"","ref":"Bonfire.Files.html#data_url/2"},{"type":"function","title":"Bonfire.Files.delete/2","doc":"","ref":"Bonfire.Files.html#delete/2"},{"type":"function","title":"Bonfire.Files.delete_files/3","doc":"","ref":"Bonfire.Files.html#delete_files/3"},{"type":"function","title":"Bonfire.Files.extract_metadata/1","doc":"","ref":"Bonfire.Files.html#extract_metadata/1"},{"type":"function","title":"Bonfire.Files.file_extension/1","doc":"","ref":"Bonfire.Files.html#file_extension/1"},{"type":"function","title":"Bonfire.Files.file_extension_only/1","doc":"","ref":"Bonfire.Files.html#file_extension_only/1"},{"type":"function","title":"Bonfire.Files.full_url/3","doc":"","ref":"Bonfire.Files.html#full_url/3"},{"type":"function","title":"Bonfire.Files.get/3","doc":"","ref":"Bonfire.Files.html#get/3"},{"type":"function","title":"Bonfire.Files.local_path/3","doc":"","ref":"Bonfire.Files.html#local_path/3"},{"type":"function","title":"Bonfire.Files.normalise_size/2","doc":"","ref":"Bonfire.Files.html#normalise_size/2"},{"type":"function","title":"Bonfire.Files.put/3","doc":"","ref":"Bonfire.Files.html#put/3"},{"type":"function","title":"Bonfire.Files.remote_url/3","doc":"Return the URL that a local file has.","ref":"Bonfire.Files.html#remote_url/3"},{"type":"function","title":"Bonfire.Files.upload/5","doc":"Attempt to store a file, returning an upload, for any parent item that\nparticipates in the meta abstraction, providing the user/context of\nthe upload.","ref":"Bonfire.Files.html#upload/5"},{"type":"function","title":"Bonfire.Files.validate/3","doc":"","ref":"Bonfire.Files.html#validate/3"},{"type":"module","title":"Bonfire.Files.Acts.AttachMedia","doc":"Saves uploaded files as attachments to the post.\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.\n * `:uploads` - epic options key to find the uploaded media objects at, default: `:uploaded_media`.","ref":"Bonfire.Files.Acts.AttachMedia.html"},{"type":"function","title":"Bonfire.Files.Acts.AttachMedia.cast/2","doc":"","ref":"Bonfire.Files.Acts.AttachMedia.html#cast/2"},{"type":"function","title":"Bonfire.Files.Acts.AttachMedia.run/2","doc":"","ref":"Bonfire.Files.Acts.AttachMedia.html#run/2"},{"type":"module","title":"Bonfire.Files.Acts.Delete","doc":"An act that deletes media","ref":"Bonfire.Files.Acts.Delete.html"},{"type":"module","title":"Bonfire.Files.Acts.URLPreviews","doc":"Fetch and save metadata of URLs\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.\n * `:uploads` - epic options key to find the uploaded media objects at, default: `:urls`.","ref":"Bonfire.Files.Acts.URLPreviews.html"},{"type":"function","title":"Bonfire.Files.Acts.URLPreviews.maybe_fetch_and_save/3","doc":"","ref":"Bonfire.Files.Acts.URLPreviews.html#maybe_fetch_and_save/3"},{"type":"function","title":"Bonfire.Files.Acts.URLPreviews.run/2","doc":"","ref":"Bonfire.Files.Acts.URLPreviews.html#run/2"},{"type":"module","title":"Bonfire.Files.BannerUploader","doc":"Uploader for larger images, for example, a profile page banner.\n\nDoes not do any type of image resizing/thumbnailing.","ref":"Bonfire.Files.BannerUploader.html"},{"type":"function","title":"Bonfire.Files.BannerUploader.acl/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.asset_host/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.async/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.attach/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.blurhash/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.blurred/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.bucket/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.bucket/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.default_url/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.default_url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.delete/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.filename/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.max_height/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#max_height/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.max_width/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.prepare/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.remote_url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.store/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.transform/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.upload/4","doc":"","ref":"Bonfire.Files.BannerUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/3","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.BannerUploader.urls/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.validate/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.Blurred","doc":"","ref":"Bonfire.Files.Blurred.html"},{"type":"function","title":"Bonfire.Files.Blurred.blurhash/2","doc":"","ref":"Bonfire.Files.Blurred.html#blurhash/2"},{"type":"function","title":"Bonfire.Files.Blurred.blurhash_cached/1","doc":"","ref":"Bonfire.Files.Blurred.html#blurhash_cached/1"},{"type":"function","title":"Bonfire.Files.Blurred.blurred/2","doc":"Create a blurred JPEG (deprecated in favour of blurhash)","ref":"Bonfire.Files.Blurred.html#blurred/2"},{"type":"function","title":"Bonfire.Files.Blurred.make_blurhash/1","doc":"","ref":"Bonfire.Files.Blurred.html#make_blurhash/1"},{"type":"module","title":"Bonfire.Files.CapsuleIntegration.Attacher","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.attach/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#attach/3"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.storages/2","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#storages/2"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.store/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#store/3"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.upload/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#upload/3"},{"type":"module","title":"Bonfire.Files.DOI","doc":"","ref":"Bonfire.Files.DOI.html"},{"type":"function","title":"Bonfire.Files.DOI.fetch/2","doc":"","ref":"Bonfire.Files.DOI.html#fetch/2"},{"type":"function","title":"Bonfire.Files.DOI.fetch_crossref/1","doc":"","ref":"Bonfire.Files.DOI.html#fetch_crossref/1"},{"type":"function","title":"Bonfire.Files.DOI.is_doi?/1","doc":"","ref":"Bonfire.Files.DOI.html#is_doi?/1"},{"type":"function","title":"Bonfire.Files.DOI.is_pub_id_or_uri_match?/1","doc":"","ref":"Bonfire.Files.DOI.html#is_pub_id_or_uri_match?/1"},{"type":"function","title":"Bonfire.Files.DOI.maybe_fetch/1","doc":"","ref":"Bonfire.Files.DOI.html#maybe_fetch/1"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_and_uri_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_and_uri_matchers/0"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_matcher/1","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_matcher/1"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_matchers/0"},{"type":"function","title":"Bonfire.Files.DOI.pub_uri_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_uri_matchers/0"},{"type":"behaviour","title":"Bonfire.Files.Definition","doc":"Extension to Waffle.Definition, adding support for checking against media types\nparsed through magic bytes instead of file extensions, which can be modified by the user.\n\nYou can still use validate/2 and other waffle callbacks.","ref":"Bonfire.Files.Definition.html"},{"type":"callback","title":"Bonfire.Files.Definition.allowed_media_types/0","doc":"","ref":"Bonfire.Files.Definition.html#c:allowed_media_types/0"},{"type":"callback","title":"Bonfire.Files.Definition.max_file_size/0","doc":"","ref":"Bonfire.Files.Definition.html#c:max_file_size/0"},{"type":"module","title":"Bonfire.Files.DocumentUploader","doc":"","ref":"Bonfire.Files.DocumentUploader.html"},{"type":"function","title":"Bonfire.Files.DocumentUploader.acl/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.asset_host/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.async/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.attach/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.blurhash/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.blurred/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.bucket/0","doc":"Definition for any type of document, allows most media types\nthat support documents, archives, video and audio.","ref":"Bonfire.Files.DocumentUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.bucket/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.default_url/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.default_url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.delete/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.filename/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.prepare/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.remote_url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.store/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.transform/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.upload/4","doc":"","ref":"Bonfire.Files.DocumentUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/3","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.DocumentUploader.urls/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.validate/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.EmojiUploader","doc":"","ref":"Bonfire.Files.EmojiUploader.html"},{"type":"function","title":"Bonfire.Files.EmojiUploader.acl/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.add_emoji/4","doc":"","ref":"Bonfire.Files.EmojiUploader.html#add_emoji/4"},{"type":"function","title":"Bonfire.Files.EmojiUploader.asset_host/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.async/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.attach/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.blurhash/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.blurred/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.EmojiUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.bucket/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.default_url/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.default_url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.delete/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.filename/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.list/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#list/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.media_put_setting/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#media_put_setting/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare_meta/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare_meta/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare_setting/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare_setting/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.put_setting/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#put_setting/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.remote_url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.store/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.transform/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.upload/4","doc":"","ref":"Bonfire.Files.EmojiUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.urls/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.validate/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.FaviconStore","doc":"","ref":"Bonfire.Files.FaviconStore.html"},{"type":"function","title":"Bonfire.Files.FaviconStore.acl/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#acl/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.asset_host/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.async/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#async/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.attach/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#attach/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.blurhash/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.blurred/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#blurred/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.bucket/0","doc":"Definition for storing media types for a URL","ref":"Bonfire.Files.FaviconStore.html#bucket/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.bucket/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#bucket/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.cached_or_async_fetch_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#cached_or_async_fetch_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.cached_or_fetch/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#cached_or_fetch/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.default_url/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#default_url/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.default_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#default_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.delete/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#delete/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.favicon_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#favicon_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.filename/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#filename/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.prefix_dir/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.prepare/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#prepare/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.remote_file_headers/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.remote_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.s3_object_headers/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.storage_dir/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.store/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#store/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.transform/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#transform/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.upload/4","doc":"","ref":"Bonfire.Files.FaviconStore.html#upload/4"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/3","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/3"},{"type":"function","title":"Bonfire.Files.FaviconStore.urls/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#urls/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.validate/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#validate/1"},{"type":"module","title":"Bonfire.Files.FileDenied","doc":"","ref":"Bonfire.Files.FileDenied.html"},{"type":"function","title":"Bonfire.Files.FileDenied.new/1","doc":"","ref":"Bonfire.Files.FileDenied.html#new/1"},{"type":"type","title":"Bonfire.Files.FileDenied.t/0","doc":"","ref":"Bonfire.Files.FileDenied.html#t:t/0"},{"type":"module","title":"Bonfire.Files.IconUploader","doc":"","ref":"Bonfire.Files.IconUploader.html"},{"type":"function","title":"Bonfire.Files.IconUploader.acl/2","doc":"","ref":"Bonfire.Files.IconUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.IconUploader.asset_host/0","doc":"","ref":"Bonfire.Files.IconUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.IconUploader.async/0","doc":"","ref":"Bonfire.Files.IconUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.IconUploader.attach/2","doc":"","ref":"Bonfire.Files.IconUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.IconUploader.blurhash/1","doc":"","ref":"Bonfire.Files.IconUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.IconUploader.blurred/1","doc":"","ref":"Bonfire.Files.IconUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.IconUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.IconUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.IconUploader.bucket/1","doc":"","ref":"Bonfire.Files.IconUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.IconUploader.default_url/1","doc":"","ref":"Bonfire.Files.IconUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.IconUploader.default_url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.delete/1","doc":"","ref":"Bonfire.Files.IconUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.IconUploader.filename/2","doc":"","ref":"Bonfire.Files.IconUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.IconUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.IconUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.IconUploader.prepare/1","doc":"","ref":"Bonfire.Files.IconUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.IconUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.IconUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.IconUploader.remote_url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.IconUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.IconUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.IconUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.IconUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.IconUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.IconUploader.store/1","doc":"","ref":"Bonfire.Files.IconUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.IconUploader.transform/2","doc":"","ref":"Bonfire.Files.IconUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.IconUploader.upload/4","doc":"","ref":"Bonfire.Files.IconUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.IconUploader.url/1","doc":"","ref":"Bonfire.Files.IconUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.IconUploader.url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.url/3","doc":"","ref":"Bonfire.Files.IconUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.IconUploader.urls/2","doc":"","ref":"Bonfire.Files.IconUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.IconUploader.validate/1","doc":"","ref":"Bonfire.Files.IconUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.ImageUploader","doc":"Uploader for larger images, for example, a profile page banner.\n\nDoes not do any type of image resizing/thumbnailing.","ref":"Bonfire.Files.ImageUploader.html"},{"type":"function","title":"Bonfire.Files.ImageUploader.acl/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.asset_host/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.async/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.attach/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.blurhash/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.blurred/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.bucket/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.bucket/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.default_url/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.default_url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.delete/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.filename/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.max_width/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.prepare/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.remote_url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.store/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.transform/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.upload/4","doc":"","ref":"Bonfire.Files.ImageUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/3","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.ImageUploader.urls/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.validate/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.LiveHandler","doc":"","ref":"Bonfire.Files.LiveHandler.html"},{"type":"function","title":"Bonfire.Files.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Files.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Files.LiveHandler.handle_progress/3","doc":"","ref":"Bonfire.Files.LiveHandler.html#handle_progress/3"},{"type":"function","title":"Bonfire.Files.LiveHandler.set_fallback/5","doc":"","ref":"Bonfire.Files.LiveHandler.html#set_fallback/5"},{"type":"macro","title":"Bonfire.Files.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Files.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Files.Media","doc":"","ref":"Bonfire.Files.Media.html"},{"type":"function","title":"Bonfire.Files.Media.ap_publish_activity/3","doc":"","ref":"Bonfire.Files.Media.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Files.Media.ap_receive_activity/3","doc":"","ref":"Bonfire.Files.Media.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Files.Media.context_module/0","doc":"","ref":"Bonfire.Files.Media.html#context_module/0"},{"type":"function","title":"Bonfire.Files.Media.delete/2","doc":"","ref":"Bonfire.Files.Media.html#delete/2"},{"type":"function","title":"Bonfire.Files.Media.description/1","doc":"","ref":"Bonfire.Files.Media.html#description/1"},{"type":"function","title":"Bonfire.Files.Media.federation_module/0","doc":"","ref":"Bonfire.Files.Media.html#federation_module/0"},{"type":"function","title":"Bonfire.Files.Media.get/3","doc":"","ref":"Bonfire.Files.Media.html#get/3"},{"type":"function","title":"Bonfire.Files.Media.get_by_path/1","doc":"","ref":"Bonfire.Files.Media.html#get_by_path/1"},{"type":"function","title":"Bonfire.Files.Media.hard_delete/2","doc":"Delete an upload, removing any associated files.","ref":"Bonfire.Files.Media.html#hard_delete/2"},{"type":"function","title":"Bonfire.Files.Media.insert/4","doc":"","ref":"Bonfire.Files.Media.html#insert/4"},{"type":"function","title":"Bonfire.Files.Media.many/2","doc":"","ref":"Bonfire.Files.Media.html#many/2"},{"type":"function","title":"Bonfire.Files.Media.media_label/1","doc":"","ref":"Bonfire.Files.Media.html#media_label/1"},{"type":"function","title":"Bonfire.Files.Media.one/2","doc":"","ref":"Bonfire.Files.Media.html#one/2"},{"type":"function","title":"Bonfire.Files.Media.put/3","doc":"","ref":"Bonfire.Files.Media.html#put/3"},{"type":"function","title":"Bonfire.Files.Media.query_module/0","doc":"","ref":"Bonfire.Files.Media.html#query_module/0"},{"type":"function","title":"Bonfire.Files.Media.schema_module/0","doc":"","ref":"Bonfire.Files.Media.html#schema_module/0"},{"type":"function","title":"Bonfire.Files.Media.soft_delete/1","doc":"Delete an upload, removing it from indexing, but the files remain available.","ref":"Bonfire.Files.Media.html#soft_delete/1"},{"type":"function","title":"Bonfire.Files.Media.unwrap/1","doc":"","ref":"Bonfire.Files.Media.html#unwrap/1"},{"type":"function","title":"Bonfire.Files.Media.update/3","doc":"","ref":"Bonfire.Files.Media.html#update/3"},{"type":"function","title":"Bonfire.Files.Media.update_by/2","doc":"","ref":"Bonfire.Files.Media.html#update_by/2"},{"type":"type","title":"Bonfire.Files.Media.t/0","doc":"","ref":"Bonfire.Files.Media.html#t:t/0"},{"type":"module","title":"Bonfire.Files.Media.Queries","doc":"","ref":"Bonfire.Files.Media.Queries.html"},{"type":"function","title":"Bonfire.Files.Media.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Files.Media.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Files.Media.Queries.query/1","doc":"","ref":"Bonfire.Files.Media.Queries.html#query/1"},{"type":"function","title":"Bonfire.Files.Media.Queries.query/2","doc":"","ref":"Bonfire.Files.Media.Queries.html#query/2"},{"type":"module","title":"Bonfire.Files.MediaEdit","doc":"","ref":"Bonfire.Files.MediaEdit.html"},{"type":"function","title":"Bonfire.Files.MediaEdit.banner/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#banner/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.blur/2","doc":"","ref":"Bonfire.Files.MediaEdit.html#blur/2"},{"type":"function","title":"Bonfire.Files.MediaEdit.dominant_color/3","doc":"Returns the dominant color of an image (given as path, binary, or stream) as HEX value.\n\n`bins` is an integer number of color frequency bins the image is divided into. The default is 10.","ref":"Bonfire.Files.MediaEdit.html#dominant_color/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.frame_to_scrub/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#frame_to_scrub/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.image/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#image/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.image_resize_thumbnail/4","doc":"","ref":"Bonfire.Files.MediaEdit.html#image_resize_thumbnail/4"},{"type":"function","title":"Bonfire.Files.MediaEdit.image_save_temp_file/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#image_save_temp_file/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail/2","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail/2"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail_pdf/1","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail_pdf/1"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail_video/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail_video/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.video_convert/1","doc":"Converts video into a browser-supported format. NOTE: in dev mode on OSX, you can install ffmpeg with maximal features using https://gist.github.com/Piasy/b5dfd5c048eb69d1b91719988c0325d8?permalink_comment_id=3812563#gistcomment-3812563","ref":"Bonfire.Files.MediaEdit.html#video_convert/1"},{"type":"function","title":"Bonfire.Files.MediaEdit.video_image_thumbnail/4","doc":"","ref":"Bonfire.Files.MediaEdit.html#video_image_thumbnail/4"},{"type":"module","title":"Bonfire.Files.MimeTypes","doc":"","ref":"Bonfire.Files.MimeTypes.html"},{"type":"function","title":"Bonfire.Files.MimeTypes.extra_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#extra_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.image_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#image_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.supported_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#supported_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.unique_extension_for_mime/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#unique_extension_for_mime/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.video_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#video_media/0"},{"type":"module","title":"Bonfire.Files.Prepare","doc":"","ref":"Bonfire.Files.Prepare.html"},{"type":"function","title":"Bonfire.Files.Prepare.prepare/2","doc":"","ref":"Bonfire.Files.Prepare.html#prepare/2"},{"type":"module","title":"Bonfire.Files.Queues.VideoTranscode","doc":"WIP https://github.com/bonfire-networks/bonfire-app/issues/920","ref":"Bonfire.Files.Queues.VideoTranscode.html"},{"type":"function","title":"Bonfire.Files.Queues.VideoTranscode.transcode/1","doc":"","ref":"Bonfire.Files.Queues.VideoTranscode.html#transcode/1"},{"type":"module","title":"Bonfire.Files.ResponsiveImage","doc":"Resizes images at compile time (when possible) or runtime:\n\n```\nuse Bonfire.Files.ResponsiveImage\n\n~H( )\nor\n~H( )\n\nor for paths only known at runtime:\n~H( )\nor\n~H( )\n```","ref":"Bonfire.Files.ResponsiveImage.html"},{"type":"macro","title":"Bonfire.Files.ResponsiveImage.compile_src/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#compile_src/2"},{"type":"macro","title":"Bonfire.Files.ResponsiveImage.compile_srcset/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#compile_srcset/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize/1","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize/1"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize_timed/1","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize_timed/1"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.src/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#src/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.srcset/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#srcset/2"},{"type":"module","title":"Bonfire.Files.Routes","doc":"","ref":"Bonfire.Files.Routes.html"},{"type":"module","title":"Bonfire.Files.RuntimeConfig","doc":"","ref":"Bonfire.Files.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Files.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Files.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Files.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Files.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Files.Simulation","doc":"","ref":"Bonfire.Files.Simulation.html"},{"type":"function","title":"Bonfire.Files.Simulation.cleanup/1","doc":"","ref":"Bonfire.Files.Simulation.html#cleanup/1"},{"type":"function","title":"Bonfire.Files.Simulation.fake_upload/2","doc":"","ref":"Bonfire.Files.Simulation.html#fake_upload/2"},{"type":"function","title":"Bonfire.Files.Simulation.geometry/1","doc":"","ref":"Bonfire.Files.Simulation.html#geometry/1"},{"type":"function","title":"Bonfire.Files.Simulation.icon_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#icon_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.image_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#image_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.pdf_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#pdf_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.text_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#text_file/0"},{"type":"module","title":"Bonfire.Files.Versions","doc":"","ref":"Bonfire.Files.Versions.html"},{"type":"module","title":"Bonfire.Files.VideoUploader","doc":"","ref":"Bonfire.Files.VideoUploader.html"},{"type":"function","title":"Bonfire.Files.VideoUploader.acl/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.asset_host/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.async/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.attach/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.blurhash/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.blurred/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.VideoUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.bucket/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.default_url/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.default_url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.delete/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.filename/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.max_height/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#max_height/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.max_width/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.prepare/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.remote_url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.store/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.transform/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.transform_timeout/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#transform_timeout/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.upload/4","doc":"","ref":"Bonfire.Files.VideoUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/3","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.VideoUploader.urls/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.validate/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#validate/1"},{"type":"module","title":"Bonfire.Mailer","doc":"Email delivery is a crucial component of many web applications, including your Bonfire instance. It's used for various purposes such as:\n\n- Sending signup confirmation emails\n- Delivering password reset links\n- Notifying users of new messages or activities\n- Sending alerts to administrators or moderators\n\nTo set up email delivery for your Bonfire instance, you'll need to choose an email delivery method and configure it properly. This guide will help you through that process.","ref":"Bonfire.Mailer.html"},{"type":"module","title":"Before You Begin - Bonfire.Mailer","doc":"1. **Choose Email Delivery Method and/or Provider**: You may choose to sign up with one of the email service providers listed in this guide. Each provider has its own pricing, features, and delivery rates.\n\n2. **Domain Configuration**: To ensure reliable email delivery and avoid spam filters, you should configure your [email-related DNS settings](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance's domain name. This typically involves setting up:\n - MX (Mail Exchanger) records\n - SPF (Sender Policy Framework) records\n - DKIM (DomainKeys Identified Mail) records\n - DMARC (Domain-based Message Authentication, Reporting, and Conformance) records\n\nYour chosen email provider should provide instructions on how to set these up for your domain.\n\n3. **Environment Variables**: Bonfire uses environment variables for configuration. You'll need to set these variables in your deployment environment or in a `.env` file if you're running Bonfire locally or using Co-op Cloud.\n\nFor all email delivery methods, you'll need to set the following environment variables:\n\n- `MAIL_BACKEND` environment variable to choose your email delivery method or provider. \n- `MAIL_DOMAIN` or `HOSTNAME`: Your domain name\n- `MAIL_FROM`: The email address from which emails will be sent","ref":"Bonfire.Mailer.html#module-before-you-begin"},{"type":"module","title":"Choosing an Email Delivery Method - Bonfire.Mailer","doc":"","ref":"Bonfire.Mailer.html#module-choosing-an-email-delivery-method"},{"type":"module","title":"1. Default Behaviour: Direct SMTP Delivery - Bonfire.Mailer","doc":"If no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers. Here's what you need to know about this default behaviour:\n\n- **What it means**: Your server will try to connect directly to the recipient's email server (e.g. a provider such as Gmail or an organisation's own mail server) to deliver the email.\n\n- **Pros**: It requires no additional configuration and can work for basic setups.\n\n- **Cons**: This method is often unreliable and prone to several issues:\n 1. **Spam Filters**: Emails sent this way are more likely to be marked as spam or rejected entirely.\n 2. **Deliverability**: Many recipient servers may flat-out reject IP addresses not properly set up for email sending.\n 3. **DNS Configuration**: Without proper DNS records (SPF, DKIM, DMARK, etc.), your emails are more likely to be treated as suspicious.\n 4. **IP Reputation**: If your server's IP address isn't established as a legitimate email sender, deliverability will suffer.\n\n- **Important**: While this default method can work for testing or in very small-scale scenarios, it is strongly recommended to configure a proper email delivery service for any production use of Bonfire. If you want to try this method anyway, make sure to configure [SPF, DKIM, DMARK, etc.](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance domain name and IP address.","ref":"Bonfire.Mailer.html#module-1-default-behaviour-direct-smtp-delivery"},{"type":"module","title":"2. Managed Email Service Providers - Bonfire.Mailer","doc":"These providers offer comprehensive email delivery services, usually featuring analytics, bounce handling, high deliverability rates, etc.\n\n> Note: the information about free tiers and pricing are only meant to serve as a rough indication of the options available and may be outdated or inaccurate (we'd welcome PRs with any updates of course). Please check with each provider's website for more details.\n\n\n#### Brevo (formerly Sendinblue)\n- Website: [brevo.com](https://www.brevo.com/)\n- Free Tier: 300 emails per day, then pay-as-you-go or $15+/month\n```\nMAIL_BACKEND=brevo\nMAIL_KEY=your_brevo_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailjet\n- Website: [mailjet.com](https://www.mailjet.com/)\n- Free Tier: 200 emails per day (up to 6,000 emails per month), then $17+/month\n```\nMAIL_BACKEND=mailjet\nMAIL_KEY=your_mailjet_api_key\nMAIL_PRIVATE_KEY=your_mailjet_secret_key\nMAIL_FROM=your@email.address\n```\n\n#### SMTP2GO\n- Website: [smtp2go.com](https://www.smtp2go.com/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $10+/month\n```\nMAIL_BACKEND=SMTP2GO\nMAIL_KEY=your_smtp2go_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailtrap \n- Website: [mailtrap.io](https://mailtrap.io/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $15+/month\n```\nMAIL_BACKEND=mailtrap\nMAIL_KEY=your_mailtrap_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailgun\n- Website: [www.mailgun.com](https://www.mailgun.com/)\n- Free Tier: 100 emails per day, then $15+/month\n```\nMAIL_BACKEND=mailgun\nMAIL_KEY=your_mailgun_api_key\nMAIL_BASE_URI=https://api.eu.mailgun.net/v3\nMAIL_FROM=your@email.address\n```\nNote: The `MAIL_BASE_URI` depends on your Mailgun registration region. The default is set to EU, adjust if necessary.\n\n#### Postmark\n- Website: [postmarkapp.com](https://postmarkapp.com/)\n- Free Tier: 100 emails per month, then $15+/month\n```\nMAIL_BACKEND=postmark\nMAIL_KEY=your_postmark_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Twilio SendGrid \n- Website: [sendgrid.com](https://sendgrid.com/)\n- Free Tier: 100 emails per day, then $20+/month\n```\nMAIL_BACKEND=sendgrid\nMAIL_KEY=your_sendgrid_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Zoho ZeptoMail\n- Website: [zoho.com](https://www.zoho.com/zeptomail/)\n- First 10,000 emails are free, then €2,50 per 10,000 emails\n```\nMAIL_BACKEND=zepto\nMAIL_KEY=your_zeptomail_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Gmail\n- Website: [gmail.com](https://developers.google.com/gmail/api)\n- Free Tier: 500 emails per day\n```\nMAIL_BACKEND=gmail\nMAIL_KEY=your_gmail_api_key \nMAIL_FROM=your@email.address\n# ^ OAuth2 access token with `gmail.compose` scope\n```\nNote: Using Gmail for sending application email is generally not recommended for production use.\n\n#### Scaleway\n- Website: [scaleway.com](https://www.scaleway.com/en/transactional-email-tem/)\n- No free tier, pay-as-you-go pricing (€0.25/1,000 emails sent)\n```\nMAIL_BACKEND=scaleway\nMAIL_KEY=your_scaleway_api_key\nMAIL_PROJECT_ID=your_scaleway_project_id\nMAIL_PRIVATE_KEY=your_scaleway_secret_key\nMAIL_FROM=your@email.address\n```\n\n#### MailPace\n- Website: [mailpace.com](https://mailpace.com/)\n- No free tier, starts at £2.50 per month for up to 1,000 emails\n```\nMAIL_BACKEND=mailpace\nMAIL_KEY=your_mailpace_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mandrill (Mailchimp Transactional)\n- Website: [mailchimp.com](https://mailchimp.com/features/transactional-email/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=mandrill\nMAIL_KEY=your_mandrill_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Bird / SparkPost\n- Website: [bird.com](https://bird.com/api/email)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=sparkpost\nMAIL_KEY=your_sparkpost_api_key\nMAIL_BASE_URI=https://api.eu.sparkpost.com\nMAIL_FROM=your@email.address\n```\nNote: The `MAIL_BASE_URI` depends on your SparkPost registration region. The default is set to EU, adjust if necessary.\n\n#### Sendcloud (China)\n- Website: [sendcloud.net](https://www.sendcloud.net/)\n- Free Tier: 10 emails per day\n```\nMAIL_BACKEND=sendcloud\nMAIL_KEY=your_sendcloud_api_key\nMAIL_USER=your_sendcloud_api_user\nMAIL_FROM=your@email.address\n```\n\n#### SocketLabs\n- Website: [socketlabs.com](https://www.socketlabs.com/)\n- No free tier\n```\nMAIL_BACKEND=socketlabs\nMAIL_KEY=your_socketlabs_api_key\nMAIL_SERVER=your_socketlabs_server_id\nMAIL_PRIVATE_KEY=your_socketlabs_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Campaign Monitor\n- Website: [campaignmonitor.com](https://www.campaignmonitor.com/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=campaign_monitor\nMAIL_KEY=your_campaign_monitor_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Amazon AWS SES\n- Website: [aws.amazon.com](https://aws.amazon.com/ses/)\n- Free Tier: 3,000 message / month (only for the first 12 months, and extra AWS charges may still apply)\n\nAmazon SES can be configured in two ways:\n\n1. Using existing AWS credentials (if already configured for S3 file storage, you can simplify configuration and use the same AWS credentials for both file storage and email delivery):\n```\nMAIL_BACKEND=aws\nMAIL_FROM=your@email.address\n```\nNote: This method will automatically use the credentials set by `UPLOADS_S3_ACCESS_KEY_ID` and `UPLOADS_S3_SECRET_ACCESS_KEY`. No additional configuration is needed if these are already set up for a Bonfire extension (such as `Bonfire.Files`) which uses S3 file storage.\n\n2. Using dedicated credentials, if you don't use AWS for S3 file storage or you want to use different AWS accounts for file storage and email delivery:\n```\nMAIL_BACKEND=aws\nMAIL_KEY=your_aws_access_key_id\nMAIL_PRIVATE_KEY=your_aws_secret_access_key\nMAIL_REGION=your_aws_region\nMAIL_FROM=your@email.address\n```\n\nNote: \n- If not specified, `MAIL_REGION` defaults to \"eu-west-1\".","ref":"Bonfire.Mailer.html#module-2-managed-email-service-providers"},{"type":"module","title":"3. Direct Email Sending Methods - Bonfire.Mailer","doc":"These methods involve sending emails directly or through your own mail server. They require more setup and maintenance but offer more control.\n\n#### Default: Direct SMTP Delivery\n- When no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers.\n- No additional configuration is needed as this is the default behaviour, but it's not recommended for production use due to deliverability issues ([see above](#module-default-behaviour-direct-smtp-delivery)).\n\n#### SMTP\nSMTP (Simple Mail Transfer Protocol) is the standard method for sending emails across the internet. It's like the postal service for digital messages, ensuring your emails reach their destination regardless of the systems involved. While many opt for using a dedicated email delivery provider (see above), if you already run your own email server or use a provider that's not listed above which provides you with SMTP credentials, you can configure Bonfire to use that:\n\n```\nMAIL_BACKEND=smtp\nMAIL_SERVER=your_smtp_server\nMAIL_PORT=587\nMAIL_USER=your_smtp_username\nMAIL_PASSWORD=your_smtp_password\nMAIL_FROM=your@email.address\n```\n\nNotes: \n- `MAIL_PORT` defaults to 587 if not specified.\n\n#### Sendmail\n- Built into many Unix-like operating systems\n```\nMAIL_BACKEND=sendmail\nMAIL_SERVER=/path/to/sendmail\n# MAIL_ARGS=\nMAIL_QMAIL=true_or_false\nMAIL_FROM=your@email.address\n```\n\nNotes: \n- `MAIL_SERVER` defaults to `/usr/bin/sendmail` if not specified.\n- `MAIL_ARGS` defaults to `-N delay,failure,success` if not specified.\n- While sendmail can send mail directly (similar to the default behaviour), it can be set up to hand off emails to a local or remote SMTP server for delivery.\n- Using sendmail usually provides more control and logging capabilities compared to the default direct SMTP delivery.\n\n#### Postal\n- Self-hosted email delivery platform\n- Website: [postalserver.io](https://docs.postalserver.io)\n```\nMAIL_BACKEND=postal\nMAIL_KEY=your_postal_api_key\nMAIL_BASE_URI=https://your_postal_server_api.uri/\nMAIL_FROM=your@email.address\n```","ref":"Bonfire.Mailer.html#module-3-direct-email-sending-methods"},{"type":"module","title":"Copyright and License - Bonfire.Mailer","doc":"Copyright (c) 2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Mailer.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Mailer.app_name/0","doc":"","ref":"Bonfire.Mailer.html#app_name/0"},{"type":"function","title":"Bonfire.Mailer.deliver_async/1","doc":"","ref":"Bonfire.Mailer.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.from/2","doc":"","ref":"Bonfire.Mailer.html#from/2"},{"type":"function","title":"Bonfire.Mailer.handle_error/2","doc":"","ref":"Bonfire.Mailer.html#handle_error/2"},{"type":"function","title":"Bonfire.Mailer.html_body/2","doc":"","ref":"Bonfire.Mailer.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.new/1","doc":"","ref":"Bonfire.Mailer.html#new/1"},{"type":"function","title":"Bonfire.Mailer.send/4","doc":"","ref":"Bonfire.Mailer.html#send/4"},{"type":"function","title":"Bonfire.Mailer.send_app_feedback/3","doc":"","ref":"Bonfire.Mailer.html#send_app_feedback/3"},{"type":"function","title":"Bonfire.Mailer.send_async/3","doc":"","ref":"Bonfire.Mailer.html#send_async/3"},{"type":"function","title":"Bonfire.Mailer.send_now/3","doc":"","ref":"Bonfire.Mailer.html#send_now/3"},{"type":"function","title":"Bonfire.Mailer.start/2","doc":"","ref":"Bonfire.Mailer.html#start/2"},{"type":"function","title":"Bonfire.Mailer.subject/2","doc":"","ref":"Bonfire.Mailer.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.text_body/2","doc":"","ref":"Bonfire.Mailer.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.to/2","doc":"","ref":"Bonfire.Mailer.html#to/2"},{"type":"module","title":"Bonfire.Mailer.Bamboo","doc":"","ref":"Bonfire.Mailer.Bamboo.html"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_later/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_later/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_later!/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_later!/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_now/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_now/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_now!/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_now!/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.from/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#from/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.html_body/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.new/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#new/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.subject/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.text_body/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.to/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#to/2"},{"type":"behaviour","title":"Bonfire.Mailer.Behaviour","doc":"","ref":"Bonfire.Mailer.Behaviour.html"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:deliver_async/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:deliver_inline/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.from/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:from/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.html_body/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:html_body/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.new/0","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:new/0"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.new/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:new/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.subject/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:subject/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.text_body/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:text_body/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.to/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:to/2"},{"type":"type","title":"Bonfire.Mailer.Behaviour.email/0","doc":"","ref":"Bonfire.Mailer.Behaviour.html#t:email/0"},{"type":"module","title":"Bonfire.Mailer.Checker","doc":"Functions for checking the validity of email addresses and domains","ref":"Bonfire.Mailer.Checker.html"},{"type":"function","title":"Bonfire.Mailer.Checker.validate_domain/1","doc":"Checks whether an email domain name is valid, returns a reason if not.\n\nThis function first checks if the domain matches a valid domain format using a regex.\nIf the format is valid, it then performs the same checks as `validate_email/1` on a test email address.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1"},{"type":"function","title":"Parameters - Bonfire.Mailer.Checker.validate_domain/1","doc":"- domain: The domain to validate as a binary string.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-parameters"},{"type":"function","title":"Returns - Bonfire.Mailer.Checker.validate_domain/1","doc":"- `:ok` if the domain is valid.\n - `{:error, :format}` if the domain format is invalid.\n - `{:error, :mx}` if the domain has no valid MX records.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-returns"},{"type":"function","title":"Examples - Bonfire.Mailer.Checker.validate_domain/1","doc":"iex> Bonfire.Mailer.Checker.validate_domain(\"example.com\")\n :ok\n\n iex> Bonfire.Mailer.Checker.validate_domain(\"invalid-domain\")\n {:error, :format}\n\n iex> Bonfire.Mailer.Checker.validate_domain(\"nonexistent-domain.com\")\n {:error, :mx}","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-examples"},{"type":"function","title":"Bonfire.Mailer.Checker.validate_email/1","doc":"Checks whether an email address is valid, returns a reason if not.\n\nThis function can perform two types of checks:\n1. Format check: Ensures the email address has a valid format.\n2. MX record check: Verifies the existence of MX records for the email domain.\n\nThe checks are enabled by default but can be disabled with `check_format: false` and `check_mx: false` on the `:bonfire_mailer` configuration.","ref":"Bonfire.Mailer.Checker.html#validate_email/1"},{"type":"function","title":"Parameters - Bonfire.Mailer.Checker.validate_email/1","doc":"- email: The email address to validate as a binary string.","ref":"Bonfire.Mailer.Checker.html#validate_email/1-parameters"},{"type":"function","title":"Returns - Bonfire.Mailer.Checker.validate_email/1","doc":"- `:ok` if the email is valid.\n - `{:error, :format}` if the email format is invalid.\n - `{:error, :mx}` if the email domain has no valid MX records.","ref":"Bonfire.Mailer.Checker.html#validate_email/1-returns"},{"type":"function","title":"Examples - Bonfire.Mailer.Checker.validate_email/1","doc":"iex> Bonfire.Mailer.Checker.validate_email(\"user@example.com\")\n :ok\n\n iex> Bonfire.Mailer.Checker.validate_email(\"invalid-email\")\n {:error, :format}\n\n iex> Bonfire.Mailer.Checker.validate_email(\"user@nonexistent-domain.com\")\n {:error, :mx}","ref":"Bonfire.Mailer.Checker.html#validate_email/1-examples"},{"type":"type","title":"Bonfire.Mailer.Checker.error_reason/0","doc":"","ref":"Bonfire.Mailer.Checker.html#t:error_reason/0"},{"type":"module","title":"Bonfire.Mailer.Render","doc":"","ref":"Bonfire.Mailer.Render.html"},{"type":"function","title":"Bonfire.Mailer.Render.default_layout/0","doc":"","ref":"Bonfire.Mailer.Render.html#default_layout/0"},{"type":"function","title":"Bonfire.Mailer.Render.maybe_with_layout/4","doc":"","ref":"Bonfire.Mailer.Render.html#maybe_with_layout/4"},{"type":"function","title":"Bonfire.Mailer.Render.new_templated/3","doc":"","ref":"Bonfire.Mailer.Render.html#new_templated/3"},{"type":"function","title":"Bonfire.Mailer.Render.render_templated/6","doc":"","ref":"Bonfire.Mailer.Render.html#render_templated/6"},{"type":"function","title":"Bonfire.Mailer.Render.render_to_string/3","doc":"","ref":"Bonfire.Mailer.Render.html#render_to_string/3"},{"type":"function","title":"Bonfire.Mailer.Render.render_to_string/4","doc":"","ref":"Bonfire.Mailer.Render.html#render_to_string/4"},{"type":"function","title":"Bonfire.Mailer.Render.templated/4","doc":"","ref":"Bonfire.Mailer.Render.html#templated/4"},{"type":"module","title":"Bonfire.Mailer.RuntimeConfig","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.bamboo_service/2","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#bamboo_service/2"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.mail_blackhole/1","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#mail_blackhole/1"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.mailer/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#mailer/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.swoosh_service/2","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#swoosh_service/2"},{"type":"module","title":"Bonfire.Mailer.Swoosh","doc":"","ref":"Bonfire.Mailer.Swoosh.html"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver/2","doc":"Delivers an email.\n\nIf the email is delivered it returns an `{:ok, result}` tuple. If it fails,\nreturns an `{:error, error}` tuple.","ref":"Bonfire.Mailer.Swoosh.html#deliver/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver!/2","doc":"Delivers an email, raises on error.\n\nIf the email is delivered, it returns the result. If it fails, it raises\na `DeliveryError`.","ref":"Bonfire.Mailer.Swoosh.html#deliver!/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_many/2","doc":"Delivers a list of emails.\n\nIt accepts a list of `%Swoosh.Email{}` as its first parameter.","ref":"Bonfire.Mailer.Swoosh.html#deliver_many/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.from/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#from/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.html_body/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.new/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#new/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.subject/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.text_body/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.to/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#to/2"},{"type":"module","title":"Bonfire.Web.Endpoint","doc":"","ref":"Bonfire.Web.Endpoint.html"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast/3","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast/3"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast!/3","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast!/3"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast_from/4","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast_from/4"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast_from!/4","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"Bonfire.Web.Endpoint.call/2","doc":"","ref":"Bonfire.Web.Endpoint.html#call/2"},{"type":"function","title":"Bonfire.Web.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"Bonfire.Web.Endpoint.html#child_spec/1"},{"type":"function","title":"Bonfire.Web.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"Bonfire.Web.Endpoint.html#config/2"},{"type":"function","title":"Bonfire.Web.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"Bonfire.Web.Endpoint.html#config_change/2"},{"type":"function","title":"Bonfire.Web.Endpoint.generate_reverse_router!/1","doc":"(re)generates the reverse router (useful so it can be re-generated when extensions are enabled/disabled)","ref":"Bonfire.Web.Endpoint.html#generate_reverse_router!/1"},{"type":"function","title":"Bonfire.Web.Endpoint.halt_live_reload/2","doc":"","ref":"Bonfire.Web.Endpoint.html#halt_live_reload/2"},{"type":"function","title":"Bonfire.Web.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"Bonfire.Web.Endpoint.html#host/0"},{"type":"function","title":"Bonfire.Web.Endpoint.include_assets/1","doc":"","ref":"Bonfire.Web.Endpoint.html#include_assets/1"},{"type":"function","title":"Bonfire.Web.Endpoint.include_assets/2","doc":"","ref":"Bonfire.Web.Endpoint.html#include_assets/2"},{"type":"function","title":"Bonfire.Web.Endpoint.init/1","doc":"","ref":"Bonfire.Web.Endpoint.html#init/1"},{"type":"function","title":"Bonfire.Web.Endpoint.local_broadcast/3","doc":"","ref":"Bonfire.Web.Endpoint.html#local_broadcast/3"},{"type":"function","title":"Bonfire.Web.Endpoint.local_broadcast_from/4","doc":"","ref":"Bonfire.Web.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"Bonfire.Web.Endpoint.log_ip/2","doc":"","ref":"Bonfire.Web.Endpoint.html#log_ip/2"},{"type":"function","title":"Bonfire.Web.Endpoint.node_name/0","doc":"","ref":"Bonfire.Web.Endpoint.html#node_name/0"},{"type":"function","title":"Bonfire.Web.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"Bonfire.Web.Endpoint.html#path/1"},{"type":"function","title":"Bonfire.Web.Endpoint.publish_mutation/3","doc":"","ref":"Bonfire.Web.Endpoint.html#publish_mutation/3"},{"type":"function","title":"Bonfire.Web.Endpoint.publish_subscription/2","doc":"","ref":"Bonfire.Web.Endpoint.html#publish_subscription/2"},{"type":"function","title":"Bonfire.Web.Endpoint.reload!/1","doc":"","ref":"Bonfire.Web.Endpoint.html#reload!/1"},{"type":"function","title":"Bonfire.Web.Endpoint.script_name/0","doc":"Generates the script name.","ref":"Bonfire.Web.Endpoint.html#script_name/0"},{"type":"function","title":"Bonfire.Web.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"Bonfire.Web.Endpoint.html#server_info/1"},{"type":"function","title":"Bonfire.Web.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"Bonfire.Web.Endpoint.html#start_link/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_integrity/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_lookup/1"},{"type":"function","title":"Bonfire.Web.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"Bonfire.Web.Endpoint.html#static_path/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_url/0"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#struct_url/0"},{"type":"function","title":"Bonfire.Web.Endpoint.subscribe/2","doc":"","ref":"Bonfire.Web.Endpoint.html#subscribe/2"},{"type":"function","title":"Bonfire.Web.Endpoint.unsubscribe/1","doc":"","ref":"Bonfire.Web.Endpoint.html#unsubscribe/1"},{"type":"function","title":"Bonfire.Web.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"Bonfire.Web.Endpoint.html#url/0"},{"type":"module","title":"Bonfire.Web.FakeRemoteEndpoint","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast!/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast!/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast_from/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast_from/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast_from!/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast_from!/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.call/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#call/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#child_spec/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#config/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#config_change/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#host/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.init/1","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#init/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.local_broadcast/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#local_broadcast/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.local_broadcast_from/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#local_broadcast_from/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.log_ip/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#log_ip/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.node_name/0","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#node_name/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#path/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.publish_mutation/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#publish_mutation/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.publish_subscription/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#publish_subscription/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.script_name/0","doc":"Generates the script name.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#script_name/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"Bonfire.Web.FakeRemoteEndpoint.html#server_info/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#start_link/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_integrity/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_lookup/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#static_path/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_url/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#struct_url/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.subscribe/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#subscribe/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.unsubscribe/1","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#unsubscribe/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#url/0"},{"type":"module","title":"Bonfire.Web.Router","doc":"","ref":"Bonfire.Web.Router.html"},{"type":"function","title":"Bonfire.Web.Router.account_required/2","doc":"","ref":"Bonfire.Web.Router.html#account_required/2"},{"type":"function","title":"Bonfire.Web.Router.activity_json/2","doc":"","ref":"Bonfire.Web.Router.html#activity_json/2"},{"type":"function","title":"Bonfire.Web.Router.activity_json_or_html/2","doc":"","ref":"Bonfire.Web.Router.html#activity_json_or_html/2"},{"type":"function","title":"Bonfire.Web.Router.admin_required/2","doc":"","ref":"Bonfire.Web.Router.html#admin_required/2"},{"type":"function","title":"Bonfire.Web.Router.basic/2","doc":"","ref":"Bonfire.Web.Router.html#basic/2"},{"type":"function","title":"Bonfire.Web.Router.basic_html/2","doc":"","ref":"Bonfire.Web.Router.html#basic_html/2"},{"type":"function","title":"Bonfire.Web.Router.basic_json/2","doc":"","ref":"Bonfire.Web.Router.html#basic_json/2"},{"type":"function","title":"Bonfire.Web.Router.browser/2","doc":"","ref":"Bonfire.Web.Router.html#browser/2"},{"type":"function","title":"Bonfire.Web.Router.browser_unsafe/2","doc":"","ref":"Bonfire.Web.Router.html#browser_unsafe/2"},{"type":"function","title":"Bonfire.Web.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"Bonfire.Web.Router.html#call/2"},{"type":"function","title":"Bonfire.Web.Router.early_hints_authed/2","doc":"","ref":"Bonfire.Web.Router.html#early_hints_authed/2"},{"type":"function","title":"Bonfire.Web.Router.guest_only/2","doc":"","ref":"Bonfire.Web.Router.html#guest_only/2"},{"type":"function","title":"Bonfire.Web.Router.html_only/2","doc":"","ref":"Bonfire.Web.Router.html#html_only/2"},{"type":"function","title":"Bonfire.Web.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"Bonfire.Web.Router.html#init/1"},{"type":"function","title":"Bonfire.Web.Router.load_current_auth/2","doc":"","ref":"Bonfire.Web.Router.html#load_current_auth/2"},{"type":"function","title":"Bonfire.Web.Router.require_authenticated_user/2","doc":"","ref":"Bonfire.Web.Router.html#require_authenticated_user/2"},{"type":"function","title":"Bonfire.Web.Router.signed_activity_pub_fetch/2","doc":"","ref":"Bonfire.Web.Router.html#signed_activity_pub_fetch/2"},{"type":"function","title":"Bonfire.Web.Router.signed_activity_pub_incoming/2","doc":"","ref":"Bonfire.Web.Router.html#signed_activity_pub_incoming/2"},{"type":"function","title":"Bonfire.Web.Router.static_generator/2","doc":"","ref":"Bonfire.Web.Router.html#static_generator/2"},{"type":"function","title":"Bonfire.Web.Router.throttle_plug_attacks/2","doc":"","ref":"Bonfire.Web.Router.html#throttle_plug_attacks/2"},{"type":"function","title":"Bonfire.Web.Router.user_required/2","doc":"","ref":"Bonfire.Web.Router.html#user_required/2"},{"type":"function","title":"Bonfire.Web.Router.webfinger/2","doc":"","ref":"Bonfire.Web.Router.html#webfinger/2"},{"type":"function","title":"Bonfire.Web.Router.well_known_nodeinfo/2","doc":"","ref":"Bonfire.Web.Router.html#well_known_nodeinfo/2"},{"type":"module","title":"Bonfire.Web.Router.CORS","doc":"","ref":"Bonfire.Web.Router.CORS.html"},{"type":"function","title":"Bonfire.Web.Router.CORS.call/2","doc":"","ref":"Bonfire.Web.Router.CORS.html#call/2"},{"type":"function","title":"Bonfire.Web.Router.CORS.init/1","doc":"","ref":"Bonfire.Web.Router.CORS.html#init/1"},{"type":"function","title":"Bonfire.Web.Router.CORS.local_origin?/3","doc":"","ref":"Bonfire.Web.Router.CORS.html#local_origin?/3"},{"type":"module","title":"Bonfire.Web.Router.Reverse","doc":"","ref":"Bonfire.Web.Router.Reverse.html"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/2","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/2"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/3","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/3"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/4","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/4"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/5","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/5"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/6","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/6"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/7","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/7"},{"type":"module","title":"Bonfire.Web.Router.Routes","doc":"","ref":"Bonfire.Web.Router.Routes.html"},{"type":"module","title":"Bonfire.Web.ViewInventoryLive.GraphQL","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#process/2"},{"type":"module","title":"ValueFlows","doc":"`ValueFlows` is a [Bonfire](https://bonfire.cafe/) extension that implements [ValueFlows](https://valueflo.ws/) for federated networks to conduct economic activities.\n\nImplemented so far:\n\n- Intent\n- Proposal\n- Economic Event\n- Types of Action\n- Resource Specification\n- Economic Resource\n- Process Specification\n- Process\n- Claim (WIP)\n- Value Calculations (WIP)\n\nAs well as an optional GraphQL API for all of the above...","ref":"ValueFlows.html"},{"type":"module","title":"Handy commands - ValueFlows","doc":"","ref":"ValueFlows.html#module-handy-commands"},{"type":"module","title":"Copyright and License - ValueFlows","doc":"Copyright (c) 2021 ValueFlows, CommonsPub, Reflow & Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"ValueFlows.html#module-copyright-and-license"},{"type":"module","title":"ValueFlows.Agent.Agents","doc":"","ref":"ValueFlows.Agent.Agents.html"},{"type":"function","title":"ValueFlows.Agent.Agents.add_type/1","doc":"","ref":"ValueFlows.Agent.Agents.html#add_type/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agent/2","doc":"","ref":"ValueFlows.Agent.Agents.html#agent/2"},{"type":"function","title":"ValueFlows.Agent.Agents.agent_location/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agent_location/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agent_to_character/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agent_to_character/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agents/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agents/1"},{"type":"function","title":"ValueFlows.Agent.Agents.character_to_agent/1","doc":"","ref":"ValueFlows.Agent.Agents.html#character_to_agent/1"},{"type":"module","title":"ValueFlows.Agent.Organizations","doc":"","ref":"ValueFlows.Agent.Organizations.html"},{"type":"function","title":"ValueFlows.Agent.Organizations.organization/2","doc":"","ref":"ValueFlows.Agent.Organizations.html#organization/2"},{"type":"function","title":"ValueFlows.Agent.Organizations.organizations/1","doc":"","ref":"ValueFlows.Agent.Organizations.html#organizations/1"},{"type":"module","title":"ValueFlows.Agent.People","doc":"","ref":"ValueFlows.Agent.People.html"},{"type":"function","title":"ValueFlows.Agent.People.people/1","doc":"","ref":"ValueFlows.Agent.People.html#people/1"},{"type":"function","title":"ValueFlows.Agent.People.person/2","doc":"","ref":"ValueFlows.Agent.People.html#person/2"},{"type":"module","title":"ValueFlows.Agreement","doc":"","ref":"ValueFlows.Agreement.html"},{"type":"module","title":"ValueFlows.AllMigrations","doc":"Catch-all migrations intended to be used to initialise new Bonfire apps.\nAdd any new up/down ecto migrations in VF modules to the bottom of these two functions.","ref":"ValueFlows.AllMigrations.html"},{"type":"function","title":"ValueFlows.AllMigrations.down/0","doc":"","ref":"ValueFlows.AllMigrations.html#down/0"},{"type":"function","title":"ValueFlows.AllMigrations.up/0","doc":"","ref":"ValueFlows.AllMigrations.html#up/0"},{"type":"module","title":"ValueFlows.Claim","doc":"","ref":"ValueFlows.Claim.html"},{"type":"function","title":"ValueFlows.Claim.create_changeset/2","doc":"","ref":"ValueFlows.Claim.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Claim.create_changeset/4","doc":"","ref":"ValueFlows.Claim.html#create_changeset/4"},{"type":"function","title":"ValueFlows.Claim.delete/2","doc":"","ref":"ValueFlows.Claim.html#delete/2"},{"type":"function","title":"ValueFlows.Claim.get/3","doc":"","ref":"ValueFlows.Claim.html#get/3"},{"type":"function","title":"ValueFlows.Claim.measure_fields/0","doc":"","ref":"ValueFlows.Claim.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Claim.put/3","doc":"","ref":"ValueFlows.Claim.html#put/3"},{"type":"function","title":"ValueFlows.Claim.update_changeset/2","doc":"","ref":"ValueFlows.Claim.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Claim.validate_required/1","doc":"","ref":"ValueFlows.Claim.html#validate_required/1"},{"type":"type","title":"ValueFlows.Claim.t/0","doc":"","ref":"ValueFlows.Claim.html#t:t/0"},{"type":"module","title":"ValueFlows.Claim.Claims","doc":"","ref":"ValueFlows.Claim.Claims.html"},{"type":"function","title":"ValueFlows.Claim.Claims.ap_publish_activity/3","doc":"","ref":"ValueFlows.Claim.Claims.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Claim.Claims.ap_receive_activity/3","doc":"","ref":"ValueFlows.Claim.Claims.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Claim.Claims.create/2","doc":"","ref":"ValueFlows.Claim.Claims.html#create/2"},{"type":"function","title":"ValueFlows.Claim.Claims.create/4","doc":"","ref":"ValueFlows.Claim.Claims.html#create/4"},{"type":"function","title":"ValueFlows.Claim.Claims.federation_module/0","doc":"","ref":"ValueFlows.Claim.Claims.html#federation_module/0"},{"type":"function","title":"ValueFlows.Claim.Claims.many/1","doc":"","ref":"ValueFlows.Claim.Claims.html#many/1"},{"type":"function","title":"ValueFlows.Claim.Claims.one/1","doc":"","ref":"ValueFlows.Claim.Claims.html#one/1"},{"type":"function","title":"ValueFlows.Claim.Claims.preload_all/1","doc":"","ref":"ValueFlows.Claim.Claims.html#preload_all/1"},{"type":"function","title":"ValueFlows.Claim.Claims.soft_delete/1","doc":"","ref":"ValueFlows.Claim.Claims.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Claim.Claims.update/2","doc":"","ref":"ValueFlows.Claim.Claims.html#update/2"},{"type":"module","title":"ValueFlows.Claim.GraphQL","doc":"","ref":"ValueFlows.Claim.GraphQL.html"},{"type":"function","title":"ValueFlows.Claim.GraphQL.claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.claims/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#claims/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.create_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#create_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.delete_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#delete_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_events/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_events/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_triggered_by_edge/3","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_triggered_by_edge/3"},{"type":"function","title":"ValueFlows.Claim.GraphQL.update_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#update_claim/2"},{"type":"module","title":"ValueFlows.Claim.Queries","doc":"","ref":"ValueFlows.Claim.Queries.html"},{"type":"function","title":"ValueFlows.Claim.Queries.filter/2","doc":"","ref":"ValueFlows.Claim.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Claim.Queries.join_to/3","doc":"","ref":"ValueFlows.Claim.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Claim.Queries.queries/5","doc":"","ref":"ValueFlows.Claim.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Claim.Queries.query/1","doc":"","ref":"ValueFlows.Claim.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Claim.Queries.query/2","doc":"","ref":"ValueFlows.Claim.Queries.html#query/2"},{"type":"module","title":"ValueFlows.EconomicEvent","doc":"","ref":"ValueFlows.EconomicEvent.html"},{"type":"function","title":"ValueFlows.EconomicEvent.context_module/0","doc":"","ref":"ValueFlows.EconomicEvent.html#context_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.create_changeset/2","doc":"","ref":"ValueFlows.EconomicEvent.html#create_changeset/2"},{"type":"function","title":"ValueFlows.EconomicEvent.delete/2","doc":"","ref":"ValueFlows.EconomicEvent.html#delete/2"},{"type":"function","title":"ValueFlows.EconomicEvent.follow_filters/0","doc":"","ref":"ValueFlows.EconomicEvent.html#follow_filters/0"},{"type":"function","title":"ValueFlows.EconomicEvent.get/3","doc":"","ref":"ValueFlows.EconomicEvent.html#get/3"},{"type":"function","title":"ValueFlows.EconomicEvent.measure_fields/0","doc":"","ref":"ValueFlows.EconomicEvent.html#measure_fields/0"},{"type":"function","title":"ValueFlows.EconomicEvent.put/3","doc":"","ref":"ValueFlows.EconomicEvent.html#put/3"},{"type":"function","title":"ValueFlows.EconomicEvent.query_module/0","doc":"","ref":"ValueFlows.EconomicEvent.html#query_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.update_changeset/2","doc":"","ref":"ValueFlows.EconomicEvent.html#update_changeset/2"},{"type":"function","title":"ValueFlows.EconomicEvent.validate_changeset/1","doc":"","ref":"ValueFlows.EconomicEvent.html#validate_changeset/1"},{"type":"function","title":"ValueFlows.EconomicEvent.validate_create_changeset/1","doc":"","ref":"ValueFlows.EconomicEvent.html#validate_create_changeset/1"},{"type":"type","title":"ValueFlows.EconomicEvent.t/0","doc":"","ref":"ValueFlows.EconomicEvent.html#t:t/0"},{"type":"module","title":"ValueFlows.EconomicEvent.EconomicEvents","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.ap_publish_activity/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.ap_receive_activity/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.create/3","doc":"Create an event, and possibly linked resources","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#create/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.cursor/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#cursor/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.federation_module/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#federation_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.fields/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#fields/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.indexing_object_format/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.inputs_of/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#inputs_of/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#many/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#one/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.outputs_of/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#outputs_of/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.page/5","doc":"Retrieves an Page of events according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#page/5"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.pages/6","doc":"Retrieves an Pages of events according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#pages/6"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.preload_action/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#preload_action/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.preload_all/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#preload_all/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.prepare_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#prepare_attrs/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.prepare_create_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#prepare_create_attrs/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.soft_delete/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#soft_delete/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.test_cursor/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#test_cursor/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.track/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#track/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.update/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#update/3"},{"type":"module","title":"ValueFlows.EconomicEvent.EventSideEffects","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.event_side_effects/1","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#event_side_effects/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.measurement_effect/3","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#measurement_effect/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.quantity_effect/4","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#quantity_effect/4"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.return_updated_event/2","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#return_updated_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.return_updated_event/3","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#return_updated_event/3"},{"type":"module","title":"ValueFlows.EconomicEvent.GraphQL","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.agent_events/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#agent_events/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.agent_events_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#agent_events_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.all_events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#all_events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.create_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#create_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.delete_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#delete_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.events_filtered/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#events_filtered/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_agent_events_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_agent_events_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_to_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_to_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_trace/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_trace/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_track/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_track/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_triggered_by_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_triggered_by_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.list_events/4","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#list_events/4"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.simulate/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.track/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#track/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.update_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#update_event/2"},{"type":"module","title":"ValueFlows.EconomicEvent.LiveHandler","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html"},{"type":"function","title":"ValueFlows.EconomicEvent.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#handle_event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.LiveHandler.prepare_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#prepare_attrs/2"},{"type":"macro","title":"ValueFlows.EconomicEvent.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#sigil_p/2"},{"type":"module","title":"ValueFlows.EconomicEvent.Queries","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.filter/2","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.join_to/3","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.queries/5","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.query/1","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#query/1"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.query/2","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#query/2"},{"type":"module","title":"ValueFlows.EconomicEvent.Trace","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.event/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.process/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#process/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.resource/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#resource/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#trace/3"},{"type":"module","title":"ValueFlows.EconomicEvent.Track","doc":"","ref":"ValueFlows.EconomicEvent.Track.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.event/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.process/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#process/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.resource/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#resource/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.track/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#track/3"},{"type":"module","title":"ValueFlows.EconomicResource","doc":"","ref":"ValueFlows.EconomicResource.html"},{"type":"function","title":"ValueFlows.EconomicResource.context_module/0","doc":"","ref":"ValueFlows.EconomicResource.html#context_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.create_changeset/2","doc":"","ref":"ValueFlows.EconomicResource.html#create_changeset/2"},{"type":"function","title":"ValueFlows.EconomicResource.delete/2","doc":"","ref":"ValueFlows.EconomicResource.html#delete/2"},{"type":"function","title":"ValueFlows.EconomicResource.follow_filters/0","doc":"","ref":"ValueFlows.EconomicResource.html#follow_filters/0"},{"type":"function","title":"ValueFlows.EconomicResource.get/3","doc":"","ref":"ValueFlows.EconomicResource.html#get/3"},{"type":"function","title":"ValueFlows.EconomicResource.measure_fields/0","doc":"","ref":"ValueFlows.EconomicResource.html#measure_fields/0"},{"type":"function","title":"ValueFlows.EconomicResource.put/3","doc":"","ref":"ValueFlows.EconomicResource.html#put/3"},{"type":"function","title":"ValueFlows.EconomicResource.query_module/0","doc":"","ref":"ValueFlows.EconomicResource.html#query_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.update_changeset/2","doc":"","ref":"ValueFlows.EconomicResource.html#update_changeset/2"},{"type":"type","title":"ValueFlows.EconomicResource.t/0","doc":"","ref":"ValueFlows.EconomicResource.html#t:t/0"},{"type":"module","title":"ValueFlows.EconomicResource.EconomicResources","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.ap_publish_activity/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.ap_receive_activity/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.create/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#create/2"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.cursor/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#cursor/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.federation_module/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#federation_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.fields/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#fields/2"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.indexing_object_format/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.inputs_of/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#inputs_of/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicResource.EconomicResources.html#many/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.many!/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#many!/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicResource.EconomicResources.html#one/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.outputs_of/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#outputs_of/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.page/5","doc":"Retrieves an Page of resources according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.EconomicResource.EconomicResources.html#page/5"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.pages/6","doc":"Retrieves an Pages of resources according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.EconomicResource.EconomicResources.html#pages/6"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.preload_all/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#preload_all/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.preload_state/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#preload_state/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.search/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#search/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.soft_delete/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#soft_delete/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.test_cursor/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#test_cursor/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.trace/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.track/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#track/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.update/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#update/2"},{"type":"module","title":"ValueFlows.EconomicResource.LiveHandler","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html"},{"type":"function","title":"ValueFlows.EconomicResource.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.EconomicResource.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.EconomicResource.LiveHandler.to_tuple/1","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#to_tuple/1"},{"type":"module","title":"ValueFlows.EconomicResource.Queries","doc":"","ref":"ValueFlows.EconomicResource.Queries.html"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.filter/2","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.join_to/3","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.queries/5","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.query/1","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#query/1"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.query/2","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.Action","doc":"","ref":"ValueFlows.Knowledge.Action.html"},{"type":"type","title":"ValueFlows.Knowledge.Action.t/0","doc":"","ref":"ValueFlows.Knowledge.Action.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.Action.Actions","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.action/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#action/1"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.action!/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#action!/1"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.actions_list/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#actions_list/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.actions_map/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#actions_map/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.default_actions/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#default_actions/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.id/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#id/1"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.context_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#context_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.create_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.delete/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#delete/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.follow_filters/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.get/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#get/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.put/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#put/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.query_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#query_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.update_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Knowledge.ProcessSpecification.t/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.all_process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#all_process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.create_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#create_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.creator_process_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#creator_process_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.delete_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#delete_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_creator_process_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_creator_process_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.list_process_specs/4","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#list_process_specs/4"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_specs_filtered/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_specs_filtered/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.simulate/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.update_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#update_process_spec/2"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.ap_publish_activity/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.ap_receive_activity/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.create/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#create/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.cursor/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.federation_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#federation_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.fields/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#fields/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.indexing_object_format/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#many/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#one/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.page/5","doc":"Retrieves an Page of process_specs according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#page/5"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.pages/6","doc":"Retrieves an Pages of process_specs according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#pages/6"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.soft_delete/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.test_cursor/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.update/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#update/2"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.Queries","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.filter/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.join_to/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.queries/5","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.query/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.query/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.context_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#context_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.create_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.create_changeset/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#create_changeset/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.delete/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#delete/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.follow_filters/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.get/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#get/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.put/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#put/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.query_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#query_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.update_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.update_changeset/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#update_changeset/3"},{"type":"type","title":"ValueFlows.Knowledge.ResourceSpecification.t/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.all_resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#all_resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.create_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#create_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.creator_resource_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#creator_resource_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.delete_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#delete_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_conforming_resources_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_conforming_resources_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_creator_resource_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_creator_resource_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_default_unit_of_effort_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_default_unit_of_effort_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fields/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fields/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.list_resource_specs/4","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#list_resource_specs/4"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.page/5","doc":"Retrieves an Page of resource_specs according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#page/5"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.pages/6","doc":"Retrieves an Pages of resource_specs according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#pages/6"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.simulate/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.update_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#update_resource_spec/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.changeset/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#changeset/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.create_in_autocomplete/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#create_in_autocomplete/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.to_tuple/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#to_tuple/1"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.Queries","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.filter/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.join_to/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.queries/5","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.query/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.query/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.ap_publish_activity/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.ap_receive_activity/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.create/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#create/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.cursor/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.federation_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#federation_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.indexing_object_format/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#many/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.many!/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#many!/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.maybe_get/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#maybe_get/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#one/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.prepare_attrs/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#prepare_attrs/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.search/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#search/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.soft_delete/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.test_cursor/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.update/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#update/2"},{"type":"module","title":"ValueFlows.Observe.Classifications","doc":"","ref":"ValueFlows.Observe.Classifications.html"},{"type":"function","title":"ValueFlows.Observe.Classifications.create/4","doc":"","ref":"ValueFlows.Observe.Classifications.html#create/4"},{"type":"function","title":"ValueFlows.Observe.Classifications.flatten/1","doc":"","ref":"ValueFlows.Observe.Classifications.html#flatten/1"},{"type":"function","title":"ValueFlows.Observe.Classifications.from_classification/1","doc":"","ref":"ValueFlows.Observe.Classifications.html#from_classification/1"},{"type":"function","title":"ValueFlows.Observe.Classifications.one/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#one/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.preload/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#preload/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.to_classification/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#to_classification/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.to_ecto_struct/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#to_ecto_struct/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.update/4","doc":"","ref":"ValueFlows.Observe.Classifications.html#update/4"},{"type":"module","title":"ValueFlows.Observe.Hydration","doc":"","ref":"ValueFlows.Observe.Hydration.html"},{"type":"function","title":"ValueFlows.Observe.Hydration.hydrate/0","doc":"","ref":"ValueFlows.Observe.Hydration.html#hydrate/0"},{"type":"module","title":"ValueFlows.Observe.Integration","doc":"","ref":"ValueFlows.Observe.Integration.html"},{"type":"module","title":"ValueFlows.Observe.ObservablePhenomenons","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.create/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#create/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.facet/0","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#facet/0"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.one/1","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#one/1"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.update/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#update/3"},{"type":"module","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.choice_of_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#choice_of_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.create_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#create_observable_phenomenon/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.delete_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#delete_observable_phenomenon/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.formula_quantifier_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#formula_quantifier_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.get/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#get/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.observable_phenomenons/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#observable_phenomenons/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.update_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#update_observable_phenomenon/2"},{"type":"module","title":"ValueFlows.Observe.ObservableProperties","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.create/2","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#create/2"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.facet/0","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#facet/0"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.id/0","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#id/0"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.one/1","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#one/1"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.update/3","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#update/3"},{"type":"module","title":"ValueFlows.Observe.ObservablePropertiesGraphQL","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.create_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#create_observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.delete_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#delete_observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.observable_properties/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#observable_properties/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.phenomenons_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#phenomenons_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.update_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#update_observable_property/2"},{"type":"module","title":"ValueFlows.Observe.Observation","doc":"","ref":"ValueFlows.Observe.Observation.html"},{"type":"function","title":"ValueFlows.Observe.Observation.context_module/0","doc":"","ref":"ValueFlows.Observe.Observation.html#context_module/0"},{"type":"function","title":"ValueFlows.Observe.Observation.create_changeset/2","doc":"","ref":"ValueFlows.Observe.Observation.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Observe.Observation.create_changeset_validate/1","doc":"","ref":"ValueFlows.Observe.Observation.html#create_changeset_validate/1"},{"type":"function","title":"ValueFlows.Observe.Observation.delete/2","doc":"","ref":"ValueFlows.Observe.Observation.html#delete/2"},{"type":"function","title":"ValueFlows.Observe.Observation.follow_filters/0","doc":"","ref":"ValueFlows.Observe.Observation.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Observe.Observation.get/3","doc":"","ref":"ValueFlows.Observe.Observation.html#get/3"},{"type":"function","title":"ValueFlows.Observe.Observation.put/3","doc":"","ref":"ValueFlows.Observe.Observation.html#put/3"},{"type":"function","title":"ValueFlows.Observe.Observation.query_module/0","doc":"","ref":"ValueFlows.Observe.Observation.html#query_module/0"},{"type":"function","title":"ValueFlows.Observe.Observation.update_changeset/2","doc":"","ref":"ValueFlows.Observe.Observation.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Observe.Observation.t/0","doc":"","ref":"ValueFlows.Observe.Observation.html#t:t/0"},{"type":"module","title":"ValueFlows.Observe.Observation.Queries","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.filter/2","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.join_to/3","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.queries/5","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.query/1","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.query/2","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Observe.Observations","doc":"","ref":"ValueFlows.Observe.Observations.html"},{"type":"function","title":"ValueFlows.Observe.Observations.create/2","doc":"Create an observation","ref":"ValueFlows.Observe.Observations.html#create/2"},{"type":"function","title":"ValueFlows.Observe.Observations.create/3","doc":"","ref":"ValueFlows.Observe.Observations.html#create/3"},{"type":"function","title":"ValueFlows.Observe.Observations.cursor/0","doc":"","ref":"ValueFlows.Observe.Observations.html#cursor/0"},{"type":"function","title":"ValueFlows.Observe.Observations.fields/2","doc":"","ref":"ValueFlows.Observe.Observations.html#fields/2"},{"type":"function","title":"ValueFlows.Observe.Observations.indexing_object_format/1","doc":"","ref":"ValueFlows.Observe.Observations.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Observe.Observations.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Observe.Observations.html#many/1"},{"type":"function","title":"ValueFlows.Observe.Observations.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Observe.Observations.html#one/1"},{"type":"function","title":"ValueFlows.Observe.Observations.page/5","doc":"Retrieves an Page of observations according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Observe.Observations.html#page/5"},{"type":"function","title":"ValueFlows.Observe.Observations.pages/6","doc":"Retrieves an Pages of observations according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Observe.Observations.html#pages/6"},{"type":"function","title":"ValueFlows.Observe.Observations.preload_all/1","doc":"","ref":"ValueFlows.Observe.Observations.html#preload_all/1"},{"type":"function","title":"ValueFlows.Observe.Observations.soft_delete/1","doc":"","ref":"ValueFlows.Observe.Observations.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Observe.Observations.test_cursor/0","doc":"","ref":"ValueFlows.Observe.Observations.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Observe.Observations.update/3","doc":"","ref":"ValueFlows.Observe.Observations.html#update/3"},{"type":"module","title":"ValueFlows.Observe.Observations.ObservationsResolvers","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.all_observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#all_observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.create_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#create_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.delete_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#delete_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.fetch_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#fetch_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.fetch_observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#fetch_observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.has_feature_of_interest/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#has_feature_of_interest/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.has_result_edge/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#has_result_edge/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.list_observations/4","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#list_observations/4"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.made_by_edge/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#made_by_edge/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.name_as_label/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#name_as_label/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observable_object_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observable_object_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observable_result_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observable_result_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observer_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observer_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.update_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#update_observation/2"},{"type":"module","title":"ValueFlows.Observe.Seeds","doc":"","ref":"ValueFlows.Observe.Seeds.html"},{"type":"function","title":"ValueFlows.Observe.Seeds.down/1","doc":"","ref":"ValueFlows.Observe.Seeds.html#down/1"},{"type":"function","title":"ValueFlows.Observe.Seeds.up/1","doc":"","ref":"ValueFlows.Observe.Seeds.html#up/1"},{"type":"module","title":"ValueFlows.Observe.Simulate","doc":"","ref":"ValueFlows.Observe.Simulate.html"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observable_phenomenon!/3","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observable_phenomenon!/3"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observable_property!/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observable_property!/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observation!/3","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observation!/3"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_phenomenon/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_phenomenon/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_phenomenon_input/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_phenomenon_input/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_property/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_property/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_property_input/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_property_input/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation/4","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation/4"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation_input/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation_input/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation_with_req_fields/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation_with_req_fields/2"},{"type":"module","title":"ValueFlows.Planning.Commitment","doc":"","ref":"ValueFlows.Planning.Commitment.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.context_module/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.delete/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.get/3","doc":"","ref":"ValueFlows.Planning.Commitment.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.put/3","doc":"","ref":"ValueFlows.Planning.Commitment.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.query_module/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Planning.Commitment.attrs/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#t:attrs/0"},{"type":"type","title":"ValueFlows.Planning.Commitment.t/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Commitment.Commitments","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.by_id/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.create/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.many/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.one/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.preload_action/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#preload_action/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.preload_all/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.prep_attrs/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#prep_attrs/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.soft_delete/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.update/3","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#update/3"},{"type":"module","title":"ValueFlows.Planning.Commitment.GraphQL","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.commitments_filtered/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#commitments_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.create_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#create_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.delete_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#delete_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_created/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_created/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_satisfies_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_satisfies_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.update_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#update_commitment/2"},{"type":"module","title":"ValueFlows.Planning.Commitment.Queries","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Intent","doc":"","ref":"ValueFlows.Planning.Intent.html"},{"type":"function","title":"ValueFlows.Planning.Intent.context_module/0","doc":"","ref":"ValueFlows.Planning.Intent.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Intent.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Intent.delete/2","doc":"","ref":"ValueFlows.Planning.Intent.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Intent.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Intent.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Intent.get/3","doc":"","ref":"ValueFlows.Planning.Intent.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Intent.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Intent.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Intent.put/3","doc":"","ref":"ValueFlows.Planning.Intent.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Intent.query_module/0","doc":"","ref":"ValueFlows.Planning.Intent.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Intent.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Intent.validate_changeset/1","doc":"","ref":"ValueFlows.Planning.Intent.html#validate_changeset/1"},{"type":"type","title":"ValueFlows.Planning.Intent.t/0","doc":"","ref":"ValueFlows.Planning.Intent.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Intent.GraphQL","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.agent_intents/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#agent_intents/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.agent_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#agent_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_need/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_need/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_offer/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_offer/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.delete_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#delete_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_agent_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_agent_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_needs/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_needs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_offers/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_offers/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_provider_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_provider_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_satisfied_by_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_satisfied_by_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intents_filtered/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intents_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.list_intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#list_intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.needs/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#needs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.offers/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#offers/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.provider_intents/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#provider_intents/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.provider_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#provider_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.update_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#update_intent/2"},{"type":"module","title":"ValueFlows.Planning.Intent.Intents","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.ap_publish_activity/3","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.ap_receive_activity/3","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.by_id/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.create/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.cursor/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#cursor/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.federation_module/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#federation_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.fields/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#fields/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.indexing_object_format/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Planning.Intent.Intents.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Planning.Intent.Intents.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.page/5","doc":"Retrieves an Page of intents according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Planning.Intent.Intents.html#page/5"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.pages/6","doc":"Retrieves an Pages of intents according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Planning.Intent.Intents.html#pages/6"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.preload_action/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#preload_action/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.preload_all/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.prepare_attrs/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#prepare_attrs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.soft_delete/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.test_cursor/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.update/4","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#update/4"},{"type":"module","title":"ValueFlows.Planning.Intent.LiveHandler","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.assign_to/4","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#assign_to/4"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.create_from_list/6","doc":"Create intents from a markdown-formatted list of checkboxes","ref":"ValueFlows.Planning.Intent.LiveHandler.html#create_from_list/6"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.create_from_list/7","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#create_from_list/7"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#handle_event/3"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.handle_param/3","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#handle_param/3"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.input_date/1","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#input_date/1"},{"type":"macro","title":"ValueFlows.Planning.Intent.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.update_verb/1","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#update_verb/1"},{"type":"module","title":"ValueFlows.Planning.Intent.Queries","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction","doc":"","ref":"ValueFlows.Planning.Satisfaction.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.context_module/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.get/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.put/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.query_module/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Planning.Satisfaction.attrs/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#t:attrs/0"},{"type":"type","title":"ValueFlows.Planning.Satisfaction.t/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.GraphQL","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.create/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.event_or_commitment_resolve_type/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#event_or_commitment_resolve_type/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfaction/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfaction/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfied_by_edge/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfied_by_edge/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfies_edge/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfies_edge/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.satisfaction/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#satisfaction/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.satisfactions_filtered/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#satisfactions_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.update/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#update/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.Queries","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.Satisfactions","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.by_id/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.create/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.many/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.one/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.preload_all/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.update/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#update/3"},{"type":"module","title":"ValueFlows.Process","doc":"","ref":"ValueFlows.Process.html"},{"type":"function","title":"ValueFlows.Process.context_module/0","doc":"","ref":"ValueFlows.Process.html#context_module/0"},{"type":"function","title":"ValueFlows.Process.create_changeset/2","doc":"","ref":"ValueFlows.Process.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Process.delete/2","doc":"","ref":"ValueFlows.Process.html#delete/2"},{"type":"function","title":"ValueFlows.Process.follow_filters/0","doc":"","ref":"ValueFlows.Process.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Process.get/3","doc":"","ref":"ValueFlows.Process.html#get/3"},{"type":"function","title":"ValueFlows.Process.put/3","doc":"","ref":"ValueFlows.Process.html#put/3"},{"type":"function","title":"ValueFlows.Process.query_module/0","doc":"","ref":"ValueFlows.Process.html#query_module/0"},{"type":"function","title":"ValueFlows.Process.update_changeset/2","doc":"","ref":"ValueFlows.Process.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Process.validate_changeset/1","doc":"","ref":"ValueFlows.Process.html#validate_changeset/1"},{"type":"type","title":"ValueFlows.Process.t/0","doc":"","ref":"ValueFlows.Process.html#t:t/0"},{"type":"module","title":"ValueFlows.Process.LiveHandler","doc":"","ref":"ValueFlows.Process.LiveHandler.html"},{"type":"function","title":"ValueFlows.Process.LiveHandler.changeset/1","doc":"","ref":"ValueFlows.Process.LiveHandler.html#changeset/1"},{"type":"function","title":"ValueFlows.Process.LiveHandler.do_update/3","doc":"","ref":"ValueFlows.Process.LiveHandler.html#do_update/3"},{"type":"function","title":"ValueFlows.Process.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Process.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.Process.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Process.LiveHandler.html#sigil_p/2"},{"type":"module","title":"ValueFlows.Process.Processes","doc":"","ref":"ValueFlows.Process.Processes.html"},{"type":"function","title":"ValueFlows.Process.Processes.ap_publish_activity/3","doc":"","ref":"ValueFlows.Process.Processes.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Process.Processes.ap_receive_activity/3","doc":"","ref":"ValueFlows.Process.Processes.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Process.Processes.create/2","doc":"","ref":"ValueFlows.Process.Processes.html#create/2"},{"type":"function","title":"ValueFlows.Process.Processes.cursor/0","doc":"","ref":"ValueFlows.Process.Processes.html#cursor/0"},{"type":"function","title":"ValueFlows.Process.Processes.federation_module/0","doc":"","ref":"ValueFlows.Process.Processes.html#federation_module/0"},{"type":"function","title":"ValueFlows.Process.Processes.fields/2","doc":"","ref":"ValueFlows.Process.Processes.html#fields/2"},{"type":"function","title":"ValueFlows.Process.Processes.indexing_object_format/1","doc":"","ref":"ValueFlows.Process.Processes.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Process.Processes.inputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#inputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.intended_inputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#intended_inputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.intended_outputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#intended_outputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Process.Processes.html#many/1"},{"type":"function","title":"ValueFlows.Process.Processes.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Process.Processes.html#one/1"},{"type":"function","title":"ValueFlows.Process.Processes.outputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#outputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.page/5","doc":"Retrieves an Page of processes according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Process.Processes.html#page/5"},{"type":"function","title":"ValueFlows.Process.Processes.pages/6","doc":"Retrieves an Pages of processes according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Process.Processes.html#pages/6"},{"type":"function","title":"ValueFlows.Process.Processes.preload_all/1","doc":"","ref":"ValueFlows.Process.Processes.html#preload_all/1"},{"type":"function","title":"ValueFlows.Process.Processes.prepare_attrs/1","doc":"","ref":"ValueFlows.Process.Processes.html#prepare_attrs/1"},{"type":"function","title":"ValueFlows.Process.Processes.soft_delete/1","doc":"","ref":"ValueFlows.Process.Processes.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Process.Processes.test_cursor/0","doc":"","ref":"ValueFlows.Process.Processes.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Process.Processes.trace/3","doc":"","ref":"ValueFlows.Process.Processes.html#trace/3"},{"type":"function","title":"ValueFlows.Process.Processes.track/3","doc":"","ref":"ValueFlows.Process.Processes.html#track/3"},{"type":"function","title":"ValueFlows.Process.Processes.update/2","doc":"","ref":"ValueFlows.Process.Processes.html#update/2"},{"type":"module","title":"ValueFlows.Process.Queries","doc":"","ref":"ValueFlows.Process.Queries.html"},{"type":"function","title":"ValueFlows.Process.Queries.filter/2","doc":"","ref":"ValueFlows.Process.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Process.Queries.join_to/3","doc":"","ref":"ValueFlows.Process.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Process.Queries.queries/5","doc":"","ref":"ValueFlows.Process.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Process.Queries.query/1","doc":"","ref":"ValueFlows.Process.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Process.Queries.query/2","doc":"","ref":"ValueFlows.Process.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal","doc":"Schema for proposal, using `Needle.Pointable`","ref":"ValueFlows.Proposal.html"},{"type":"function","title":"ValueFlows.Proposal.context_module/0","doc":"","ref":"ValueFlows.Proposal.html#context_module/0"},{"type":"function","title":"ValueFlows.Proposal.create_changeset/2","doc":"","ref":"ValueFlows.Proposal.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Proposal.delete/2","doc":"","ref":"ValueFlows.Proposal.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.follow_filters/0","doc":"","ref":"ValueFlows.Proposal.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Proposal.get/3","doc":"","ref":"ValueFlows.Proposal.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.put/3","doc":"","ref":"ValueFlows.Proposal.html#put/3"},{"type":"function","title":"ValueFlows.Proposal.query_module/0","doc":"","ref":"ValueFlows.Proposal.html#query_module/0"},{"type":"function","title":"ValueFlows.Proposal.update_changeset/2","doc":"","ref":"ValueFlows.Proposal.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Proposal.t/0","doc":"","ref":"ValueFlows.Proposal.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.GraphQL","doc":"","ref":"ValueFlows.Proposal.GraphQL.html"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.agent_proposals/3","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#agent_proposals/3"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.all_proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#all_proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.create_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#create_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.delete_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#delete_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.eligible_location_edge/3","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#eligible_location_edge/3"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.fetch_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#fetch_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.fetch_proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#fetch_proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposals_filtered/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposals_filtered/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.update_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#update_proposal/2"},{"type":"module","title":"ValueFlows.Proposal.Proposals","doc":"","ref":"ValueFlows.Proposal.Proposals.html"},{"type":"function","title":"ValueFlows.Proposal.Proposals.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.Proposals.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.Proposals.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.Proposals.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.Proposals.create/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#create/2"},{"type":"function","title":"ValueFlows.Proposal.Proposals.cursor/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#cursor/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.federation_module/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.fields/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#fields/2"},{"type":"function","title":"ValueFlows.Proposal.Proposals.indexing_object_format/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Proposal.Proposals.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Proposal.Proposals.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.page/5","doc":"Retrieves an Page of proposals according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Proposal.Proposals.html#page/5"},{"type":"function","title":"ValueFlows.Proposal.Proposals.pages/6","doc":"Retrieves an Pages of proposals according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Proposal.Proposals.html#pages/6"},{"type":"function","title":"ValueFlows.Proposal.Proposals.preload_all/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#preload_all/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.soft_delete/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.test_cursor/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.update/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#update/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntent","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.changeset/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#changeset/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.delete/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.get/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.put/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#put/3"},{"type":"type","title":"ValueFlows.Proposal.ProposedIntent.t/0","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntentQueries","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.filter/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.join_to/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.query/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.query/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntents","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.create/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#create/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.delete/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#delete/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.federation_module/0","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.many/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.one/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.propose_intent/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#propose_intent/3"},{"type":"module","title":"ValueFlows.Proposal.ProposedTo","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.changeset/2","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#changeset/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.delete/2","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.get/3","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.put/3","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#put/3"},{"type":"type","title":"ValueFlows.Proposal.ProposedTo.t/0","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.ProposedToQueries","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.filter/2","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.join_to/3","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.query/1","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.query/2","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedTos","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.delete/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#delete/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.federation_module/0","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.many/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.one/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.propose_to/2","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#propose_to/2"},{"type":"module","title":"ValueFlows.Proposal.Queries","doc":"","ref":"ValueFlows.Proposal.Queries.html"},{"type":"function","title":"ValueFlows.Proposal.Queries.filter/2","doc":"","ref":"ValueFlows.Proposal.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.Queries.join_to/3","doc":"","ref":"ValueFlows.Proposal.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.Queries.queries/5","doc":"","ref":"ValueFlows.Proposal.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Proposal.Queries.query/1","doc":"","ref":"ValueFlows.Proposal.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.Queries.query/2","doc":"","ref":"ValueFlows.Proposal.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Util","doc":"","ref":"ValueFlows.Util.html"},{"type":"function","title":"ValueFlows.Util.attr_get_agent/3","doc":"","ref":"ValueFlows.Util.html#attr_get_agent/3"},{"type":"function","title":"ValueFlows.Util.can?/3","doc":"","ref":"ValueFlows.Util.html#can?/3"},{"type":"function","title":"ValueFlows.Util.change_measures/3","doc":"","ref":"ValueFlows.Util.html#change_measures/3"},{"type":"function","title":"ValueFlows.Util.common_filters/2","doc":"","ref":"ValueFlows.Util.html#common_filters/2"},{"type":"function","title":"ValueFlows.Util.content_url_or_path/1","doc":"","ref":"ValueFlows.Util.html#content_url_or_path/1"},{"type":"function","title":"ValueFlows.Util.default_recurse_limit/0","doc":"","ref":"ValueFlows.Util.html#default_recurse_limit/0"},{"type":"function","title":"ValueFlows.Util.handle_changeset_errors/3","doc":"","ref":"ValueFlows.Util.html#handle_changeset_errors/3"},{"type":"function","title":"ValueFlows.Util.image_schema/0","doc":"","ref":"ValueFlows.Util.html#image_schema/0"},{"type":"function","title":"ValueFlows.Util.image_url/1","doc":"","ref":"ValueFlows.Util.html#image_url/1"},{"type":"function","title":"ValueFlows.Util.index_for_search/1","doc":"","ref":"ValueFlows.Util.html#index_for_search/1"},{"type":"function","title":"ValueFlows.Util.indexing_format_creator/1","doc":"","ref":"ValueFlows.Util.html#indexing_format_creator/1"},{"type":"function","title":"ValueFlows.Util.indexing_format_tags/1","doc":"","ref":"ValueFlows.Util.html#indexing_format_tags/1"},{"type":"function","title":"ValueFlows.Util.map_values/2","doc":"","ref":"ValueFlows.Util.html#map_values/2"},{"type":"function","title":"ValueFlows.Util.max_recurse_limit/0","doc":"","ref":"ValueFlows.Util.html#max_recurse_limit/0"},{"type":"function","title":"ValueFlows.Util.maybe_classification/2","doc":"lookup tag from URL(s), to support vf-graphql mode","ref":"ValueFlows.Util.html#maybe_classification/2"},{"type":"function","title":"ValueFlows.Util.maybe_classification_id/2","doc":"","ref":"ValueFlows.Util.html#maybe_classification_id/2"},{"type":"function","title":"ValueFlows.Util.maybe_search/2","doc":"","ref":"ValueFlows.Util.html#maybe_search/2"},{"type":"function","title":"ValueFlows.Util.org_schema/0","doc":"","ref":"ValueFlows.Util.html#org_schema/0"},{"type":"function","title":"ValueFlows.Util.parse_measurement_attrs/2","doc":"","ref":"ValueFlows.Util.html#parse_measurement_attrs/2"},{"type":"function","title":"ValueFlows.Util.prepare_opts_and_maybe_set_boundaries/3","doc":"","ref":"ValueFlows.Util.html#prepare_opts_and_maybe_set_boundaries/3"},{"type":"function","title":"ValueFlows.Util.publish/2","doc":"","ref":"ValueFlows.Util.html#publish/2"},{"type":"function","title":"ValueFlows.Util.publish/4","doc":"","ref":"ValueFlows.Util.html#publish/4"},{"type":"function","title":"ValueFlows.Util.search_for_matches/1","doc":"","ref":"ValueFlows.Util.html#search_for_matches/1"},{"type":"function","title":"ValueFlows.Util.try_tag_thing/3","doc":"","ref":"ValueFlows.Util.html#try_tag_thing/3"},{"type":"function","title":"ValueFlows.Util.user_or_org_schema/0","doc":"","ref":"ValueFlows.Util.html#user_or_org_schema/0"},{"type":"function","title":"ValueFlows.Util.user_schema/0","doc":"","ref":"ValueFlows.Util.html#user_schema/0"},{"type":"module","title":"ValueFlows.Util.Federation","doc":"","ref":"ValueFlows.Util.Federation.html"},{"type":"function","title":"ValueFlows.Util.Federation.activity_object_id/1","doc":"","ref":"ValueFlows.Util.Federation.html#activity_object_id/1"},{"type":"function","title":"ValueFlows.Util.Federation.ap_graphql_fields/2","doc":"","ref":"ValueFlows.Util.Federation.html#ap_graphql_fields/2"},{"type":"function","title":"ValueFlows.Util.Federation.ap_prepare_object/1","doc":"","ref":"ValueFlows.Util.Federation.html#ap_prepare_object/1"},{"type":"function","title":"ValueFlows.Util.Federation.ap_publish/3","doc":"","ref":"ValueFlows.Util.Federation.html#ap_publish/3"},{"type":"function","title":"ValueFlows.Util.Federation.ap_publish_activity/6","doc":"","ref":"ValueFlows.Util.Federation.html#ap_publish_activity/6"},{"type":"function","title":"ValueFlows.Util.Federation.ap_receive_activity/4","doc":"Incoming federation","ref":"ValueFlows.Util.Federation.html#ap_receive_activity/4"},{"type":"function","title":"ValueFlows.Util.Federation.fetch_api_object/4","doc":"","ref":"ValueFlows.Util.Federation.html#fetch_api_object/4"},{"type":"function","title":"ValueFlows.Util.Federation.maybe_create_nested_object/3","doc":"","ref":"ValueFlows.Util.Federation.html#maybe_create_nested_object/3"},{"type":"function","title":"ValueFlows.Util.Federation.maybe_id/2","doc":"","ref":"ValueFlows.Util.Federation.html#maybe_id/2"},{"type":"function","title":"ValueFlows.Util.Federation.struct_to_json/1","doc":"","ref":"ValueFlows.Util.Federation.html#struct_to_json/1"},{"type":"module","title":"ValueFlows.ValueCalculation","doc":"","ref":"ValueFlows.ValueCalculation.html"},{"type":"function","title":"ValueFlows.ValueCalculation.create_changeset/2","doc":"","ref":"ValueFlows.ValueCalculation.html#create_changeset/2"},{"type":"function","title":"ValueFlows.ValueCalculation.delete/2","doc":"","ref":"ValueFlows.ValueCalculation.html#delete/2"},{"type":"function","title":"ValueFlows.ValueCalculation.follow_filters/0","doc":"","ref":"ValueFlows.ValueCalculation.html#follow_filters/0"},{"type":"function","title":"ValueFlows.ValueCalculation.get/3","doc":"","ref":"ValueFlows.ValueCalculation.html#get/3"},{"type":"function","title":"ValueFlows.ValueCalculation.put/3","doc":"","ref":"ValueFlows.ValueCalculation.html#put/3"},{"type":"function","title":"ValueFlows.ValueCalculation.query_module/0","doc":"","ref":"ValueFlows.ValueCalculation.html#query_module/0"},{"type":"function","title":"ValueFlows.ValueCalculation.update_changeset/2","doc":"","ref":"ValueFlows.ValueCalculation.html#update_changeset/2"},{"type":"type","title":"ValueFlows.ValueCalculation.t/0","doc":"","ref":"ValueFlows.ValueCalculation.html#t:t/0"},{"type":"module","title":"ValueFlows.ValueCalculation.GraphQL","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.create_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#create_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.delete_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#delete_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.fetch_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#fetch_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.fetch_value_calculations/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#fetch_value_calculations/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.resource_conforms_to_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#resource_conforms_to_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.update_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#update_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_action_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_action_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_calculations/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_calculations/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_resource_conforms_to_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_resource_conforms_to_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_unit_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_unit_edge/3"},{"type":"module","title":"ValueFlows.ValueCalculation.Queries","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.filter/2","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.join_to/3","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.query/1","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#query/1"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.query/2","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#query/2"},{"type":"module","title":"ValueFlows.ValueCalculation.ValueCalculations","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.apply_to/2","doc":"Apply the value calculation to a context","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#apply_to/2"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.create/2","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#create/2"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.many/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#many/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.one/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#one/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.preload_all/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#preload_all/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.soft_delete/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#soft_delete/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.update/2","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#update/2"},{"type":"module","title":"Bonfire.Breadpub","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.Breadpub.html"},{"type":"module","title":"Handy commands - Bonfire.Breadpub","doc":"","ref":"Bonfire.Breadpub.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Breadpub","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Breadpub.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Breadpub.mailer/0","doc":"","ref":"Bonfire.Breadpub.html#mailer/0"},{"type":"function","title":"Bonfire.Breadpub.remote_tag_id/0","doc":"","ref":"Bonfire.Breadpub.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.Breadpub.repo/0","doc":"","ref":"Bonfire.Breadpub.html#repo/0"},{"type":"module","title":"Bonfire.Breadpub.IntentLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.MapLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.Web.Routes","doc":"","ref":"Bonfire.Breadpub.Web.Routes.html"},{"type":"function","title":"Bonfire.Breadpub.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Breadpub.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Classify","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Defining categories/topics\n- Defining relationships (parent or related) between categories to create taxonomies\n\nUse Bonfire.Tag if you want to tag/classify posts or other objects with these categories/topics.","ref":"Bonfire.Classify.html"},{"type":"module","title":"Handy commands - Bonfire.Classify","doc":"","ref":"Bonfire.Classify.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Classify","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Classify.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Classify.arrange_categories_tree/1","doc":"","ref":"Bonfire.Classify.html#arrange_categories_tree/1"},{"type":"function","title":"Bonfire.Classify.ensure_update_allowed/2","doc":"","ref":"Bonfire.Classify.html#ensure_update_allowed/2"},{"type":"function","title":"Bonfire.Classify.maybe_index/1","doc":"","ref":"Bonfire.Classify.html#maybe_index/1"},{"type":"function","title":"Bonfire.Classify.maybe_unindex/1","doc":"","ref":"Bonfire.Classify.html#maybe_unindex/1"},{"type":"function","title":"Bonfire.Classify.my_followed_tree/2","doc":"","ref":"Bonfire.Classify.html#my_followed_tree/2"},{"type":"function","title":"Bonfire.Classify.publish/5","doc":"","ref":"Bonfire.Classify.html#publish/5"},{"type":"module","title":"Bonfire.Classify.Categories","doc":"","ref":"Bonfire.Classify.Categories.html"},{"type":"function","title":"Bonfire.Classify.Categories.ap_publish_activity/3","doc":"","ref":"Bonfire.Classify.Categories.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Classify.Categories.ap_receive_activity/3","doc":"","ref":"Bonfire.Classify.Categories.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Classify.Categories.attrs_prepare_tree/2","doc":"","ref":"Bonfire.Classify.Categories.html#attrs_prepare_tree/2"},{"type":"function","title":"Bonfire.Classify.Categories.attrs_with_username/1","doc":"","ref":"Bonfire.Classify.Categories.html#attrs_with_username/1"},{"type":"function","title":"Bonfire.Classify.Categories.by_username/2","doc":"","ref":"Bonfire.Classify.Categories.html#by_username/2"},{"type":"function","title":"Bonfire.Classify.Categories.clean_username/1","doc":"","ref":"Bonfire.Classify.Categories.html#clean_username/1"},{"type":"function","title":"Bonfire.Classify.Categories.create/3","doc":"Create a brand-new category object, with info stored in profile and character mixins","ref":"Bonfire.Classify.Categories.html#create/3"},{"type":"function","title":"Bonfire.Classify.Categories.create_remote/1","doc":"","ref":"Bonfire.Classify.Categories.html#create_remote/1"},{"type":"function","title":"Bonfire.Classify.Categories.federation_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#federation_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.format_actor/1","doc":"","ref":"Bonfire.Classify.Categories.html#format_actor/1"},{"type":"function","title":"Bonfire.Classify.Categories.get/2","doc":"","ref":"Bonfire.Classify.Categories.html#get/2"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format_name/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format_name/1"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format_parent/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format_parent/1"},{"type":"function","title":"Bonfire.Classify.Categories.list/2","doc":"","ref":"Bonfire.Classify.Categories.html#list/2"},{"type":"function","title":"Bonfire.Classify.Categories.list_tree/2","doc":"","ref":"Bonfire.Classify.Categories.html#list_tree/2"},{"type":"function","title":"Bonfire.Classify.Categories.moderators/1","doc":"","ref":"Bonfire.Classify.Categories.html#moderators/1"},{"type":"function","title":"Bonfire.Classify.Categories.name_already_taken?/1","doc":"","ref":"Bonfire.Classify.Categories.html#name_already_taken?/1"},{"type":"function","title":"Bonfire.Classify.Categories.one/2","doc":"","ref":"Bonfire.Classify.Categories.html#one/2"},{"type":"function","title":"Bonfire.Classify.Categories.put_attrs_with_parent_category/2","doc":"","ref":"Bonfire.Classify.Categories.html#put_attrs_with_parent_category/2"},{"type":"function","title":"Bonfire.Classify.Categories.put_generated_username/2","doc":"","ref":"Bonfire.Classify.Categories.html#put_generated_username/2"},{"type":"function","title":"Bonfire.Classify.Categories.query_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#query_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.schema_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#schema_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.soft_delete/2","doc":"","ref":"Bonfire.Classify.Categories.html#soft_delete/2"},{"type":"function","title":"Bonfire.Classify.Categories.try_several_usernames/4","doc":"","ref":"Bonfire.Classify.Categories.html#try_several_usernames/4"},{"type":"function","title":"Bonfire.Classify.Categories.update/4","doc":"","ref":"Bonfire.Classify.Categories.html#update/4"},{"type":"function","title":"Bonfire.Classify.Categories.update_local_actor/2","doc":"","ref":"Bonfire.Classify.Categories.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Classify.Categories.update_remote_actor/2","doc":"","ref":"Bonfire.Classify.Categories.html#update_remote_actor/2"},{"type":"function","title":"Bonfire.Classify.Categories.username_with_parent/2","doc":"","ref":"Bonfire.Classify.Categories.html#username_with_parent/2"},{"type":"module","title":"Bonfire.Classify.Category","doc":"","ref":"Bonfire.Classify.Category.html"},{"type":"function","title":"Bonfire.Classify.Category.base_create_changeset/2","doc":"","ref":"Bonfire.Classify.Category.html#base_create_changeset/2"},{"type":"function","title":"Bonfire.Classify.Category.context_module/0","doc":"","ref":"Bonfire.Classify.Category.html#context_module/0"},{"type":"function","title":"Bonfire.Classify.Category.create_changeset/3","doc":"","ref":"Bonfire.Classify.Category.html#create_changeset/3"},{"type":"function","title":"Bonfire.Classify.Category.delete/2","doc":"","ref":"Bonfire.Classify.Category.html#delete/2"},{"type":"function","title":"Bonfire.Classify.Category.follow_filters/0","doc":"","ref":"Bonfire.Classify.Category.html#follow_filters/0"},{"type":"function","title":"Bonfire.Classify.Category.get/3","doc":"","ref":"Bonfire.Classify.Category.html#get/3"},{"type":"function","title":"Bonfire.Classify.Category.put/3","doc":"","ref":"Bonfire.Classify.Category.html#put/3"},{"type":"function","title":"Bonfire.Classify.Category.query_module/0","doc":"","ref":"Bonfire.Classify.Category.html#query_module/0"},{"type":"function","title":"Bonfire.Classify.Category.update_changeset/3","doc":"","ref":"Bonfire.Classify.Category.html#update_changeset/3"},{"type":"type","title":"Bonfire.Classify.Category.t/0","doc":"","ref":"Bonfire.Classify.Category.html#t:t/0"},{"type":"module","title":"Bonfire.Classify.Category.Queries","doc":"","ref":"Bonfire.Classify.Category.Queries.html"},{"type":"function","title":"Bonfire.Classify.Category.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Classify.Category.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Classify.Category.Queries.join_to/3","doc":"","ref":"Bonfire.Classify.Category.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Classify.Category.Queries.queries/4","doc":"","ref":"Bonfire.Classify.Category.Queries.html#queries/4"},{"type":"function","title":"Bonfire.Classify.Category.Queries.query/1","doc":"","ref":"Bonfire.Classify.Category.Queries.html#query/1"},{"type":"function","title":"Bonfire.Classify.Category.Queries.query/2","doc":"","ref":"Bonfire.Classify.Category.Queries.html#query/2"},{"type":"module","title":"Bonfire.Classify.LiveHandler","doc":"","ref":"Bonfire.Classify.LiveHandler.html"},{"type":"function","title":"Bonfire.Classify.LiveHandler.declared_extension/0","doc":"","ref":"Bonfire.Classify.LiveHandler.html#declared_extension/0"},{"type":"function","title":"Bonfire.Classify.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.mounted/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#mounted/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.new/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#new/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.set_image/5","doc":"","ref":"Bonfire.Classify.LiveHandler.html#set_image/5"},{"type":"macro","title":"Bonfire.Classify.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Classify.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Classify.RuntimeConfig","doc":"","ref":"Bonfire.Classify.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Classify.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Classify.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Classify.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Classify.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Classify.Simulate","doc":"","ref":"Bonfire.Classify.Simulate.html"},{"type":"function","title":"Bonfire.Classify.Simulate.category/1","doc":"","ref":"Bonfire.Classify.Simulate.html#category/1"},{"type":"function","title":"Bonfire.Classify.Simulate.fake_category!/3","doc":"","ref":"Bonfire.Classify.Simulate.html#fake_category!/3"},{"type":"module","title":"Bonfire.Classify.Tree","doc":"A mixin used to record parent/child relationships between categories (eg. a topic that belongs to a group) and between objects and categories (eg. a post was published in a topic)","ref":"Bonfire.Classify.Tree.html"},{"type":"function","title":"Bonfire.Classify.Tree.ancestor_ids/1","doc":"","ref":"Bonfire.Classify.Tree.html#ancestor_ids/1"},{"type":"function","title":"Bonfire.Classify.Tree.ancestors/1","doc":"","ref":"Bonfire.Classify.Tree.html#ancestors/1"},{"type":"function","title":"Bonfire.Classify.Tree.arrange/2","doc":"","ref":"Bonfire.Classify.Tree.html#arrange/2"},{"type":"function","title":"Bonfire.Classify.Tree.build_child/1","doc":"","ref":"Bonfire.Classify.Tree.html#build_child/1"},{"type":"function","title":"Bonfire.Classify.Tree.changeset/2","doc":"","ref":"Bonfire.Classify.Tree.html#changeset/2"},{"type":"function","title":"Bonfire.Classify.Tree.children/1","doc":"","ref":"Bonfire.Classify.Tree.html#children/1"},{"type":"function","title":"Bonfire.Classify.Tree.delete/2","doc":"","ref":"Bonfire.Classify.Tree.html#delete/2"},{"type":"function","title":"Bonfire.Classify.Tree.depth/1","doc":"","ref":"Bonfire.Classify.Tree.html#depth/1"},{"type":"function","title":"Bonfire.Classify.Tree.descendants/1","doc":"","ref":"Bonfire.Classify.Tree.html#descendants/1"},{"type":"function","title":"Bonfire.Classify.Tree.get/3","doc":"","ref":"Bonfire.Classify.Tree.html#get/3"},{"type":"function","title":"Bonfire.Classify.Tree.make_child_of/2","doc":"","ref":"Bonfire.Classify.Tree.html#make_child_of/2"},{"type":"function","title":"Bonfire.Classify.Tree.parent/1","doc":"","ref":"Bonfire.Classify.Tree.html#parent/1"},{"type":"function","title":"Bonfire.Classify.Tree.parent_id/1","doc":"","ref":"Bonfire.Classify.Tree.html#parent_id/1"},{"type":"function","title":"Bonfire.Classify.Tree.path/1","doc":"","ref":"Bonfire.Classify.Tree.html#path/1"},{"type":"function","title":"Bonfire.Classify.Tree.path_ids/1","doc":"","ref":"Bonfire.Classify.Tree.html#path_ids/1"},{"type":"function","title":"Bonfire.Classify.Tree.put/3","doc":"","ref":"Bonfire.Classify.Tree.html#put/3"},{"type":"function","title":"Bonfire.Classify.Tree.put_tree/3","doc":"","ref":"Bonfire.Classify.Tree.html#put_tree/3"},{"type":"function","title":"Bonfire.Classify.Tree.root/1","doc":"","ref":"Bonfire.Classify.Tree.html#root/1"},{"type":"function","title":"Bonfire.Classify.Tree.root?/1","doc":"","ref":"Bonfire.Classify.Tree.html#root?/1"},{"type":"function","title":"Bonfire.Classify.Tree.root_id/1","doc":"","ref":"Bonfire.Classify.Tree.html#root_id/1"},{"type":"function","title":"Bonfire.Classify.Tree.siblings/1","doc":"","ref":"Bonfire.Classify.Tree.html#siblings/1"},{"type":"function","title":"Bonfire.Classify.Tree.subtree/1","doc":"","ref":"Bonfire.Classify.Tree.html#subtree/1"},{"type":"function","title":"Bonfire.Classify.Tree.where_depth/2","doc":"","ref":"Bonfire.Classify.Tree.html#where_depth/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Extensible/configurable tools for translating Bonfire data to/from ActivityStreams\n- Bonfire Adapter for the [ActivityPub federation library ](https://github.com/bonfire-networks/activity_pub)","ref":"Bonfire.Federate.ActivityPub.html"},{"type":"module","title":"Testing - Bonfire.Federate.ActivityPub","doc":"There are unit tests both in this repo, and in the activity_pub lib, but they can't cover every possible federation case, so manual testing with e.g. `curl -H \"Accept: application/activity+json\" -v \"http://localhost:4001/pub/actors/my_username\" | jq '.'` and by trying out federation flows between instances of Bonfire and other ActivityPub implementation is a must.","ref":"Bonfire.Federate.ActivityPub.html#module-testing"},{"type":"module","title":"Handy commands - Bonfire.Federate.ActivityPub","doc":"","ref":"Bonfire.Federate.ActivityPub.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Federate.ActivityPub","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Federate.ActivityPub.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Federate.ActivityPub.disable/1","doc":"","ref":"Bonfire.Federate.ActivityPub.html#disable/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.federating?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.html#federating?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.federating_default?/0","doc":"","ref":"Bonfire.Federate.ActivityPub.html#federating_default?/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.repo/0","doc":"","ref":"Bonfire.Federate.ActivityPub.html#repo/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.set_federating/2","doc":"","ref":"Bonfire.Federate.ActivityPub.html#set_federating/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Adapter","doc":"Adapter functions delegated from the `ActivityPub` Library","ref":"Bonfire.Federate.ActivityPub.Adapter.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.external_followers_for_activity/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#external_followers_for_activity/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.federate_actor?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#federate_actor?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_follower_local_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_follower_local_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_following_local_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_following_local_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_locale/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_locale/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_or_create_service_actor/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_or_create_service_actor/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_redirect_url/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_redirect_url/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.handle_activity/1","doc":"Process incoming activities","ref":"Bonfire.Federate.ActivityPub.Adapter.html#handle_activity/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.local_actor_updated/2","doc":"For updating an Actor in cache after a User/etc is updated","ref":"Bonfire.Federate.ActivityPub.Adapter.html#local_actor_updated/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.maybe_create_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#maybe_create_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.maybe_publish_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#maybe_publish_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.redirect_to_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#redirect_to_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_local_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_remote_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_remote_actor/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.AdapterUtils","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.all_actors/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#all_actors/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.all_recipients/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#all_recipients/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.ap_base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#ap_base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.apply_fun_style/3","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#apply_fun_style/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.character_module/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#character_module/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.character_to_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#character_to_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.create_author_object/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#create_author_object/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.create_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#create_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/3","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/4","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/4"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.format_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#format_actor/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_actor_by_ap_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_actor_by_ap_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_actor_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_actor_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_author/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_author/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_by_url_ap_id_or_username/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_by_url_ap_id_or_username/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_ap_id!/1","doc":"without :ok / :error tuple","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_context_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_context_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_creator_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_creator_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_different_creator_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_different_creator_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_in_reply_to/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_in_reply_to/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_local_actor_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_local_actor_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_local_character_by_ap_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_local_character_by_ap_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_ap_id!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_or_actor_by_ap_id!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_or_actor_by_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_create_service_character/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_create_service_character/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_and_create_by_uri/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_and_create_by_uri/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_and_create_by_username/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_and_create_by_username/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_character_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_character_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_pointer_id_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_pointer_id_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.id_or_object_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#id_or_object_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_follow?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_follow?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local?/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local?/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local_collection?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local_collection?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local_collection_or_built_in?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local_collection_or_built_in?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.local_actor_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#local_actor_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.log/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#log/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_add_aliases/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_add_aliases/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_attach_property_value/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_attach_property_value/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_banner_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_banner_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_icon_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_icon_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_image_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_image_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_fix_image_object/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_fix_image_object/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_format_image_object_from_path/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_format_image_object_from_path/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_pointer_id_for_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_pointer_id_for_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.preload_peered/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#preload_peered/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.public_uri/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#public_uri/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.return_pointable/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#return_pointable/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.return_pointer/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#return_pointer/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.service_character_id/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#service_character_id/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.service_character_username/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#service_character_username/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.the_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#the_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.validate_url/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#validate_url/1"},{"type":"module","title":"Bonfire.Federate.ActivityPub.BoundariesMRF","doc":"Filter activities depending on their origin instance, actor, or other criteria","ref":"Bonfire.Federate.ActivityPub.BoundariesMRF.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.BoundariesMRF.actor_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.BoundariesMRF.html#actor_blocked?/3"},{"type":"behaviour","title":"Bonfire.Federate.ActivityPub.FederationModules","doc":"A automatically-generated global list of federation modules which can queried by activity and/or object type.\n\nTo add a module to this list, you should declare `@behaviour Bonfire.Federate.ActivityPub.FederationModules` in it and define a `federation_module/0` function which returns a list of object and/or activity types which that module handles.\n\nExample:\n```\n@behaviour Bonfire.Federate.ActivityPub.FederationModules\ndef federation_module,\n do: [\n \"Announce\",\n {\"Create\", \"Announce\"},\n {\"Undo\", \"Announce\"},\n {\"Delete\", \"Announce\"}\n ]\n```\n\nYou should also then implement these two functions:\n- for outgoing federation: `ap_publish_activity(subject_struct, verb, object_struct)`\n- for incoming federation: `ap_receive_activity(subject_struct, activity_json, object_json)`","ref":"Bonfire.Federate.ActivityPub.FederationModules.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.app_modules/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#app_modules/0"},{"type":"callback","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module/0","doc":"Get a Federation Module identified by activity and/or object type, given a activity and/or object (string or {activity, object} tuple).","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#c:federation_module/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module/2","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_module/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module!/2","doc":"Look up a Federation Module, throw :not_found if not found.","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_module!/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_modules/1","doc":"Look up many types at once, throw :not_found if any of them are not found","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_modules/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_modules_data_types/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_modules_data_types/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.maybe_federation_module/2","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#maybe_federation_module/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.modules/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#modules/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Incoming","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.no_federation_module_match/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#no_federation_module_match/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_activity/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_activity/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_activity/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_activity/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_object/2","doc":"Create an object without an activity","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_object/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Instances","doc":"Federated instances\nContext for `Bonfire.Data.ActivityPub.Peer`","ref":"Bonfire.Federate.ActivityPub.Instances.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_by_domain/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_by_domain/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_or_create/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_or_create/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_or_create_instance_circle/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_or_create_instance_circle/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.is_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#is_blocked?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list_paginated/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list_paginated/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list_query/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list_query/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.LoadTesting","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.LoadTesting.cases/0","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html#cases/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.LoadTesting.run_bench/0","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html#run_bench/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html#base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.gather_nodeinfo_data/0","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html#gather_nodeinfo_data/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Outgoing","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.ap_activity!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#ap_activity!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.federate_outgoing?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#federate_outgoing?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.maybe_federate/4","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#maybe_federate/4"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.preparation_error/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#preparation_error/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.push_actor_update/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#push_actor_update/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.push_now!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#push_now!/1"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Peered","doc":"Federated actors or objects\nContext for `Bonfire.Data.ActivityPub.Peered`","ref":"Bonfire.Federate.ActivityPub.Peered.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.create/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#create/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.get/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#get/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.get_canonical_uri/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#get_canonical_uri/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.is_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#is_blocked?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.list/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#list/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.save_canonical_uri/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#save_canonical_uri/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.RuntimeConfig","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Simulate","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.actor_json/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#actor_json/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.fake_remote_user/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#fake_remote_user/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.webfingered/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#webfingered/0"},{"type":"module","title":"Bonfire.Geolocate","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Geolocation schema\n- Optional GraphQL API for geolocations\n- Geocoding of addresses\n- Reverse geocoding","ref":"Bonfire.Geolocate.html"},{"type":"module","title":"Usage - Bonfire.Geolocate","doc":"If you want to use the map LiveView component, you will need to `npm add leaflet --save --prefix assets/` in your app, and import","ref":"Bonfire.Geolocate.html#module-usage"},{"type":"module","title":"Handy commands - Bonfire.Geolocate","doc":"","ref":"Bonfire.Geolocate.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Geolocate","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Geolocate.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Geolocate.start/2","doc":"","ref":"Bonfire.Geolocate.html#start/2"},{"type":"module","title":"Bonfire.Geolocate.Geocode","doc":"","ref":"Bonfire.Geolocate.Geocode.html"},{"type":"function","title":"Bonfire.Geolocate.Geocode.coordinates/1","doc":"","ref":"Bonfire.Geolocate.Geocode.html#coordinates/1"},{"type":"module","title":"Bonfire.Geolocate.Geolocation","doc":"","ref":"Bonfire.Geolocate.Geolocation.html"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.context_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#context_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.create_changeset/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#create_changeset/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.delete/2","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#delete/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.follow_filters/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#follow_filters/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.get/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#get/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.put/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#put/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.query_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#query_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.update_changeset/2","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#update_changeset/2"},{"type":"type","title":"Bonfire.Geolocate.Geolocation.t/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#t:t/0"},{"type":"module","title":"Bonfire.Geolocate.Geolocations","doc":"","ref":"Bonfire.Geolocate.Geolocations.html"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.ap_publish_activity/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.ap_receive_activity/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.create/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#create/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.create/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#create/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.cursor/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#cursor/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.federation_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#federation_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.indexing_object_format/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.many/1","doc":"Retrieves a list of geolocations by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for geolocations (inc. tests)","ref":"Bonfire.Geolocate.Geolocations.html#many/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.many!/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#many!/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.maybe_index/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#maybe_index/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.one/1","doc":"Retrieves a single geolocation by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for geolocations (inc. tests)","ref":"Bonfire.Geolocate.Geolocations.html#one/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.populate_coordinates/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#populate_coordinates/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.populate_result/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#populate_result/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.resolve_mappable_address/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#resolve_mappable_address/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.search/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#search/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.soft_delete/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#soft_delete/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.test_cursor/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#test_cursor/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.thing_add_location/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#thing_add_location/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.update/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#update/3"},{"type":"module","title":"Bonfire.Geolocate.GraphQL.Hydration","doc":"","ref":"Bonfire.Geolocate.GraphQL.Hydration.html"},{"type":"function","title":"Bonfire.Geolocate.GraphQL.Hydration.hydrate/0","doc":"","ref":"Bonfire.Geolocate.GraphQL.Hydration.html#hydrate/0"},{"type":"module","title":"Bonfire.Geolocate.LiveHandler","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.create_in_autocomplete/2","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#create_in_autocomplete/2"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Geolocate.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.to_tuple/1","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#to_tuple/1"},{"type":"module","title":"Bonfire.Geolocate.Places","doc":"","ref":"Bonfire.Geolocate.Places.html"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_place/2","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_place/2"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_place_things/2","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_place_things/2"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_places/1","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_places/1"},{"type":"module","title":"Bonfire.Geolocate.Queries","doc":"","ref":"Bonfire.Geolocate.Queries.html"},{"type":"function","title":"Bonfire.Geolocate.Queries.filter/2","doc":"","ref":"Bonfire.Geolocate.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Geolocate.Queries.join_to/3","doc":"","ref":"Bonfire.Geolocate.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Geolocate.Queries.queries/5","doc":"","ref":"Bonfire.Geolocate.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Geolocate.Queries.query/1","doc":"","ref":"Bonfire.Geolocate.Queries.html#query/1"},{"type":"function","title":"Bonfire.Geolocate.Queries.query/2","doc":"","ref":"Bonfire.Geolocate.Queries.html#query/2"},{"type":"module","title":"Bonfire.Geolocate.RuntimeConfig","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Geolocate.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Geolocate.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Geolocate.Simulate","doc":"","ref":"Bonfire.Geolocate.Simulate.html"},{"type":"function","title":"Bonfire.Geolocate.Simulate.address/0","doc":"","ref":"Bonfire.Geolocate.Simulate.html#address/0"},{"type":"function","title":"Bonfire.Geolocate.Simulate.fake_geolocation!/3","doc":"","ref":"Bonfire.Geolocate.Simulate.html#fake_geolocation!/3"},{"type":"function","title":"Bonfire.Geolocate.Simulate.geolocation/1","doc":"","ref":"Bonfire.Geolocate.Simulate.html#geolocation/1"},{"type":"function","title":"Bonfire.Geolocate.Simulate.geolocation_input/1","doc":"","ref":"Bonfire.Geolocate.Simulate.html#geolocation_input/1"},{"type":"function","title":"Bonfire.Geolocate.Simulate.mappable_address/0","doc":"","ref":"Bonfire.Geolocate.Simulate.html#mappable_address/0"},{"type":"module","title":"Bonfire.Geolocate.Web.Routes","doc":"","ref":"Bonfire.Geolocate.Web.Routes.html"},{"type":"function","title":"Bonfire.Geolocate.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Geolocate.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Invite.Links","doc":"An extension for [Bonfire](https://bonfire.cafe/) to generate invite links","ref":"Bonfire.Invite.Links.html"},{"type":"module","title":"Handy commands - Bonfire.Invite.Links","doc":"","ref":"Bonfire.Invite.Links.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Invite.Links","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Invite.Links.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Invite.Links.create/2","doc":"","ref":"Bonfire.Invite.Links.html#create/2"},{"type":"function","title":"Bonfire.Invite.Links.date_expires/1","doc":"","ref":"Bonfire.Invite.Links.html#date_expires/1"},{"type":"function","title":"Bonfire.Invite.Links.expired?/1","doc":"","ref":"Bonfire.Invite.Links.html#expired?/1"},{"type":"function","title":"Bonfire.Invite.Links.get/2","doc":"","ref":"Bonfire.Invite.Links.html#get/2"},{"type":"function","title":"Bonfire.Invite.Links.list_paginated/2","doc":"","ref":"Bonfire.Invite.Links.html#list_paginated/2"},{"type":"function","title":"Bonfire.Invite.Links.one/2","doc":"","ref":"Bonfire.Invite.Links.html#one/2"},{"type":"function","title":"Bonfire.Invite.Links.query/2","doc":"","ref":"Bonfire.Invite.Links.html#query/2"},{"type":"function","title":"Bonfire.Invite.Links.redeem/1","doc":"","ref":"Bonfire.Invite.Links.html#redeem/1"},{"type":"function","title":"Bonfire.Invite.Links.redeemable?/1","doc":"","ref":"Bonfire.Invite.Links.html#redeemable?/1"},{"type":"module","title":"Bonfire.Invite.Links.Fake","doc":"","ref":"Bonfire.Invite.Links.Fake.html"},{"type":"module","title":"Bonfire.Invite.Links.Integration","doc":"","ref":"Bonfire.Invite.Links.Integration.html"},{"type":"function","title":"Bonfire.Invite.Links.Integration.repo/0","doc":"","ref":"Bonfire.Invite.Links.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Invite.Links.LiveHandler","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html"},{"type":"function","title":"Bonfire.Invite.Links.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Invite.Links.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Invite.Links.Web.Routes","doc":"","ref":"Bonfire.Invite.Links.Web.Routes.html"},{"type":"function","title":"Bonfire.Invite.Links.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Invite.Links.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.InviteLink","doc":"","ref":"Bonfire.InviteLink.html"},{"type":"function","title":"Bonfire.InviteLink.changeset/2","doc":"","ref":"Bonfire.InviteLink.html#changeset/2"},{"type":"function","title":"Bonfire.InviteLink.delete/2","doc":"","ref":"Bonfire.InviteLink.html#delete/2"},{"type":"function","title":"Bonfire.InviteLink.get/3","doc":"","ref":"Bonfire.InviteLink.html#get/3"},{"type":"function","title":"Bonfire.InviteLink.put/3","doc":"","ref":"Bonfire.InviteLink.html#put/3"},{"type":"module","title":"Bonfire.Label","doc":"Bonfire.Label is a powerful and flexible extension designed to enhance content moderation and improve online safety. Inspired by the design principles outlined by Prosocial Design (specifically the [Label Misleading Content & Add Links to Reliable Related Content](https://www.prosocialdesign.org/library/label-misleading-content-add-links-to-reliable-related-content) pattern), this library enables the addition of custom labels and descriptions to user-generated posts. \n\nThis feature aids in identifying and marking potentially misleading, harmful, or unsafe content, while also providing users with links to reliable and related information.","ref":"Bonfire.Label.html"},{"type":"module","title":"Features - Bonfire.Label","doc":"- **Custom Labeling**: Easily add custom labels to posts, categorizing them based on content, reliability, and safety.\n- **Dynamic Descriptions**: Append descriptions to posts to provide context, warnings, or additional information.\n- **Link to Reliable Sources**: Option to include up to 3 links to authoritative sources for further reading or fact-checking.\n- **Configurable Settings**: Tailor the permission system to fit the specific governance of your platform.\n- **User-friendly Interface**: Intuitive tools for moderators and administrators to manage labels and descriptions.","ref":"Bonfire.Label.html#module-features"},{"type":"module","title":"Copyright and License - Bonfire.Label","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Label.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Label.changeset/2","doc":"","ref":"Bonfire.Label.html#changeset/2"},{"type":"function","title":"Bonfire.Label.delete/2","doc":"","ref":"Bonfire.Label.html#delete/2"},{"type":"function","title":"Bonfire.Label.get/3","doc":"","ref":"Bonfire.Label.html#get/3"},{"type":"function","title":"Bonfire.Label.put/3","doc":"","ref":"Bonfire.Label.html#put/3"},{"type":"module","title":"Bonfire.Label.Acts.LabelObject","doc":"Takes an object and label and returns a changeset for labeling that object. \nImplements `Bonfire.Epics.Act`.\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n\nAct Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.","ref":"Bonfire.Label.Acts.LabelObject.html"},{"type":"module","title":"Bonfire.Label.ContentLabels","doc":"","ref":"Bonfire.Label.ContentLabels.html"},{"type":"function","title":"Bonfire.Label.ContentLabels.built_in_ids/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#built_in_ids/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.built_ins/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#built_ins/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.can_label?/3","doc":"","ref":"Bonfire.Label.ContentLabels.html#can_label?/3"},{"type":"function","title":"Bonfire.Label.ContentLabels.labels/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#labels/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.labels_under/1","doc":"","ref":"Bonfire.Label.ContentLabels.html#labels_under/1"},{"type":"function","title":"Bonfire.Label.ContentLabels.parent_label_id/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#parent_label_id/0"},{"type":"module","title":"Bonfire.Label.Fake","doc":"","ref":"Bonfire.Label.Fake.html"},{"type":"module","title":"Bonfire.Label.Labelling","doc":"","ref":"Bonfire.Label.Labelling.html"},{"type":"function","title":"Bonfire.Label.Labelling.ap_publish_activity/3","doc":"","ref":"Bonfire.Label.Labelling.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Label.Labelling.count/2","doc":"","ref":"Bonfire.Label.Labelling.html#count/2"},{"type":"function","title":"Bonfire.Label.Labelling.date_last_labelled/2","doc":"","ref":"Bonfire.Label.Labelling.html#date_last_labelled/2"},{"type":"function","title":"Bonfire.Label.Labelling.get/3","doc":"","ref":"Bonfire.Label.Labelling.html#get/3"},{"type":"function","title":"Bonfire.Label.Labelling.get!/3","doc":"","ref":"Bonfire.Label.Labelling.html#get!/3"},{"type":"function","title":"Bonfire.Label.Labelling.label_object/3","doc":"","ref":"Bonfire.Label.Labelling.html#label_object/3"},{"type":"function","title":"Bonfire.Label.Labelling.labelled?/2","doc":"","ref":"Bonfire.Label.Labelling.html#labelled?/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_by/2","doc":"List labels by the user","ref":"Bonfire.Label.Labelling.html#list_by/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_my/1","doc":"List current user's labels","ref":"Bonfire.Label.Labelling.html#list_my/1"},{"type":"function","title":"Bonfire.Label.Labelling.list_of/2","doc":"List label of an object","ref":"Bonfire.Label.Labelling.html#list_of/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_paginated/2","doc":"","ref":"Bonfire.Label.Labelling.html#list_paginated/2"},{"type":"function","title":"Bonfire.Label.Labelling.query/2","doc":"","ref":"Bonfire.Label.Labelling.html#query/2"},{"type":"function","title":"Bonfire.Label.Labelling.query_module/0","doc":"","ref":"Bonfire.Label.Labelling.html#query_module/0"},{"type":"function","title":"Bonfire.Label.Labelling.run_epic/4","doc":"","ref":"Bonfire.Label.Labelling.html#run_epic/4"},{"type":"function","title":"Bonfire.Label.Labelling.schema_module/0","doc":"","ref":"Bonfire.Label.Labelling.html#schema_module/0"},{"type":"function","title":"Bonfire.Label.Labelling.unlabel/3","doc":"","ref":"Bonfire.Label.Labelling.html#unlabel/3"},{"type":"module","title":"Bonfire.Label.Labels","doc":"","ref":"Bonfire.Label.Labels.html"},{"type":"function","title":"Bonfire.Label.Labels.create/4","doc":"","ref":"Bonfire.Label.Labels.html#create/4"},{"type":"function","title":"Bonfire.Label.Labels.get/2","doc":"","ref":"Bonfire.Label.Labels.html#get/2"},{"type":"function","title":"Bonfire.Label.Labels.get_or_create/4","doc":"","ref":"Bonfire.Label.Labels.html#get_or_create/4"},{"type":"function","title":"Bonfire.Label.Labels.repo/0","doc":"","ref":"Bonfire.Label.Labels.html#repo/0"},{"type":"function","title":"Bonfire.Label.Labels.top_label_id/0","doc":"","ref":"Bonfire.Label.Labels.html#top_label_id/0"},{"type":"module","title":"Bonfire.Label.LiveHandler","doc":"","ref":"Bonfire.Label.LiveHandler.html"},{"type":"function","title":"Bonfire.Label.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Label.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Label.LiveHandler.maybe_tag/4","doc":"","ref":"Bonfire.Label.LiveHandler.html#maybe_tag/4"},{"type":"macro","title":"Bonfire.Label.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Label.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Label.RuntimeConfig","doc":"","ref":"Bonfire.Label.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Label.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Label.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Label.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Label.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Label.Web.Routes","doc":"","ref":"Bonfire.Label.Web.Routes.html"},{"type":"function","title":"Bonfire.Label.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Label.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Localise","doc":"Runs at compile-time to include dynamic strings (like verb names and object types) in localisation string extraction.","ref":"Bonfire.Localise.html"},{"type":"module","title":"Bonfire.Me","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Account creation\n- Email verification\n- Authentication\n- User/Profile creation\n- User/Profile switching\n- User Profile\n- Settings","ref":"Bonfire.Me.html"},{"type":"module","title":"Handy commands - Bonfire.Me","doc":"","ref":"Bonfire.Me.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Me","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Me.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Me.make_account_and_user/4","doc":"","ref":"Bonfire.Me.html#make_account_and_user/4"},{"type":"function","title":"Bonfire.Me.make_account_only/3","doc":"","ref":"Bonfire.Me.html#make_account_only/3"},{"type":"function","title":"Bonfire.Me.make_admin/1","doc":"","ref":"Bonfire.Me.html#make_admin/1"},{"type":"module","title":"Bonfire.Me.Accounts","doc":"An account represents a private identity within the system, and can have many User identities (see `Bonfire.Me.Accounts`). An account usually has an `Bonfire.Data.Identity.Email` and a `Bonfire.Data.Identity.Credential` user for login.","ref":"Bonfire.Me.Accounts.html"},{"type":"function","title":"Bonfire.Me.Accounts.allow_signup?/1","doc":"Checks if signup is allowed based on instance config and provided options.","ref":"Bonfire.Me.Accounts.html#allow_signup?/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.allow_signup?/1","doc":"iex> allow_signup?(%{invite: \"invite_code\"})\n true","ref":"Bonfire.Me.Accounts.html#allow_signup?/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_email/3","doc":"Changes the email for the current account.","ref":"Bonfire.Me.Accounts.html#change_email/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.change_email/3","doc":"> change_email(%Account{}, %{old_email: \"old@example.com\", email: \"new@example.com\"})\n {:ok, %Account{}}\n\n > change_email(%Account{}, %Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#change_email/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_password/3","doc":"Changes the password for the current account.","ref":"Bonfire.Me.Accounts.html#change_password/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.change_password/3","doc":"> change_password(%Account{}, %{old_password: \"old\", password: \"new\"})\n {:ok, %Account{}}\n\n > change_password(%Account{}, %Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#change_password/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_password/4","doc":"","ref":"Bonfire.Me.Accounts.html#change_password/4"},{"type":"function","title":"Bonfire.Me.Accounts.changeset/3","doc":"Returns a changeset for the given changeset name and parameters.","ref":"Bonfire.Me.Accounts.html#changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.changeset/3","doc":"> changeset(:forgot_password, %{})\n %Changeset{}\n\n > changeset(:login, %{email: \"test@example.com\", password: \"secret\"})\n %Changeset{}","ref":"Bonfire.Me.Accounts.html#changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.confirm_email/2","doc":"Confirms an account's email address as valid, usually by providing a confirmation token, or directly by providing an Account.","ref":"Bonfire.Me.Accounts.html#confirm_email/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.confirm_email/2","doc":"> confirm_email(\"some_token\")\n {:ok, %Account{}}\n\n > confirm_email(%Account{})\n {:ok, %Account{}}","ref":"Bonfire.Me.Accounts.html#confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.confirm_email_manually/1","doc":"Confirms an account's email manually, by providing the email address. Only for internal or CLI use.","ref":"Bonfire.Me.Accounts.html#confirm_email_manually/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.confirm_email_manually/1","doc":"> confirm_email_manually(\"test@example.com\")\n {:ok, %Account{}}","ref":"Bonfire.Me.Accounts.html#confirm_email_manually/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.count/0","doc":"Counts the number of accounts.","ref":"Bonfire.Me.Accounts.html#count/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.count/0","doc":"iex> count()\n 42","ref":"Bonfire.Me.Accounts.html#count/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.delete/2","doc":"Deletes the given account - use `enqueue_delete/1` instead.","ref":"Bonfire.Me.Accounts.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.delete/2","doc":"iex> delete(%Account{})\n :ok\n\n iex> delete(\"some_account_id\")\n :ok","ref":"Bonfire.Me.Accounts.html#delete/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.do_signup/2","doc":"","ref":"Bonfire.Me.Accounts.html#do_signup/2"},{"type":"function","title":"Bonfire.Me.Accounts.enqueue_delete/1","doc":"Enqueues the deletion of the given account.","ref":"Bonfire.Me.Accounts.html#enqueue_delete/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.enqueue_delete/1","doc":"> enqueue_delete(%Account{})\n :ok\n\n > enqueue_delete(\"some_account_id\")\n :ok","ref":"Bonfire.Me.Accounts.html#enqueue_delete/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.fetch_current/1","doc":"Fetches the current account by its ID, returns `{:error, :not_found}` if the ID is nil.","ref":"Bonfire.Me.Accounts.html#fetch_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.fetch_current/1","doc":"iex> fetch_current(nil)\n {:error, :not_found}\n\n > fetch_current(\"some_id\")\n {:ok, %Account{id: \"some_id\"}}","ref":"Bonfire.Me.Accounts.html#fetch_current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.get_by_email/1","doc":"Returns the account by its email.","ref":"Bonfire.Me.Accounts.html#get_by_email/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.get_by_email/1","doc":"> get_by_email(\"test@example.com\")\n %Account{email: \"test@example.com\"}","ref":"Bonfire.Me.Accounts.html#get_by_email/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.get_current/1","doc":"Returns the current account by its ID or nil if the ID is nil.","ref":"Bonfire.Me.Accounts.html#get_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.get_current/1","doc":"iex> get_current(nil)\n nil\n\n > get_current(\"some_id\")\n %Account{id: \"some_id\"}","ref":"Bonfire.Me.Accounts.html#get_current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.instance_is_invite_only?/0","doc":"Checks if the instance is invite-only.","ref":"Bonfire.Me.Accounts.html#instance_is_invite_only?/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.instance_is_invite_only?/0","doc":"> instance_is_invite_only?()\n true","ref":"Bonfire.Me.Accounts.html#instance_is_invite_only?/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.is_admin?/1","doc":"Checks if the given user or account is an admin.","ref":"Bonfire.Me.Accounts.html#is_admin?/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.is_admin?/1","doc":"> is_admin?(user)\n true\n\n > is_admin?(account)\n true","ref":"Bonfire.Me.Accounts.html#is_admin?/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.is_first_account?/0","doc":"","ref":"Bonfire.Me.Accounts.html#is_first_account?/0"},{"type":"function","title":"Bonfire.Me.Accounts.login/2","doc":"Attempts to log in by password and either username or email.\n\nAccepts a map of parameters or a `LoginFields` changeset.\n\nOn success, returns `{:ok, account, user}` if a username was\nprovided and `{:ok, account, nil}` otherwise.\nOn error, returns `{:error, changeset}`","ref":"Bonfire.Me.Accounts.html#login/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.login/2","doc":"> login(%{email: \"test@example.com\", password: \"secret\"})\n {:ok, %Account{}, nil}\n\n > login(%{username: \"test\", password: \"secret\"})\n {:ok, %Account{}, %User{}}\n\n > login(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#login/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.login_valid?/2","doc":"","ref":"Bonfire.Me.Accounts.html#login_valid?/2"},{"type":"function","title":"Bonfire.Me.Accounts.make_account/2","doc":"","ref":"Bonfire.Me.Accounts.html#make_account/2"},{"type":"function","title":"Bonfire.Me.Accounts.maybe_redeem_invite/2","doc":"","ref":"Bonfire.Me.Accounts.html#maybe_redeem_invite/2"},{"type":"function","title":"Bonfire.Me.Accounts.prepare_signup_opts/1","doc":"","ref":"Bonfire.Me.Accounts.html#prepare_signup_opts/1"},{"type":"function","title":"Bonfire.Me.Accounts.redeemable_invite?/1","doc":"","ref":"Bonfire.Me.Accounts.html#redeemable_invite?/1"},{"type":"function","title":"Bonfire.Me.Accounts.request_confirm_email/2","doc":"Requests an email confirmation for the account.","ref":"Bonfire.Me.Accounts.html#request_confirm_email/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.request_confirm_email/2","doc":"> request_confirm_email(%{email: \"test@example.com\"})\n {:ok, :resent, %Account{}}\n\n > request_confirm_email(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#request_confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.request_forgot_password/1","doc":"Requests a password reset to be sent for the account.","ref":"Bonfire.Me.Accounts.html#request_forgot_password/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.request_forgot_password/1","doc":"> request_forgot_password(%{email: \"test@example.com\"})\n {:ok, :resent, %Account{}}","ref":"Bonfire.Me.Accounts.html#request_forgot_password/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.signup/2","doc":"Signs up a new account with the given parameters.","ref":"Bonfire.Me.Accounts.html#signup/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.signup/2","doc":"> signup(%{email: \"test@example.com\", password: \"secret\"})\n {:ok, %Account{}}\n\n > signup(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#signup/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.update_is_admin/3","doc":"","ref":"Bonfire.Me.Accounts.html#update_is_admin/3"},{"type":"type","title":"Bonfire.Me.Accounts.changeset_name/0","doc":"","ref":"Bonfire.Me.Accounts.html#t:changeset_name/0"},{"type":"module","title":"Bonfire.Me.Accounts.ChangeEmailFields","doc":"A changeset for changing an account's email address","ref":"Bonfire.Me.Accounts.ChangeEmailFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ChangeEmailFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ChangeEmailFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.ChangePasswordFields","doc":"A changeset for changing an account's password","ref":"Bonfire.Me.Accounts.ChangePasswordFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ChangePasswordFields.changeset/3","doc":"","ref":"Bonfire.Me.Accounts.ChangePasswordFields.html#changeset/3"},{"type":"module","title":"Bonfire.Me.Accounts.ConfirmEmailFields","doc":"A changeset for confirming an email address","ref":"Bonfire.Me.Accounts.ConfirmEmailFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ConfirmEmailFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ConfirmEmailFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.ForgotPasswordFields","doc":"A changeset for requesting a password reset","ref":"Bonfire.Me.Accounts.ForgotPasswordFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ForgotPasswordFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ForgotPasswordFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.LoginFields","doc":"A changeset for logging in","ref":"Bonfire.Me.Accounts.LoginFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.LoginFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.LoginFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.Queries","doc":"Queries for `Bonfire.Me.Accounts`","ref":"Bonfire.Me.Accounts.Queries.html"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.by_confirm_token/1","doc":"Finds an account by email confirmation token.","ref":"Bonfire.Me.Accounts.Queries.html#by_confirm_token/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.by_confirm_token/1","doc":"iex> by_confirm_token(\"some_token\")\n #Ecto.Query<...>","ref":"Bonfire.Me.Accounts.Queries.html#by_confirm_token/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.by_email/1","doc":"Finds an account by email address.","ref":"Bonfire.Me.Accounts.Queries.html#by_email/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.by_email/1","doc":"iex> Bonfire.Me.Accounts.Queries.by_email(\"example@example.com\")\n #Ecto.Query<...>","ref":"Bonfire.Me.Accounts.Queries.html#by_email/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.count/1","doc":"Counts the total number of accounts, or counts the number of records in the provided query.","ref":"Bonfire.Me.Accounts.Queries.html#count/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.count/1","doc":"iex> Bonfire.Me.Accounts.Queries.count()\n\n iex> Bonfire.Me.Accounts.Queries.count(from(a in Account, where: a.active == true))","ref":"Bonfire.Me.Accounts.Queries.html#count/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.current/1","doc":"Retrieves the current account by ID.","ref":"Bonfire.Me.Accounts.Queries.html#current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.current/1","doc":"iex> Bonfire.Me.Accounts.Queries.current(\"some_id\")","ref":"Bonfire.Me.Accounts.Queries.html#current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_account_id/1","doc":"Find an account by ID, preloading email and credential information.","ref":"Bonfire.Me.Accounts.Queries.html#login_by_account_id/1"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_email/1","doc":"Find an account by email address, preloading email and credential information.","ref":"Bonfire.Me.Accounts.Queries.html#login_by_email/1"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_username/1","doc":"Find an account by username, preloading the user (with character, and profile information).","ref":"Bonfire.Me.Accounts.Queries.html#login_by_username/1"},{"type":"module","title":"Bonfire.Me.Accounts.SecondFactors","doc":"Support for second-factor authentication. Powered by `NimbleTOTP`.","ref":"Bonfire.Me.Accounts.SecondFactors.html"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.changeset/3","doc":"Creates or updates a TOTP changeset.\n\n The secret will only be updated if the OTP code sent is valid.","ref":"Bonfire.Me.Accounts.SecondFactors.html#changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.changeset/3","doc":"iex> Bonfire.Me.Accounts.SecondFactors.changeset(%AuthSecondFactor{}, %{secret: \"new_secret\"}, [])\n %Ecto.Changeset{data: %AuthSecondFactor{}}","ref":"Bonfire.Me.Accounts.SecondFactors.html#changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.delete_account_totp/1","doc":"Disables the TOTP configuration for the given account.","ref":"Bonfire.Me.Accounts.SecondFactors.html#delete_account_totp/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.delete_account_totp/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(%AuthSecondFactor{id: \"some_id\"})\n\n iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(\"some_id\")","ref":"Bonfire.Me.Accounts.SecondFactors.html#delete_account_totp/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.enabled?/0","doc":"Checks if second-factor authentication (TOTP) is enabled on the instance.","ref":"Bonfire.Me.Accounts.SecondFactors.html#enabled?/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.enabled?/0","doc":"iex> Bonfire.Me.Accounts.SecondFactors.enabled?()\n true","ref":"Bonfire.Me.Accounts.SecondFactors.html#enabled?/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.format_secret/1","doc":"Formats a TOTP secret into a human-readable format.","ref":"Bonfire.Me.Accounts.SecondFactors.html#format_secret/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.format_secret/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.format_secret(\"JBSWY3DPEHPK3PXP\")\n \"JBSW Y3DP EHPK 3PXP\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#format_secret/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.get_account_totp/1","doc":"Retrieves the second factor record for an account, if any.","ref":"Bonfire.Me.Accounts.SecondFactors.html#get_account_totp/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.get_account_totp/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(%{auth_second_factor: %AuthSecondFactor{}})\n %AuthSecondFactor{}\n\n iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(\"some_id\")\n %AuthSecondFactor{}","ref":"Bonfire.Me.Accounts.SecondFactors.html#get_account_totp/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.maybe_authenticate/2","doc":"Tries to authenticates an account using the provided parameters.","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_authenticate/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.maybe_authenticate/2","doc":"iex> Bonfire.Me.Accounts.SecondFactors.maybe_authenticate(\"account_id\", %{\"auth_second_factor\" => %{\"code\" => \"123456\"}})\n {:ok, :valid_totp}","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_authenticate/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset/3","doc":"Conditionally casts a TOTP changeset based on parameters and options.","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_cast_totp_changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset/3","doc":"iex> Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset(changeset, %{auth_second_factor: %{code: \"123456\"}}, [])\n %Ecto.Changeset{data: %AuthSecondFactor{}}","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_cast_totp_changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new/0","doc":"Generates a new TOTP secret if second-factor authentication is enabled.\n\n The secret is a random 20 bytes binary that is used to generate the QR Code to enable 2FA using auth applications.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new/0","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new()\n \"JBSWY3DPEHPK3PXP\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_qrcode/1","doc":"Generates a QR code for the TOTP URI.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_qrcode/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new_qrcode/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new_qrcode()\n \" ... \"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_qrcode/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_struct/1","doc":"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_struct/1"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_uri/1","doc":"Generates a new TOTP URI for use in an authentication app.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_uri/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new_uri/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new_uri()\n \"otpauth://totp/bonfire:AccountName?secret=APYWY3DPEHPK3PXV&issuer=Issuer\"\n\n iex> Bonfire.Me.Accounts.SecondFactors.new_uri(\"JBSWY3DPEHPK3PXP\")\n \"otpauth://totp/bonfire:AccountName?secret=JBSWY3DPEHPK3PXP&issuer=Issuer\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_uri/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.validate_account_totp/2","doc":"Validates if the given TOTP code is valid.","ref":"Bonfire.Me.Accounts.SecondFactors.html#validate_account_totp/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.validate_account_totp/2","doc":"iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(%AuthSecondFactor{id: \"some_id\", secret: \"JBSWY3DPEHPK3PXP\"}, \"123456\")\n :valid_totp\n\n iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(\"some_id\", \"123456\")\n :valid_totp","ref":"Bonfire.Me.Accounts.SecondFactors.html#validate_account_totp/2-examples"},{"type":"module","title":"Bonfire.Me.Acts.Caretaker","doc":"An act that deals with maintaining a `Caretaker` record for a changeset.\n\nDuring insertion, adds an associated insert if a caretaker can be found in the epic options.\n\nDuring deletion, ensures that the related record will be cleaned up.\n\nEpic Options (insert):\n * `:caretaker` - user that will take care of the post, falls back to `:current_user`\n * `:current_user` - user that will taker care of the post, fallback if `:caretaker` is not set.\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Me.Acts.Caretaker.html"},{"type":"function","title":"Bonfire.Me.Acts.Caretaker.run/2","doc":"","ref":"Bonfire.Me.Acts.Caretaker.html#run/2"},{"type":"module","title":"Bonfire.Me.Acts.Creator","doc":"An act that deals with maintaining a `Created` record for a changeset.\n\nDuring insertion, adds an associated insert if a creator can be found in the epic options.\n\nDuring deletion, ensures that the related record will be cleaned up.\n\nEpic Options (insert):\n * `:creator` - user that will create the post, falls back to `:current_user`\n * `:current_user` - user that will create the post, fallback if `:creator` is not set.\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Me.Acts.Creator.html"},{"type":"module","title":"Bonfire.Me.Archive.LiveHandler","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Archive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Me.Archive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Me.Characters","doc":"Shared helpers for character types (such as User or Category)\n\nContext for `Bonfire.Data.Identity.Character` mixin, which has these fields:\n- username\n- username_hash: hashed username (used for preserving uniqueness incl. deleted usernames)\n- outbox: Feed of activities by the user\n- inbox: Feed of messages and other activities for the user\n- notifications: Feed of notifications for the user","ref":"Bonfire.Me.Characters.html"},{"type":"function","title":"Bonfire.Me.Characters.by_username/1","doc":"Retrieves a character by username.","ref":"Bonfire.Me.Characters.html#by_username/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.by_username/1","doc":"> Bonfire.Me.Characters.by_username(\"username\")\n %Bonfire.Data.Identity.Character{}","ref":"Bonfire.Me.Characters.html#by_username/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.by_username!/1","doc":"","ref":"Bonfire.Me.Characters.html#by_username!/1"},{"type":"function","title":"Bonfire.Me.Characters.by_username_q/1","doc":"","ref":"Bonfire.Me.Characters.html#by_username_q/1"},{"type":"function","title":"Bonfire.Me.Characters.changeset/3","doc":"","ref":"Bonfire.Me.Characters.html#changeset/3"},{"type":"function","title":"Bonfire.Me.Characters.character_mention_prefix/1","doc":"Returns the appropriate mention prefix for a character type.","ref":"Bonfire.Me.Characters.html#character_mention_prefix/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.character_mention_prefix/1","doc":"iex> Bonfire.Me.Characters.character_mention_prefix(%Bonfire.Data.Identity.User{})\n \"@\"","ref":"Bonfire.Me.Characters.html#character_mention_prefix/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.character_url/1","doc":"Returns the canonical URL for a character.","ref":"Bonfire.Me.Characters.html#character_url/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.character_url/1","doc":"iex> Bonfire.Me.Characters.character_url(%Bonfire.Data.Identity.Character{})\n \"http://example.com/character/username\"","ref":"Bonfire.Me.Characters.html#character_url/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.clean_username/1","doc":"Cleans a username by replacing forbidden characters with underscores.","ref":"Bonfire.Me.Characters.html#clean_username/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.clean_username/1","doc":"iex> Bonfire.Me.Characters.clean_username(\"invalid username!\")\n \"invalid_username\"","ref":"Bonfire.Me.Characters.html#clean_username/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.display_username/4","doc":"Displays a username with optional domain and prefix.","ref":"Bonfire.Me.Characters.html#display_username/4"},{"type":"function","title":"Examples - Bonfire.Me.Characters.display_username/4","doc":"iex> Bonfire.Me.Characters.display_username(\"username\")\n \"@username\"\n\n iex> Bonfire.Me.Characters.display_username(\"username\", true, true, \"@\")\n \"@username@domain.com\"","ref":"Bonfire.Me.Characters.html#display_username/4-examples"},{"type":"function","title":"Bonfire.Me.Characters.get/1","doc":"Retrieves multiple characters by IDs.","ref":"Bonfire.Me.Characters.html#get/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.get/1","doc":"> Bonfire.Me.Characters.get(\"id_or_username\")\n %Bonfire.Data.Identity.Character{}\n\n > Bonfire.Me.Characters.get([\"id1\", \"id2\"])\n {:ok, [%Bonfire.Data.Identity.Character{}, %Bonfire.Data.Identity.Character{}]}","ref":"Bonfire.Me.Characters.html#get/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.hash_available?/1","doc":"Checks if a username hash is available.","ref":"Bonfire.Me.Characters.html#hash_available?/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.hash_available?/1","doc":"iex> Bonfire.Me.Characters.hash_available?(\"hash\")\n true","ref":"Bonfire.Me.Characters.html#hash_available?/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.hash_delete/1","doc":"Deletes a character by username hash.","ref":"Bonfire.Me.Characters.html#hash_delete/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.hash_delete/1","doc":"> Bonfire.Me.Characters.hash_delete(\"hash\")","ref":"Bonfire.Me.Characters.html#hash_delete/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Characters.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Characters.q_by_id/1","doc":"","ref":"Bonfire.Me.Characters.html#q_by_id/1"},{"type":"function","title":"Bonfire.Me.Characters.remote_changeset/2","doc":"","ref":"Bonfire.Me.Characters.html#remote_changeset/2"},{"type":"function","title":"Bonfire.Me.Characters.schema_module/0","doc":"","ref":"Bonfire.Me.Characters.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Characters.update/2","doc":"Updates a character with the given attributes.","ref":"Bonfire.Me.Characters.html#update/2"},{"type":"function","title":"Examples - Bonfire.Me.Characters.update/2","doc":"> Bonfire.Me.Characters.update(%Bonfire.Data.Identity.Character{}, %{field: \"value\"})\n {:ok, %Bonfire.Data.Identity.Character{}}","ref":"Bonfire.Me.Characters.html#update/2-examples"},{"type":"function","title":"Bonfire.Me.Characters.username_available?/1","doc":"Checks if a username is available.","ref":"Bonfire.Me.Characters.html#username_available?/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.username_available?/1","doc":"iex> Bonfire.Me.Characters.username_available?(\"non_existing_username\")\n true","ref":"Bonfire.Me.Characters.html#username_available?/1-examples"},{"type":"module","title":"Bonfire.Me.DeleteWorker","doc":"Handles queued deletion of a user and its data.","ref":"Bonfire.Me.DeleteWorker.html"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete/2","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete/2"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete_now/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete_now/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete_structs_now/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete_structs_now/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.enqueue_delete/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#enqueue_delete/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.perform/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#perform/1"},{"type":"module","title":"Bonfire.Me.Fake","doc":"","ref":"Bonfire.Me.Fake.html"},{"type":"function","title":"Bonfire.Me.Fake.fake_account!/2","doc":"","ref":"Bonfire.Me.Fake.html#fake_account!/2"},{"type":"function","title":"Bonfire.Me.Fake.fake_user!/3","doc":"","ref":"Bonfire.Me.Fake.html#fake_user!/3"},{"type":"module","title":"Bonfire.Me.Fake.Helpers","doc":"","ref":"Bonfire.Me.Fake.Helpers.html"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.atusername/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#atusername/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.avatar_url/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#avatar_url/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.avatar_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#avatar_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.character_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#character_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.confirm_token/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#confirm_token/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.create_user_form/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#create_user_form/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.credential_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#credential_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.email_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#email_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.icon_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#icon_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.image/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#image/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.image_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#image_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.profile_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#profile_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.signup_form/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#signup_form/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.user_live/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#user_live/1"},{"type":"module","title":"Bonfire.Me.Integration","doc":"","ref":"Bonfire.Me.Integration.html"},{"type":"function","title":"Bonfire.Me.Integration.declared_extension/0","doc":"","ref":"Bonfire.Me.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Me.Integration.indexing_format_created/2","doc":"","ref":"Bonfire.Me.Integration.html#indexing_format_created/2"},{"type":"function","title":"Bonfire.Me.Integration.indexing_format_creator/2","doc":"","ref":"Bonfire.Me.Integration.html#indexing_format_creator/2"},{"type":"function","title":"Bonfire.Me.Integration.is_local?/2","doc":"","ref":"Bonfire.Me.Integration.html#is_local?/2"},{"type":"function","title":"Bonfire.Me.Integration.mailer/0","doc":"","ref":"Bonfire.Me.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Me.Integration.maybe_index/1","doc":"","ref":"Bonfire.Me.Integration.html#maybe_index/1"},{"type":"function","title":"Bonfire.Me.Integration.repo/0","doc":"","ref":"Bonfire.Me.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Me.Mails","doc":"Handles email sending functionality for accounts and users","ref":"Bonfire.Me.Mails.html"},{"type":"function","title":"Bonfire.Me.Mails.confirm_email/2","doc":"Sends a confirmation email based on the specified action.","ref":"Bonfire.Me.Mails.html#confirm_email/2"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.confirm_email/2","doc":"- `account`: The `%Account{}` struct for the user.\n - `opts`: Options including `:confirm_action`, which determines the type of email to send.","ref":"Bonfire.Me.Mails.html#confirm_email/2-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.confirm_email/2","doc":"iex> Bonfire.Me.Mails.confirm_email(%Account{})\n # sends signup confirmation\n\n iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)\n\n iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)","ref":"Bonfire.Me.Mails.html#confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Mails.forgot_password/1","doc":"Sends a password reset email.","ref":"Bonfire.Me.Mails.html#forgot_password/1"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.forgot_password/1","doc":"- `account`: The `%Account{}` struct for the user.","ref":"Bonfire.Me.Mails.html#forgot_password/1-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.forgot_password/1","doc":"iex> Bonfire.Me.Mails.forgot_password(%Account{email: %{confirm_token: \"token\"}})\n :ok","ref":"Bonfire.Me.Mails.html#forgot_password/1-examples"},{"type":"function","title":"Bonfire.Me.Mails.render/3","doc":"","ref":"Bonfire.Me.Mails.html#render/3"},{"type":"function","title":"Bonfire.Me.Mails.signup_confirm_email/1","doc":"Sends a confirmation email for user signup.","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.signup_confirm_email/1","doc":"- `account`: The `%Account{}` struct for the user.","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.signup_confirm_email/1","doc":"iex> Bonfire.Me.Mails.signup_confirm_email(%Account{email: %{confirm_token: \"token\"}})","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1-examples"},{"type":"module","title":"Bonfire.Me.Mails.EmailView","doc":"","ref":"Bonfire.Me.Mails.EmailView.html"},{"type":"function","title":"Bonfire.Me.Mails.EmailView.render_template/2","doc":"","ref":"Bonfire.Me.Mails.EmailView.html#render_template/2"},{"type":"module","title":"Bonfire.Me.Profiles","doc":"Shared helpers for profiles (such as the profile of a User or Category)\n\nContext for `Bonfire.Data.Social.Profile` mixin, which has these fields:\n- name\n- summary\n- website\n- location (plaintext, see )\n- icon: eg. avatar (references a `Bonfire.Files.Media`)\n- image: eg. banner","ref":"Bonfire.Me.Profiles.html"},{"type":"function","title":"Bonfire.Me.Profiles.changeset/2","doc":"","ref":"Bonfire.Me.Profiles.html#changeset/2"},{"type":"function","title":"Bonfire.Me.Profiles.changeset_simple/2","doc":"","ref":"Bonfire.Me.Profiles.html#changeset_simple/2"},{"type":"function","title":"Bonfire.Me.Profiles.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Profiles.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Profiles.schema_module/0","doc":"","ref":"Bonfire.Me.Profiles.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Profiles.set_profile_image/3","doc":"","ref":"Bonfire.Me.Profiles.html#set_profile_image/3"},{"type":"function","title":"Bonfire.Me.Profiles.spam?/2","doc":"","ref":"Bonfire.Me.Profiles.html#spam?/2"},{"type":"function","title":"Bonfire.Me.Profiles.spam_check!/2","doc":"","ref":"Bonfire.Me.Profiles.html#spam_check!/2"},{"type":"module","title":"Bonfire.Me.Profiles.LiveHandler","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.default_assigns/1","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#default_assigns/1"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.get/1","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#get/1"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.init/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#init/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.maybe_assign_aliases/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#maybe_assign_aliases/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.set_image_setting/5","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#set_image_setting/5"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.set_profile_image/5","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#set_profile_image/5"},{"type":"macro","title":"Bonfire.Me.Profiles.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.user_assigns/3","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#user_assigns/3"},{"type":"module","title":"Bonfire.Me.RuntimeConfig","doc":"","ref":"Bonfire.Me.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Me.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Me.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Me.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Me.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Me.SharedUsers","doc":"Enables multiple people to share one identity, by associating one User with many Accounts. Context for `Bonfire.Data.SharedUser`","ref":"Bonfire.Me.SharedUsers.html"},{"type":"function","title":"Bonfire.Me.SharedUsers.add_account/3","doc":"","ref":"Bonfire.Me.SharedUsers.html#add_account/3"},{"type":"function","title":"Bonfire.Me.SharedUsers.add_accounts/3","doc":"","ref":"Bonfire.Me.SharedUsers.html#add_accounts/3"},{"type":"function","title":"Bonfire.Me.SharedUsers.by_account/1","doc":"","ref":"Bonfire.Me.SharedUsers.html#by_account/1"},{"type":"function","title":"Bonfire.Me.SharedUsers.by_username_and_account_query/2","doc":"","ref":"Bonfire.Me.SharedUsers.html#by_username_and_account_query/2"},{"type":"function","title":"Bonfire.Me.SharedUsers.federation_module/0","doc":"","ref":"Bonfire.Me.SharedUsers.html#federation_module/0"},{"type":"function","title":"Bonfire.Me.SharedUsers.init_shared_user/2","doc":"","ref":"Bonfire.Me.SharedUsers.html#init_shared_user/2"},{"type":"module","title":"Bonfire.Me.Users","doc":"A User represents a visible identity within the system belonging to an Account (see `Bonfire.Me.Accounts`) and having a Profile (see `Bonfire.Me.Profiles`) and a Character identified by a username (see `Bonfire.Me.Characters`).","ref":"Bonfire.Me.Users.html"},{"type":"function","title":"Bonfire.Me.Users.ap_receive_activity/3","doc":"","ref":"Bonfire.Me.Users.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Me.Users.automod_id/0","doc":"","ref":"Bonfire.Me.Users.html#automod_id/0"},{"type":"function","title":"Bonfire.Me.Users.by_account/1","doc":"Gets users by account.","ref":"Bonfire.Me.Users.html#by_account/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_account/1","doc":"> Bonfire.Me.Users.by_account(%Bonfire.Data.Identity.Account{id: \"account_id\"})\n [%Bonfire.Data.Identity.User{}]\n\n > Bonfire.Me.Users.by_account!(\"account_id\")\n [%Bonfire.Data.Identity.User{}]","ref":"Bonfire.Me.Users.html#by_account/1-examples"},{"type":"function","title":"Bonfire.Me.Users.by_account!/1","doc":"","ref":"Bonfire.Me.Users.html#by_account!/1"},{"type":"function","title":"Bonfire.Me.Users.by_ap_id/1","doc":"","ref":"Bonfire.Me.Users.html#by_ap_id/1"},{"type":"function","title":"Bonfire.Me.Users.by_ap_id!/1","doc":"","ref":"Bonfire.Me.Users.html#by_ap_id!/1"},{"type":"function","title":"Bonfire.Me.Users.by_canonical_uri/1","doc":"Gets a user by canonical URI.","ref":"Bonfire.Me.Users.html#by_canonical_uri/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_canonical_uri/1","doc":"> Bonfire.Me.Users.by_canonical_uri(\"http://example.com\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_canonical_uri/1-examples"},{"type":"function","title":"Bonfire.Me.Users.by_id/2","doc":"Gets a user by ID.","ref":"Bonfire.Me.Users.html#by_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_id/2","doc":"> Bonfire.Me.Users.by_id(\"user_id\")\n %Bonfire.Data.Identity.User{}\n\n > Bonfire.Me.Users.by_id([\"user_id\"])\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_user_and_account/2","doc":"Gets a user by username or user ID and account ID, useful for switch-user functionality. \n\nWill throw an error if any of the account's users is blocked instance-wide by admins.","ref":"Bonfire.Me.Users.html#by_user_and_account/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_user_and_account/2","doc":"> Bonfire.Me.Users.by_user_and_account(\"username\", \"account_id\")\n {:ok, %Bonfire.Data.Identity.User{}}","ref":"Bonfire.Me.Users.html#by_user_and_account/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_username/2","doc":"Gets a user by username.","ref":"Bonfire.Me.Users.html#by_username/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_username/2","doc":"> Bonfire.Me.Users.by_username(\"username\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_username/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_username!/1","doc":"Gets a user by username, raising an error if not found.","ref":"Bonfire.Me.Users.html#by_username!/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_username!/1","doc":"> Bonfire.Me.Users.by_username!(\"username\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_username!/1-examples"},{"type":"function","title":"Bonfire.Me.Users.changeset/4","doc":"","ref":"Bonfire.Me.Users.html#changeset/4"},{"type":"function","title":"Bonfire.Me.Users.check_active/1","doc":"Checks if users are active.","ref":"Bonfire.Me.Users.html#check_active/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.check_active/1","doc":"iex> Bonfire.Me.Users.check_active([user1])\n [{:ok, %Bonfire.Data.Identity.User{}}]\n\n iex> Bonfire.Me.Users.check_active(user)\n {:ok, %Bonfire.Data.Identity.User{}}","ref":"Bonfire.Me.Users.html#check_active/1-examples"},{"type":"function","title":"Bonfire.Me.Users.check_active!/1","doc":"","ref":"Bonfire.Me.Users.html#check_active!/1"},{"type":"function","title":"Bonfire.Me.Users.count/1","doc":"","ref":"Bonfire.Me.Users.html#count/1"},{"type":"function","title":"Bonfire.Me.Users.create/2","doc":"","ref":"Bonfire.Me.Users.html#create/2"},{"type":"function","title":"Bonfire.Me.Users.create_remote/1","doc":"Creates a remote user","ref":"Bonfire.Me.Users.html#create_remote/1"},{"type":"function","title":"Bonfire.Me.Users.enqueue_delete/1","doc":"","ref":"Bonfire.Me.Users.html#enqueue_delete/1"},{"type":"function","title":"Bonfire.Me.Users.federation_module/0","doc":"","ref":"Bonfire.Me.Users.html#federation_module/0"},{"type":"function","title":"Bonfire.Me.Users.fetch_current/1","doc":"Fetches the current user by ID.","ref":"Bonfire.Me.Users.html#fetch_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.fetch_current/1","doc":"> Bonfire.Me.Users.fetch_current(\"user_id\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#fetch_current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.flatten/1","doc":"","ref":"Bonfire.Me.Users.html#flatten/1"},{"type":"function","title":"Bonfire.Me.Users.format_actor/1","doc":"","ref":"Bonfire.Me.Users.html#format_actor/1"},{"type":"function","title":"Bonfire.Me.Users.get_current/1","doc":"Gets the current user by ID.","ref":"Bonfire.Me.Users.html#get_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.get_current/1","doc":"iex> Bonfire.Me.Users.get_current(nil)\n nil\n\n > Bonfire.Me.Users.get_current(\"user_id\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#get_current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.get_current/2","doc":"","ref":"Bonfire.Me.Users.html#get_current/2"},{"type":"function","title":"Bonfire.Me.Users.get_only_in_account/1","doc":"","ref":"Bonfire.Me.Users.html#get_only_in_account/1"},{"type":"function","title":"Bonfire.Me.Users.get_or_create_automod/0","doc":"","ref":"Bonfire.Me.Users.html#get_or_create_automod/0"},{"type":"function","title":"Bonfire.Me.Users.get_or_create_service_character/2","doc":"","ref":"Bonfire.Me.Users.html#get_or_create_service_character/2"},{"type":"function","title":"Bonfire.Me.Users.ids_by_account/1","doc":"","ref":"Bonfire.Me.Users.html#ids_by_account/1"},{"type":"function","title":"Bonfire.Me.Users.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Users.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Users.is_active?/1","doc":"Checks if a user is active.","ref":"Bonfire.Me.Users.html#is_active?/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.is_active?/1","doc":"> Bonfire.Me.Users.is_active?(user)","ref":"Bonfire.Me.Users.html#is_active?/1-examples"},{"type":"function","title":"Bonfire.Me.Users.is_first_user?/0","doc":"","ref":"Bonfire.Me.Users.html#is_first_user?/0"},{"type":"function","title":"Bonfire.Me.Users.list/1","doc":"","ref":"Bonfire.Me.Users.html#list/1"},{"type":"function","title":"Bonfire.Me.Users.list_admins/0","doc":"","ref":"Bonfire.Me.Users.html#list_admins/0"},{"type":"function","title":"Bonfire.Me.Users.list_boundarised_query/1","doc":"","ref":"Bonfire.Me.Users.html#list_boundarised_query/1"},{"type":"function","title":"Bonfire.Me.Users.list_paginated/1","doc":"","ref":"Bonfire.Me.Users.html#list_paginated/1"},{"type":"function","title":"Bonfire.Me.Users.make_admin/1","doc":"Grants a user superpowers.","ref":"Bonfire.Me.Users.html#make_admin/1"},{"type":"function","title":"Bonfire.Me.Users.make_user/3","doc":"","ref":"Bonfire.Me.Users.html#make_user/3"},{"type":"function","title":"Bonfire.Me.Users.maybe_count/1","doc":"","ref":"Bonfire.Me.Users.html#maybe_count/1"},{"type":"function","title":"Bonfire.Me.Users.maybe_index_user/1","doc":"","ref":"Bonfire.Me.Users.html#maybe_index_user/1"},{"type":"function","title":"Bonfire.Me.Users.query_module/0","doc":"","ref":"Bonfire.Me.Users.html#query_module/0"},{"type":"function","title":"Bonfire.Me.Users.remote_fetcher_id/0","doc":"","ref":"Bonfire.Me.Users.html#remote_fetcher_id/0"},{"type":"function","title":"Bonfire.Me.Users.revoke_admin/1","doc":"Revokes a user's superpowers.","ref":"Bonfire.Me.Users.html#revoke_admin/1"},{"type":"function","title":"Bonfire.Me.Users.schema_module/0","doc":"","ref":"Bonfire.Me.Users.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Users.search/2","doc":"Searches for users.","ref":"Bonfire.Me.Users.html#search/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.search/2","doc":"> Bonfire.Me.Users.search(\"username\")\n [%Bonfire.Data.Identity.User{}]","ref":"Bonfire.Me.Users.html#search/2-examples"},{"type":"function","title":"Bonfire.Me.Users.search_query/2","doc":"Query for searching for users.","ref":"Bonfire.Me.Users.html#search_query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.search_query/2","doc":"> Bonfire.Me.Users.search_query(\"search_term\")\n %Ecto.Query{}","ref":"Bonfire.Me.Users.html#search_query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.update/3","doc":"","ref":"Bonfire.Me.Users.html#update/3"},{"type":"function","title":"Bonfire.Me.Users.update_local_actor/2","doc":"","ref":"Bonfire.Me.Users.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Me.Users.update_remote_actor/2","doc":"Updates a remote user","ref":"Bonfire.Me.Users.html#update_remote_actor/2"},{"type":"type","title":"Bonfire.Me.Users.changeset_extra/0","doc":"","ref":"Bonfire.Me.Users.html#t:changeset_extra/0"},{"type":"type","title":"Bonfire.Me.Users.changeset_name/0","doc":"","ref":"Bonfire.Me.Users.html#t:changeset_name/0"},{"type":"module","title":"Bonfire.Me.Users.LiveHandler","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_account_session/1","doc":"This function disconnects the user and account, erases the session and CSRF token, and starts a new session","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_account_session/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_sockets/1","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_sockets/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_user_session/1","doc":"This function disconnects the user but leaves the account session alone","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_user_session/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Me.Users.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.to_tuple/1","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#to_tuple/1"},{"type":"module","title":"Bonfire.Me.Users.Queries","doc":"Queries for `Bonfire.Me.Users`","ref":"Bonfire.Me.Users.Queries.html"},{"type":"function","title":"Bonfire.Me.Users.Queries.admins/1","doc":"Returns the query to list admin users.","ref":"Bonfire.Me.Users.Queries.html#admins/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.base_by_id/1","doc":"","ref":"Bonfire.Me.Users.Queries.html#base_by_id/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.base_query/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#base_query/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_account/1","doc":"Finds users by account ID.","ref":"Bonfire.Me.Users.Queries.html#by_account/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_account/1","doc":"iex> Bonfire.Me.Users.Queries.by_account(\"account_id\")","ref":"Bonfire.Me.Users.Queries.html#by_account/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_canonical_uri/2","doc":"Finds a user by canonical URI.","ref":"Bonfire.Me.Users.Queries.html#by_canonical_uri/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_canonical_uri/2","doc":"iex> Bonfire.Me.Users.Queries.by_canonical_uri(\"canonical_uri\")","ref":"Bonfire.Me.Users.Queries.html#by_canonical_uri/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_id/2","doc":"Gets a user by ID.","ref":"Bonfire.Me.Users.Queries.html#by_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_id/2","doc":"iex> Bonfire.Me.Users.Queries.by_id(\"user_id\")","ref":"Bonfire.Me.Users.Queries.html#by_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_user_and_account/2","doc":"Finds a user by username or user ID and account ID.","ref":"Bonfire.Me.Users.Queries.html#by_user_and_account/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_user_and_account/2","doc":"iex> Bonfire.Me.Users.Queries.by_user_and_account(\"username_or_user_id\", \"account_id\")","ref":"Bonfire.Me.Users.Queries.html#by_user_and_account/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_username_or_id/2","doc":"Finds a user by username or ID.","ref":"Bonfire.Me.Users.Queries.html#by_username_or_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_username_or_id/2","doc":"iex> Bonfire.Me.Users.Queries.by_username_or_id(\"username_or_id\")","ref":"Bonfire.Me.Users.Queries.html#by_username_or_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_username_query/2","doc":"Finds a user by username.","ref":"Bonfire.Me.Users.Queries.html#by_username_query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_username_query/2","doc":"iex> Bonfire.Me.Users.Queries.by_username_query(\"username\")","ref":"Bonfire.Me.Users.Queries.html#by_username_query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.context_module/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#context_module/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.count/1","doc":"Counts the number of users.","ref":"Bonfire.Me.Users.Queries.html#count/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.count/1","doc":"iex> Bonfire.Me.Users.Queries.count(:all)\n\n iex> Bonfire.Me.Users.Queries.count(:local)\n\n iex> Bonfire.Me.Users.Queries.count(:remote)","ref":"Bonfire.Me.Users.Queries.html#count/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.current/1","doc":"Returns for the current user based on the user ID.","ref":"Bonfire.Me.Users.Queries.html#current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.current/1","doc":"iex> Bonfire.Me.Users.Queries.current(\"user_id\")","ref":"Bonfire.Me.Users.Queries.html#current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.current/2","doc":"Returns for the current user based on the user ID and account ID.","ref":"Bonfire.Me.Users.Queries.html#current/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.current/2","doc":"iex> Bonfire.Me.Users.Queries.current(\"user_id\", \"account_id\")","ref":"Bonfire.Me.Users.Queries.html#current/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.join_peered/1","doc":"","ref":"Bonfire.Me.Users.Queries.html#join_peered/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.list/1","doc":"Lists all users, or local or remote users, or users by instance ID.","ref":"Bonfire.Me.Users.Queries.html#list/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.list/1","doc":"iex> Bonfire.Me.Users.Queries.list(:all)\n\n iex> Bonfire.Me.Users.Queries.list(:local)\n\n iex> Bonfire.Me.Users.Queries.list(:remote)\n\n iex> Bonfire.Me.Users.Queries.list({:instance, \"instance_id\"})","ref":"Bonfire.Me.Users.Queries.html#list/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.query/2","doc":"Queries for a user based on the given filter.","ref":"Bonfire.Me.Users.Queries.html#query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.query/2","doc":"iex> Bonfire.Me.Users.Queries.query(id: \"some_id\")\n\n iex> Bonfire.Me.Users.Queries.query(username: \"some_username\")\n\n iex> Bonfire.Me.Users.Queries.query(:invalid_filter)\n {:error, \"Could not query\"}","ref":"Bonfire.Me.Users.Queries.html#query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.schema_module/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.search/2","doc":"Searches for users based on a text string.","ref":"Bonfire.Me.Users.Queries.html#search/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.search/2","doc":"iex> Bonfire.Me.Users.Queries.search(\"userna\")","ref":"Bonfire.Me.Users.Queries.html#search/2-examples"},{"type":"module","title":"Bonfire.Messages","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- DM\n- Group messaging","ref":"Bonfire.Messages.html"},{"type":"module","title":"Handy commands - Bonfire.Messages","doc":"","ref":"Bonfire.Messages.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Messages","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Messages.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Messages.ap_publish_activity/3","doc":"Publishes an activity to the ActivityPub.","ref":"Bonfire.Messages.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Messages.ap_publish_activity/3","doc":"iex> Bonfire.Messages.ap_publish_activity(subject, verb, message)","ref":"Bonfire.Messages.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Messages.ap_receive_activity/3","doc":"Receives an activity from ActivityPub.","ref":"Bonfire.Messages.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Messages.ap_receive_activity/3","doc":"iex> Bonfire.Messages.ap_receive_activity(creator, activity, object)","ref":"Bonfire.Messages.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Messages.changeset/3","doc":"","ref":"Bonfire.Messages.html#changeset/3"},{"type":"function","title":"Bonfire.Messages.draft/2","doc":"Save a new message as a draft (without sending it).","ref":"Bonfire.Messages.html#draft/2"},{"type":"function","title":"Examples - Bonfire.Messages.draft/2","doc":"iex> Bonfire.Messages.draft(creator, attrs)\n {:ok, %Message{}}","ref":"Bonfire.Messages.html#draft/2-examples"},{"type":"function","title":"Bonfire.Messages.federation_module/0","doc":"","ref":"Bonfire.Messages.html#federation_module/0"},{"type":"function","title":"Bonfire.Messages.filter/3","doc":"","ref":"Bonfire.Messages.html#filter/3"},{"type":"function","title":"Bonfire.Messages.list/3","doc":"Lists messages created by the user, excluding replies.","ref":"Bonfire.Messages.html#list/3"},{"type":"function","title":"Examples - Bonfire.Messages.list/3","doc":"iex> Bonfire.Messages.list(current_user)\n [%Message{}]","ref":"Bonfire.Messages.html#list/3-examples"},{"type":"function","title":"Bonfire.Messages.list/4","doc":"","ref":"Bonfire.Messages.html#list/4"},{"type":"function","title":"Bonfire.Messages.maybe_spam_check/3","doc":"","ref":"Bonfire.Messages.html#maybe_spam_check/3"},{"type":"function","title":"Bonfire.Messages.read/2","doc":"Attempt to read a message by its ID.","ref":"Bonfire.Messages.html#read/2"},{"type":"function","title":"Examples - Bonfire.Messages.read/2","doc":"iex> Bonfire.Messages.read(message_id, current_user: me)\n %Message{}","ref":"Bonfire.Messages.html#read/2-examples"},{"type":"function","title":"Bonfire.Messages.schema_module/0","doc":"","ref":"Bonfire.Messages.html#schema_module/0"},{"type":"function","title":"Bonfire.Messages.send/3","doc":"Sends a message to the specified recipients.","ref":"Bonfire.Messages.html#send/3"},{"type":"function","title":"Examples - Bonfire.Messages.send/3","doc":"iex> Bonfire.Messages.send(me, %{post_content: %{html_body: \"test message\"}}, to_user_id)","ref":"Bonfire.Messages.html#send/3-examples"},{"type":"module","title":"Bonfire.Messages.Fake","doc":"","ref":"Bonfire.Messages.Fake.html"},{"type":"function","title":"Bonfire.Messages.Fake.fake_comment!/4","doc":"","ref":"Bonfire.Messages.Fake.html#fake_comment!/4"},{"type":"function","title":"Bonfire.Messages.Fake.fake_post!/4","doc":"","ref":"Bonfire.Messages.Fake.html#fake_post!/4"},{"type":"function","title":"Bonfire.Messages.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Messages.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Messages.Integration","doc":"","ref":"Bonfire.Messages.Integration.html"},{"type":"function","title":"Bonfire.Messages.Integration.declared_extension/0","doc":"","ref":"Bonfire.Messages.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Messages.Integration.mailer/0","doc":"","ref":"Bonfire.Messages.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Messages.Integration.repo/0","doc":"","ref":"Bonfire.Messages.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Messages.LiveHandler","doc":"","ref":"Bonfire.Messages.LiveHandler.html"},{"type":"function","title":"Bonfire.Messages.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.list_threads/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#list_threads/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.live_more/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#live_more/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.send_message/2","doc":"","ref":"Bonfire.Messages.LiveHandler.html#send_message/2"},{"type":"macro","title":"Bonfire.Messages.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Messages.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_meta/4","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_meta/4"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_meta/5","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_meta/5"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_participants/4","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_participants/4"},{"type":"function","title":"Bonfire.Messages.LiveHandler.threads_widget/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#threads_widget/3"},{"type":"module","title":"Bonfire.OpenID","doc":"An extension to enable:\n- authenticating on Bonfire using an external identity using OpenID Connect\n- using your Bonfire identity to authenticate in other apps with OpenID Connect 1.0 or OAuth 2.0","ref":"Bonfire.OpenID.html"},{"type":"module","title":"Copyright and License - Bonfire.OpenID","doc":"Powered by these libraries: \n- https://hex.pm/packages/boruta (MIT license)\n- https://hex.pm/packages/openid_connect (MIT license)\n\nExtension copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenID.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.OpenID.Client","doc":"","ref":"Bonfire.OpenID.Client.html"},{"type":"function","title":"Bonfire.OpenID.Client.oauth2_providers/0","doc":"","ref":"Bonfire.OpenID.Client.html#oauth2_providers/0"},{"type":"function","title":"Bonfire.OpenID.Client.open_id_connect_providers/0","doc":"","ref":"Bonfire.OpenID.Client.html#open_id_connect_providers/0"},{"type":"function","title":"Bonfire.OpenID.Client.providers_authorization_urls/1","doc":"","ref":"Bonfire.OpenID.Client.html#providers_authorization_urls/1"},{"type":"module","title":"Bonfire.OpenID.Fake","doc":"","ref":"Bonfire.OpenID.Fake.html"},{"type":"function","title":"Bonfire.OpenID.Fake.fake_account!/2","doc":"","ref":"Bonfire.OpenID.Fake.html#fake_account!/2"},{"type":"function","title":"Bonfire.OpenID.Fake.fake_user!/2","doc":"","ref":"Bonfire.OpenID.Fake.html#fake_user!/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.AuthRequired","doc":"","ref":"Bonfire.OpenID.Plugs.AuthRequired.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.AuthRequired.require_auth/2","doc":"","ref":"Bonfire.OpenID.Plugs.AuthRequired.html#require_auth/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.Authorize","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.authorize/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#authorize/2"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.load_authorization/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#load_authorization/2"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.maybe_load_authorization/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#maybe_load_authorization/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.ClientID","doc":"","ref":"Bonfire.OpenID.Plugs.ClientID.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.ClientID.validate_client_id/2","doc":"","ref":"Bonfire.OpenID.Plugs.ClientID.html#validate_client_id/2"},{"type":"module","title":"Bonfire.OpenID.Provider.ClientApps","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get/2","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get_or_new/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get_or_new/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get_or_new/2","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get_or_new/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.init_test_client_app/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#init_test_client_app/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_active_tokens/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_active_tokens/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_clients/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_clients/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_scopes/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_scopes/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.new/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#new/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.new/2","doc":"Define an OAuth client app, providing a name and redirect URI(s)","ref":"Bonfire.OpenID.Provider.ClientApps.html#new/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.prepare_redirect_uri/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#prepare_redirect_uri/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.prepare_redirect_uris/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#prepare_redirect_uris/1"},{"type":"module","title":"Bonfire.OpenID.Provider.OAuth","doc":"","ref":"Bonfire.OpenID.Provider.OAuth.html"},{"type":"function","title":"Bonfire.OpenID.Provider.OAuth.redirect_uri_validate/1","doc":"","ref":"Bonfire.OpenID.Provider.OAuth.html#redirect_uri_validate/1"},{"type":"module","title":"Bonfire.OpenID.RuntimeConfig","doc":"","ref":"Bonfire.OpenID.RuntimeConfig.html"},{"type":"function","title":"Bonfire.OpenID.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.OpenID.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.OpenID.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.OpenID.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.OpenID.Web.Routes","doc":"","ref":"Bonfire.OpenID.Web.Routes.html"},{"type":"function","title":"Bonfire.OpenID.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.OpenID.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.OpenScience","doc":"See https://bonfirenetworks.org/app/open-science/","ref":"Bonfire.OpenScience.html"},{"type":"module","title":"Copyright and License - Bonfire.OpenScience","doc":"Copyright (c) 2024 Bonfire and Open Science Network Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenScience.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.OpenScience.repo/0","doc":"","ref":"Bonfire.OpenScience.html#repo/0"},{"type":"function","title":"Bonfire.OpenScience.user_aliases/1","doc":"","ref":"Bonfire.OpenScience.html#user_aliases/1"},{"type":"module","title":"Bonfire.OpenScience.APIs","doc":"","ref":"Bonfire.OpenScience.APIs.html"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch/2","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch/2"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_crossref/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_crossref/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_for_all_known_scientists/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_for_all_known_scientists/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_latest/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_latest/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_record/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_record/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_works/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_works/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.find_orcid_id/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#find_orcid_id/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.is_doi?/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#is_doi?/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.is_pub_id_or_uri_match?/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#is_pub_id_or_uri_match?/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.maybe_fetch/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#maybe_fetch/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.open_alex_fetch_topics/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#open_alex_fetch_topics/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_and_uri_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_and_uri_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_matcher/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_matcher/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_uri_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_uri_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.trigger/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#trigger/3"},{"type":"module","title":"Bonfire.OpenScience.Fake","doc":"","ref":"Bonfire.OpenScience.Fake.html"},{"type":"module","title":"Bonfire.OpenScience.RuntimeConfig","doc":"","ref":"Bonfire.OpenScience.RuntimeConfig.html"},{"type":"function","title":"Bonfire.OpenScience.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.OpenScience.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.OpenScience.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.OpenScience.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.OpenScience.Web.Routes","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declare_routes/0"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declared_extension/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declared_extension/0"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declared_nav/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declared_nav/0"},{"type":"module","title":"Bonfire.Pages","doc":"Basic CMS","ref":"Bonfire.Pages.html"},{"type":"module","title":"Copyright and License - Bonfire.Pages","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Pages.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Pages.create/1","doc":"","ref":"Bonfire.Pages.html#create/1"},{"type":"function","title":"Bonfire.Pages.get/2","doc":"","ref":"Bonfire.Pages.html#get/2"},{"type":"function","title":"Bonfire.Pages.list_paginated/2","doc":"","ref":"Bonfire.Pages.html#list_paginated/2"},{"type":"function","title":"Bonfire.Pages.one/2","doc":"","ref":"Bonfire.Pages.html#one/2"},{"type":"function","title":"Bonfire.Pages.page_path/2","doc":"","ref":"Bonfire.Pages.html#page_path/2"},{"type":"function","title":"Bonfire.Pages.query/2","doc":"","ref":"Bonfire.Pages.html#query/2"},{"type":"function","title":"Bonfire.Pages.run_epic/4","doc":"","ref":"Bonfire.Pages.html#run_epic/4"},{"type":"function","title":"Bonfire.Pages.slug/1","doc":"","ref":"Bonfire.Pages.html#slug/1"},{"type":"function","title":"Bonfire.Pages.summary/1","doc":"","ref":"Bonfire.Pages.html#summary/1"},{"type":"module","title":"Bonfire.Pages.Acts.Page.Create","doc":"Creates a changeset for publishing a page\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n * `:page_attrs` (configurable) - attrs to create the page from, required.\n * `:page_id` (configurable) - id to use for the created page (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:page_id`\n * `:as` - key to assign changeset to, default: `:page`.\n * `:attrs` - epic options key to find the attributes at, default: `:page_attrs`.","ref":"Bonfire.Pages.Acts.Page.Create.html"},{"type":"module","title":"Bonfire.Pages.Acts.Section.Upsert","doc":"Creates a changeset for publishing a section\n\nEpic Options:\n * `:current_user` - user that will create the section, required.\n * `:section_attrs` (configurable) - attrs to create the section from, required.\n * `:section_id` (configurable) - id to use for the created section (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:section_id`\n * `:as` - key to assign changeset to, default: `:section`.\n * `:attrs` - epic options key to find the attributes at, default: `:section_attrs`.","ref":"Bonfire.Pages.Acts.Section.Upsert.html"},{"type":"module","title":"Bonfire.Pages.LiveHandler","doc":"","ref":"Bonfire.Pages.LiveHandler.html"},{"type":"function","title":"Bonfire.Pages.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Pages.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Pages.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Pages.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Pages.Page","doc":"","ref":"Bonfire.Pages.Page.html"},{"type":"function","title":"Bonfire.Pages.Page.changeset/2","doc":"","ref":"Bonfire.Pages.Page.html#changeset/2"},{"type":"function","title":"Bonfire.Pages.Page.delete/2","doc":"","ref":"Bonfire.Pages.Page.html#delete/2"},{"type":"function","title":"Bonfire.Pages.Page.get/3","doc":"","ref":"Bonfire.Pages.Page.html#get/3"},{"type":"function","title":"Bonfire.Pages.Page.put/3","doc":"","ref":"Bonfire.Pages.Page.html#put/3"},{"type":"module","title":"Bonfire.Pages.Section","doc":"","ref":"Bonfire.Pages.Section.html"},{"type":"function","title":"Bonfire.Pages.Section.changeset/2","doc":"","ref":"Bonfire.Pages.Section.html#changeset/2"},{"type":"function","title":"Bonfire.Pages.Section.delete/2","doc":"","ref":"Bonfire.Pages.Section.html#delete/2"},{"type":"function","title":"Bonfire.Pages.Section.get/3","doc":"","ref":"Bonfire.Pages.Section.html#get/3"},{"type":"function","title":"Bonfire.Pages.Section.put/3","doc":"","ref":"Bonfire.Pages.Section.html#put/3"},{"type":"module","title":"Bonfire.Pages.Sections","doc":"","ref":"Bonfire.Pages.Sections.html"},{"type":"function","title":"Bonfire.Pages.Sections.get/2","doc":"","ref":"Bonfire.Pages.Sections.html#get/2"},{"type":"function","title":"Bonfire.Pages.Sections.list_paginated/2","doc":"","ref":"Bonfire.Pages.Sections.html#list_paginated/2"},{"type":"function","title":"Bonfire.Pages.Sections.one/2","doc":"","ref":"Bonfire.Pages.Sections.html#one/2"},{"type":"function","title":"Bonfire.Pages.Sections.put_in_page/3","doc":"","ref":"Bonfire.Pages.Sections.html#put_in_page/3"},{"type":"function","title":"Bonfire.Pages.Sections.query/2","doc":"","ref":"Bonfire.Pages.Sections.html#query/2"},{"type":"function","title":"Bonfire.Pages.Sections.remove_from_page/2","doc":"","ref":"Bonfire.Pages.Sections.html#remove_from_page/2"},{"type":"function","title":"Bonfire.Pages.Sections.upsert/1","doc":"","ref":"Bonfire.Pages.Sections.html#upsert/1"},{"type":"module","title":"Bonfire.Pages.Web.Routes","doc":"","ref":"Bonfire.Pages.Web.Routes.html"},{"type":"function","title":"Bonfire.Pages.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Pages.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Poll","doc":"An extensions for asking questions, collecting options, and conducting ranked voting on [Bonfire](https://bonfire.cafe/)","ref":"Bonfire.Poll.html"},{"type":"module","title":"Copyright and License - Bonfire.Poll","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Poll.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Poll.repo/0","doc":"","ref":"Bonfire.Poll.html#repo/0"},{"type":"module","title":"Bonfire.Poll.Acts.Choices.Upsert","doc":"Creates a changeset for publishing choice(s) for a question\n\nEpic Options:\n * `:current_user` - user that will create the choice, required.\n * `:choice_attrs` (configurable) - attrs to create the choice from, required.\n * `:choice_id` (configurable) - id to use for the created choice (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:choice_id`\n * `:as` - key to assign changeset to, default: `:choice`.\n * `:attrs` - epic options key to find the attributes at, default: `:choice_attrs`.","ref":"Bonfire.Poll.Acts.Choices.Upsert.html"},{"type":"module","title":"Bonfire.Poll.Choice","doc":"","ref":"Bonfire.Poll.Choice.html"},{"type":"function","title":"Bonfire.Poll.Choice.changeset/2","doc":"","ref":"Bonfire.Poll.Choice.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Choice.delete/2","doc":"","ref":"Bonfire.Poll.Choice.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Choice.get/3","doc":"","ref":"Bonfire.Poll.Choice.html#get/3"},{"type":"function","title":"Bonfire.Poll.Choice.put/3","doc":"","ref":"Bonfire.Poll.Choice.html#put/3"},{"type":"module","title":"Bonfire.Poll.Choices","doc":"","ref":"Bonfire.Poll.Choices.html"},{"type":"function","title":"Bonfire.Poll.Choices.put_choice/3","doc":"","ref":"Bonfire.Poll.Choices.html#put_choice/3"},{"type":"function","title":"Bonfire.Poll.Choices.simple_create_and_put/4","doc":"","ref":"Bonfire.Poll.Choices.html#simple_create_and_put/4"},{"type":"module","title":"Bonfire.Poll.Fake","doc":"","ref":"Bonfire.Poll.Fake.html"},{"type":"module","title":"Bonfire.Poll.LiveHandler","doc":"","ref":"Bonfire.Poll.LiveHandler.html"},{"type":"function","title":"Bonfire.Poll.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Poll.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Poll.LiveHandler.negative_score_info/0","doc":"","ref":"Bonfire.Poll.LiveHandler.html#negative_score_info/0"},{"type":"macro","title":"Bonfire.Poll.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Poll.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Poll.Question","doc":"","ref":"Bonfire.Poll.Question.html"},{"type":"function","title":"Bonfire.Poll.Question.delete/2","doc":"","ref":"Bonfire.Poll.Question.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Question.get/3","doc":"","ref":"Bonfire.Poll.Question.html#get/3"},{"type":"function","title":"Bonfire.Poll.Question.put/3","doc":"","ref":"Bonfire.Poll.Question.html#put/3"},{"type":"module","title":"Bonfire.Poll.Question.Create","doc":"Creates a changeset for publishing a page\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n * `:page_attrs` (configurable) - attrs to create the page from, required.\n * `:page_id` (configurable) - id to use for the created page (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:page_id`\n * `:as` - key to assign changeset to, default: `:page`.\n * `:attrs` - epic options key to find the attributes at, default: `:page_attrs`.","ref":"Bonfire.Poll.Question.Create.html"},{"type":"module","title":"Bonfire.Poll.Questions","doc":"","ref":"Bonfire.Poll.Questions.html"},{"type":"function","title":"Bonfire.Poll.Questions.changeset/2","doc":"","ref":"Bonfire.Poll.Questions.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Questions.create/1","doc":"","ref":"Bonfire.Poll.Questions.html#create/1"},{"type":"function","title":"Bonfire.Poll.Questions.create_simple/1","doc":"","ref":"Bonfire.Poll.Questions.html#create_simple/1"},{"type":"function","title":"Bonfire.Poll.Questions.list_by/2","doc":"List posts created by the user and which are in their outbox, which are not replies","ref":"Bonfire.Poll.Questions.html#list_by/2"},{"type":"function","title":"Bonfire.Poll.Questions.list_paginated/2","doc":"List posts with pagination","ref":"Bonfire.Poll.Questions.html#list_paginated/2"},{"type":"function","title":"Bonfire.Poll.Questions.query/2","doc":"","ref":"Bonfire.Poll.Questions.html#query/2"},{"type":"function","title":"Bonfire.Poll.Questions.query_paginated/2","doc":"Query posts with pagination","ref":"Bonfire.Poll.Questions.html#query_paginated/2"},{"type":"function","title":"Bonfire.Poll.Questions.read/2","doc":"","ref":"Bonfire.Poll.Questions.html#read/2"},{"type":"function","title":"Bonfire.Poll.Questions.run_epic/4","doc":"","ref":"Bonfire.Poll.Questions.html#run_epic/4"},{"type":"module","title":"Bonfire.Poll.RuntimeConfig","doc":"","ref":"Bonfire.Poll.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Poll.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Poll.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Poll.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Poll.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Poll.Vote","doc":"","ref":"Bonfire.Poll.Vote.html"},{"type":"function","title":"Bonfire.Poll.Vote.changeset/2","doc":"","ref":"Bonfire.Poll.Vote.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Vote.delete/2","doc":"","ref":"Bonfire.Poll.Vote.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Vote.get/3","doc":"","ref":"Bonfire.Poll.Vote.html#get/3"},{"type":"function","title":"Bonfire.Poll.Vote.put/3","doc":"","ref":"Bonfire.Poll.Vote.html#put/3"},{"type":"module","title":"Bonfire.Poll.Votes","doc":"","ref":"Bonfire.Poll.Votes.html"},{"type":"function","title":"Bonfire.Poll.Votes.by_voter/2","doc":"","ref":"Bonfire.Poll.Votes.html#by_voter/2"},{"type":"function","title":"Bonfire.Poll.Votes.calculate_total/3","doc":"","ref":"Bonfire.Poll.Votes.html#calculate_total/3"},{"type":"function","title":"Bonfire.Poll.Votes.count/2","doc":"","ref":"Bonfire.Poll.Votes.html#count/2"},{"type":"function","title":"Bonfire.Poll.Votes.get/3","doc":"","ref":"Bonfire.Poll.Votes.html#get/3"},{"type":"function","title":"Bonfire.Poll.Votes.get!/3","doc":"","ref":"Bonfire.Poll.Votes.html#get!/3"},{"type":"function","title":"Bonfire.Poll.Votes.get_average_base_score/2","doc":"","ref":"Bonfire.Poll.Votes.html#get_average_base_score/2"},{"type":"function","title":"Bonfire.Poll.Votes.get_average_emoji/4","doc":"","ref":"Bonfire.Poll.Votes.html#get_average_emoji/4"},{"type":"function","title":"Bonfire.Poll.Votes.get_score/2","doc":"","ref":"Bonfire.Poll.Votes.html#get_score/2"},{"type":"function","title":"Bonfire.Poll.Votes.query/2","doc":"","ref":"Bonfire.Poll.Votes.html#query/2"},{"type":"function","title":"Bonfire.Poll.Votes.register_vote_choice/4","doc":"","ref":"Bonfire.Poll.Votes.html#register_vote_choice/4"},{"type":"function","title":"Bonfire.Poll.Votes.scores/0","doc":"","ref":"Bonfire.Poll.Votes.html#scores/0"},{"type":"function","title":"Bonfire.Poll.Votes.send_vote_activity/4","doc":"","ref":"Bonfire.Poll.Votes.html#send_vote_activity/4"},{"type":"function","title":"Bonfire.Poll.Votes.vote/4","doc":"","ref":"Bonfire.Poll.Votes.html#vote/4"},{"type":"module","title":"Bonfire.Poll.Web.Routes","doc":"","ref":"Bonfire.Poll.Web.Routes.html"},{"type":"function","title":"Bonfire.Poll.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Poll.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Posts","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Creating and reading posts","ref":"Bonfire.Posts.html"},{"type":"module","title":"Handy commands - Bonfire.Posts","doc":"","ref":"Bonfire.Posts.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Posts","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Posts.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Posts.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a post.","ref":"Bonfire.Posts.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Posts.ap_publish_activity/3","doc":"- `subject`: The subject of the activity.\n- `verb`: The verb of the activity.\n- `post`: The post to publish.","ref":"Bonfire.Posts.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.ap_publish_activity/3","doc":"`{:ok, activity}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Posts.ap_publish_activity/3","doc":"iex> Bonfire.Posts.ap_publish_activity(user, :create, post)\n {:ok, %ActivityPub.Activity{}}","ref":"Bonfire.Posts.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Posts.ap_receive_activity/4","doc":"Receives an incoming ActivityPub post.","ref":"Bonfire.Posts.html#ap_receive_activity/4"},{"type":"function","title":"Parameters - Bonfire.Posts.ap_receive_activity/4","doc":"- `creator`: The creator of the post.\n- `activity`: The ActivityPub activity.\n- `object`: The ActivityPub object.\n- `circles`: The circles to publish to (default: `[]`).","ref":"Bonfire.Posts.html#ap_receive_activity/4-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.ap_receive_activity/4","doc":"`{:ok, post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#ap_receive_activity/4-returns"},{"type":"function","title":"Examples - Bonfire.Posts.ap_receive_activity/4","doc":"iex> Bonfire.Posts.ap_receive_activity(creator, activity, object)\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#ap_receive_activity/4-examples"},{"type":"function","title":"Bonfire.Posts.changeset/4","doc":"Creates a changeset for a post.","ref":"Bonfire.Posts.html#changeset/4"},{"type":"function","title":"Parameters - Bonfire.Posts.changeset/4","doc":"- `action`: The action to perform (`:create`).\n- `attrs`: Attributes for the post.","ref":"Bonfire.Posts.html#changeset/4-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.changeset/4","doc":"A `%Changeset{}` for the post.","ref":"Bonfire.Posts.html#changeset/4-returns"},{"type":"function","title":"Examples - Bonfire.Posts.changeset/4","doc":"iex> Bonfire.Posts.changeset(:create, %{title: \"New Post\"})","ref":"Bonfire.Posts.html#changeset/4-examples"},{"type":"function","title":"Bonfire.Posts.count_total/0","doc":"","ref":"Bonfire.Posts.html#count_total/0"},{"type":"function","title":"Bonfire.Posts.delete/2","doc":"Deletes a post.\n\nNote: You should use `Bonfire.Social.Objects.delete/2` instead.","ref":"Bonfire.Posts.html#delete/2"},{"type":"function","title":"Parameters - Bonfire.Posts.delete/2","doc":"- `object`: The post object to delete.\n- `opts`: Options for deleting the post.","ref":"Bonfire.Posts.html#delete/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.delete/2","doc":"`{:ok, deleted_post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#delete/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.delete/2","doc":"iex> Bonfire.Posts.delete(post)\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#delete/2-examples"},{"type":"function","title":"Bonfire.Posts.draft/2","doc":"TODO: Creates a draft post. Not implemented yet.","ref":"Bonfire.Posts.html#draft/2"},{"type":"function","title":"Parameters - Bonfire.Posts.draft/2","doc":"- `creator`: The creator of the draft post.\n- `attrs`: Attributes for the draft post.","ref":"Bonfire.Posts.html#draft/2-parameters"},{"type":"function","title":"Bonfire.Posts.federation_module/0","doc":"","ref":"Bonfire.Posts.html#federation_module/0"},{"type":"function","title":"Bonfire.Posts.indexing_object_format/2","doc":"Formats a post for search indexing.","ref":"Bonfire.Posts.html#indexing_object_format/2"},{"type":"function","title":"Parameters - Bonfire.Posts.indexing_object_format/2","doc":"- `post`: The post to format.\n- `opts`: Formatting options.","ref":"Bonfire.Posts.html#indexing_object_format/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.indexing_object_format/2","doc":"A map with formatted post data for indexing.","ref":"Bonfire.Posts.html#indexing_object_format/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.indexing_object_format/2","doc":"iex> Bonfire.Posts.indexing_object_format(post)\n %{id: \"post_123\", index_type: \"Bonfire.Data.Social.Post\", post_content: %{}, created: %{}, tags: []}","ref":"Bonfire.Posts.html#indexing_object_format/2-examples"},{"type":"function","title":"Bonfire.Posts.list_by/2","doc":"Lists posts created by a user that are in their outbox and are not replies.","ref":"Bonfire.Posts.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Posts.list_by/2","doc":"- `by_user`: The user whose posts to list.\n- `opts`: Options for listing posts.","ref":"Bonfire.Posts.html#list_by/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.list_by/2","doc":"A list of posts.","ref":"Bonfire.Posts.html#list_by/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.list_by/2","doc":"iex> Bonfire.Posts.list_by(user)\n [%Post{}, %Post{}]","ref":"Bonfire.Posts.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Posts.list_paginated/2","doc":"Lists posts with pagination.","ref":"Bonfire.Posts.html#list_paginated/2"},{"type":"function","title":"Parameters - Bonfire.Posts.list_paginated/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Options for pagination.","ref":"Bonfire.Posts.html#list_paginated/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.list_paginated/2","doc":"A paginated list of posts.","ref":"Bonfire.Posts.html#list_paginated/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.list_paginated/2","doc":"iex> Bonfire.Posts.list_paginated([])\n %{edges: [%Post{}, %Post{}], page_info: %{}}","ref":"Bonfire.Posts.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Posts.prepare_post_attrs/1","doc":"","ref":"Bonfire.Posts.html#prepare_post_attrs/1"},{"type":"function","title":"Bonfire.Posts.publish/1","doc":"Publishes a post.","ref":"Bonfire.Posts.html#publish/1"},{"type":"function","title":"Parameters - Bonfire.Posts.publish/1","doc":"- `opts`: Options for publishing the post.","ref":"Bonfire.Posts.html#publish/1-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.publish/1","doc":"`{:ok, post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#publish/1-returns"},{"type":"function","title":"Examples - Bonfire.Posts.publish/1","doc":"iex> Bonfire.Posts.publish(\n current_user: me, \n boundary: \"public\",\n post_attrs: %{\n post_content: %{\n name: \"test post title\",\n html_body: \" epic html message \"\n }\n })\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#publish/1-examples"},{"type":"function","title":"Bonfire.Posts.query/2","doc":"Queries posts.","ref":"Bonfire.Posts.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Posts.query/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Query options.","ref":"Bonfire.Posts.html#query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.query/2","doc":"An Ecto query for posts.","ref":"Bonfire.Posts.html#query/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.query/2","doc":"iex> Bonfire.Posts.query([id: \"post_123\"])\n #Ecto.Query<>","ref":"Bonfire.Posts.html#query/2-examples"},{"type":"function","title":"Bonfire.Posts.query_module/0","doc":"","ref":"Bonfire.Posts.html#query_module/0"},{"type":"function","title":"Bonfire.Posts.query_paginated/2","doc":"Queries posts with pagination.","ref":"Bonfire.Posts.html#query_paginated/2"},{"type":"function","title":"Parameters - Bonfire.Posts.query_paginated/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Options for pagination.","ref":"Bonfire.Posts.html#query_paginated/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.query_paginated/2","doc":"A paginated query for posts.","ref":"Bonfire.Posts.html#query_paginated/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.query_paginated/2","doc":"iex> Bonfire.Posts.query_paginated([])\n #Ecto.Query<>","ref":"Bonfire.Posts.html#query_paginated/2-examples"},{"type":"function","title":"Bonfire.Posts.read/2","doc":"Attempts to fetch a post by its ID, if the current user has permission to read it.","ref":"Bonfire.Posts.html#read/2"},{"type":"function","title":"Parameters - Bonfire.Posts.read/2","doc":"- `post_id`: The ID of the post to read.\n- `opts`: Options, incl. current user.","ref":"Bonfire.Posts.html#read/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.read/2","doc":"The post if found, `nil` otherwise.","ref":"Bonfire.Posts.html#read/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.read/2","doc":"iex> Bonfire.Posts.read(\"post_123\")\n %Post{}","ref":"Bonfire.Posts.html#read/2-examples"},{"type":"function","title":"Bonfire.Posts.run_epic/3","doc":"Runs a series of post `Bonfire.Epics` operations based on configured acts for this module.","ref":"Bonfire.Posts.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Posts.run_epic/3","doc":"- `type`: The type of epic operation to run.\n- `options`: Options for the epic operation.\n- `on`: The key in the epic assigns to return (default: `:post`).","ref":"Bonfire.Posts.html#run_epic/3-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.run_epic/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#run_epic/3-returns"},{"type":"function","title":"Examples - Bonfire.Posts.run_epic/3","doc":"iex> Bonfire.Posts.run_epic(:publish, [])\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#run_epic/3-examples"},{"type":"function","title":"Bonfire.Posts.schema_module/0","doc":"","ref":"Bonfire.Posts.html#schema_module/0"},{"type":"function","title":"Bonfire.Posts.search/2","doc":"Searches for posts.","ref":"Bonfire.Posts.html#search/2"},{"type":"function","title":"Parameters - Bonfire.Posts.search/2","doc":"- `search`: The search term to look for in the title, summary, or body.\n- `opts`: Search options.","ref":"Bonfire.Posts.html#search/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.search/2","doc":"A list of matching posts.","ref":"Bonfire.Posts.html#search/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.search/2","doc":"iex> Bonfire.Posts.search(\"example\")\n [%Post{}, %Post{}]","ref":"Bonfire.Posts.html#search/2-examples"},{"type":"function","title":"Bonfire.Posts.search_query/2","doc":"","ref":"Bonfire.Posts.html#search_query/2"},{"type":"module","title":"Bonfire.Posts.Acts.Posts.Publish","doc":"Creates a changeset for publishing a post\n\nEpic Options:\n * `:current_user` - user that will create the post, required.\n * `:post_attrs` (configurable) - attrs to create the post from, required.\n * `:post_id` (configurable) - id to use for the created post (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:post_id`\n * `:as` - key to assign changeset to, default: `:post`.\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.","ref":"Bonfire.Posts.Acts.Posts.Publish.html"},{"type":"module","title":"Bonfire.Posts.Fake","doc":"","ref":"Bonfire.Posts.Fake.html"},{"type":"function","title":"Bonfire.Posts.Fake.fake_comment!/4","doc":"","ref":"Bonfire.Posts.Fake.html#fake_comment!/4"},{"type":"function","title":"Bonfire.Posts.Fake.fake_post!/4","doc":"","ref":"Bonfire.Posts.Fake.html#fake_post!/4"},{"type":"function","title":"Bonfire.Posts.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Posts.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Posts.Integration","doc":"","ref":"Bonfire.Posts.Integration.html"},{"type":"function","title":"Bonfire.Posts.Integration.declared_extension/0","doc":"","ref":"Bonfire.Posts.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Posts.Integration.mailer/0","doc":"","ref":"Bonfire.Posts.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Posts.Integration.repo/0","doc":"","ref":"Bonfire.Posts.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Posts.LiveHandler","doc":"","ref":"Bonfire.Posts.LiveHandler.html"},{"type":"function","title":"Bonfire.Posts.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Posts.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Posts.LiveHandler.post_changeset/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#post_changeset/2"},{"type":"macro","title":"Bonfire.Posts.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Posts.LiveHandler.write_feedback/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#write_feedback/2"},{"type":"module","title":"Bonfire.Quantify","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Units\n- Measures","ref":"Bonfire.Quantify.html"},{"type":"module","title":"Handy commands - Bonfire.Quantify","doc":"","ref":"Bonfire.Quantify.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Quantify","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Quantify.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.Quantify.GraphQL.Hydration","doc":"","ref":"Bonfire.Quantify.GraphQL.Hydration.html"},{"type":"function","title":"Bonfire.Quantify.GraphQL.Hydration.hydrate/0","doc":"","ref":"Bonfire.Quantify.GraphQL.Hydration.html#hydrate/0"},{"type":"module","title":"Bonfire.Quantify.Measure","doc":"","ref":"Bonfire.Quantify.Measure.html"},{"type":"function","title":"Bonfire.Quantify.Measure.copy/1","doc":"Copy the attributes of a measure required to create a new one.","ref":"Bonfire.Quantify.Measure.html#copy/1"},{"type":"function","title":"Bonfire.Quantify.Measure.create_changeset/3","doc":"","ref":"Bonfire.Quantify.Measure.html#create_changeset/3"},{"type":"function","title":"Bonfire.Quantify.Measure.delete/2","doc":"","ref":"Bonfire.Quantify.Measure.html#delete/2"},{"type":"function","title":"Bonfire.Quantify.Measure.get/3","doc":"","ref":"Bonfire.Quantify.Measure.html#get/3"},{"type":"function","title":"Bonfire.Quantify.Measure.put/3","doc":"","ref":"Bonfire.Quantify.Measure.html#put/3"},{"type":"function","title":"Bonfire.Quantify.Measure.update_changeset/2","doc":"","ref":"Bonfire.Quantify.Measure.html#update_changeset/2"},{"type":"function","title":"Bonfire.Quantify.Measure.validate_changeset/2","doc":"","ref":"Bonfire.Quantify.Measure.html#validate_changeset/2"},{"type":"type","title":"Bonfire.Quantify.Measure.t/0","doc":"","ref":"Bonfire.Quantify.Measure.html#t:t/0"},{"type":"module","title":"Bonfire.Quantify.Measures","doc":"","ref":"Bonfire.Quantify.Measures.html"},{"type":"function","title":"Bonfire.Quantify.Measures.ap_publish_activity/3","doc":"","ref":"Bonfire.Quantify.Measures.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Quantify.Measures.ap_receive_activity/3","doc":"","ref":"Bonfire.Quantify.Measures.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Quantify.Measures.create/2","doc":"","ref":"Bonfire.Quantify.Measures.html#create/2"},{"type":"function","title":"Bonfire.Quantify.Measures.create/3","doc":"","ref":"Bonfire.Quantify.Measures.html#create/3"},{"type":"function","title":"Bonfire.Quantify.Measures.cursor/0","doc":"","ref":"Bonfire.Quantify.Measures.html#cursor/0"},{"type":"function","title":"Bonfire.Quantify.Measures.federation_module/0","doc":"","ref":"Bonfire.Quantify.Measures.html#federation_module/0"},{"type":"function","title":"Bonfire.Quantify.Measures.many/1","doc":"Retrieves a list of collections by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Measures.html#many/1"},{"type":"function","title":"Bonfire.Quantify.Measures.one/1","doc":"Retrieves a single collection by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Measures.html#one/1"},{"type":"function","title":"Bonfire.Quantify.Measures.test_cursor/0","doc":"","ref":"Bonfire.Quantify.Measures.html#test_cursor/0"},{"type":"function","title":"Bonfire.Quantify.Measures.update/2","doc":"","ref":"Bonfire.Quantify.Measures.html#update/2"},{"type":"module","title":"Bonfire.Quantify.Measures.Queries","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.filter/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.inc_quantity/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#inc_quantity/2"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.join_to/3","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.queries/5","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.query/1","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#query/1"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.query/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#query/2"},{"type":"module","title":"Bonfire.Quantify.Simulate","doc":"","ref":"Bonfire.Quantify.Simulate.html"},{"type":"function","title":"Bonfire.Quantify.Simulate.fake_measure!/3","doc":"","ref":"Bonfire.Quantify.Simulate.html#fake_measure!/3"},{"type":"function","title":"Bonfire.Quantify.Simulate.fake_unit!/3","doc":"","ref":"Bonfire.Quantify.Simulate.html#fake_unit!/3"},{"type":"function","title":"Bonfire.Quantify.Simulate.measure/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#measure/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.measure_input/2","doc":"","ref":"Bonfire.Quantify.Simulate.html#measure_input/2"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_input/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit_input/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_name/0","doc":"A unit","ref":"Bonfire.Quantify.Simulate.html#unit_name/0"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_symbol/0","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit_symbol/0"},{"type":"module","title":"Bonfire.Quantify.Unit","doc":"","ref":"Bonfire.Quantify.Unit.html"},{"type":"function","title":"Bonfire.Quantify.Unit.create_changeset/2","doc":"","ref":"Bonfire.Quantify.Unit.html#create_changeset/2"},{"type":"function","title":"Bonfire.Quantify.Unit.create_changeset/3","doc":"","ref":"Bonfire.Quantify.Unit.html#create_changeset/3"},{"type":"function","title":"Bonfire.Quantify.Unit.delete/2","doc":"","ref":"Bonfire.Quantify.Unit.html#delete/2"},{"type":"function","title":"Bonfire.Quantify.Unit.get/3","doc":"","ref":"Bonfire.Quantify.Unit.html#get/3"},{"type":"function","title":"Bonfire.Quantify.Unit.put/3","doc":"","ref":"Bonfire.Quantify.Unit.html#put/3"},{"type":"function","title":"Bonfire.Quantify.Unit.update_changeset/2","doc":"","ref":"Bonfire.Quantify.Unit.html#update_changeset/2"},{"type":"type","title":"Bonfire.Quantify.Unit.t/0","doc":"","ref":"Bonfire.Quantify.Unit.html#t:t/0"},{"type":"module","title":"Bonfire.Quantify.Units","doc":"","ref":"Bonfire.Quantify.Units.html"},{"type":"function","title":"Bonfire.Quantify.Units.ap_publish_activity/3","doc":"","ref":"Bonfire.Quantify.Units.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Quantify.Units.ap_receive_activity/3","doc":"","ref":"Bonfire.Quantify.Units.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Quantify.Units.create/2","doc":"","ref":"Bonfire.Quantify.Units.html#create/2"},{"type":"function","title":"Bonfire.Quantify.Units.create/3","doc":"","ref":"Bonfire.Quantify.Units.html#create/3"},{"type":"function","title":"Bonfire.Quantify.Units.cursor/0","doc":"","ref":"Bonfire.Quantify.Units.html#cursor/0"},{"type":"function","title":"Bonfire.Quantify.Units.federation_module/0","doc":"","ref":"Bonfire.Quantify.Units.html#federation_module/0"},{"type":"function","title":"Bonfire.Quantify.Units.get_or_create/2","doc":"","ref":"Bonfire.Quantify.Units.html#get_or_create/2"},{"type":"function","title":"Bonfire.Quantify.Units.many/1","doc":"Retrieves a list of collections by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Units.html#many/1"},{"type":"function","title":"Bonfire.Quantify.Units.one/1","doc":"Retrieves a single collection by arbitrary filters.\nUsed by:\n* Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Units.html#one/1"},{"type":"function","title":"Bonfire.Quantify.Units.soft_delete/1","doc":"","ref":"Bonfire.Quantify.Units.html#soft_delete/1"},{"type":"function","title":"Bonfire.Quantify.Units.test_cursor/0","doc":"","ref":"Bonfire.Quantify.Units.html#test_cursor/0"},{"type":"function","title":"Bonfire.Quantify.Units.update/2","doc":"","ref":"Bonfire.Quantify.Units.html#update/2"},{"type":"module","title":"Bonfire.Quantify.Units.Queries","doc":"","ref":"Bonfire.Quantify.Units.Queries.html"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.filter/2","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.join_to/3","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.queries/5","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.query/1","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#query/1"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.query/2","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#query/2"},{"type":"module","title":"Bonfire.RuntimeConfig","doc":"","ref":"Bonfire.RuntimeConfig.html"},{"type":"function","title":"Bonfire.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Search","doc":"An extension for [Bonfire](https://bonfire.cafe/) to handle:\n\n- Search indexing\n- Ultra-fast search\n- LiveView search UI\n\nYou can implement adapters for your prefered search backend. Currently adapters are included for:\n- Database\n- [Meili Search](https://www.meilisearch.com/)","ref":"Bonfire.Search.html"},{"type":"module","title":"Development & Deployment Documentation - Bonfire.Search","doc":"This extension is meant to be used inside of a Bonfire app, so please refer to the main repo at: https://github.com/bonfire-networks/bonfire-app","ref":"Bonfire.Search.html#module-development-deployment-documentation"},{"type":"module","title":"Copyright and License - Bonfire.Search","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Search.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Search.adapter/0","doc":"","ref":"Bonfire.Search.html#adapter/0"},{"type":"function","title":"Bonfire.Search.base_query/0","doc":"","ref":"Bonfire.Search.html#base_query/0"},{"type":"function","title":"Bonfire.Search.default_types/1","doc":"","ref":"Bonfire.Search.html#default_types/1"},{"type":"function","title":"Bonfire.Search.run_search_db/3","doc":"","ref":"Bonfire.Search.html#run_search_db/3"},{"type":"function","title":"Bonfire.Search.search/2","doc":"","ref":"Bonfire.Search.html#search/2"},{"type":"function","title":"Bonfire.Search.search/4","doc":"","ref":"Bonfire.Search.html#search/4"},{"type":"function","title":"Bonfire.Search.search_by_type/3","doc":"","ref":"Bonfire.Search.html#search_by_type/3"},{"type":"module","title":"Bonfire.Search.Acts.Queue","doc":"An act that enqueues publish/update/delete requests to meilisearch via an oban job queue.","ref":"Bonfire.Search.Acts.Queue.html"},{"type":"function","title":"Bonfire.Search.Acts.Queue.maybe_indexable_object/2","doc":"","ref":"Bonfire.Search.Acts.Queue.html#maybe_indexable_object/2"},{"type":"function","title":"Bonfire.Search.Acts.Queue.maybe_unindex/1","doc":"","ref":"Bonfire.Search.Acts.Queue.html#maybe_unindex/1"},{"type":"function","title":"Bonfire.Search.Acts.Queue.prepare_object/1","doc":"","ref":"Bonfire.Search.Acts.Queue.html#prepare_object/1"},{"type":"module","title":"Bonfire.Search.Fuzzy","doc":"","ref":"Bonfire.Search.Fuzzy.html"},{"type":"function","title":"Bonfire.Search.Fuzzy.do_search/4","doc":"","ref":"Bonfire.Search.Fuzzy.html#do_search/4"},{"type":"function","title":"Bonfire.Search.Fuzzy.search/4","doc":"","ref":"Bonfire.Search.Fuzzy.html#search/4"},{"type":"function","title":"Bonfire.Search.Fuzzy.search_filtered/2","doc":"","ref":"Bonfire.Search.Fuzzy.html#search_filtered/2"},{"type":"module","title":"Bonfire.Search.HTTP","doc":"","ref":"Bonfire.Search.HTTP.html"},{"type":"function","title":"Bonfire.Search.HTTP.http_adapter/0","doc":"","ref":"Bonfire.Search.HTTP.html#http_adapter/0"},{"type":"function","title":"Bonfire.Search.HTTP.http_error/5","doc":"","ref":"Bonfire.Search.HTTP.html#http_error/5"},{"type":"function","title":"Bonfire.Search.HTTP.http_request/4","doc":"","ref":"Bonfire.Search.HTTP.html#http_request/4"},{"type":"module","title":"Bonfire.Search.Indexer","doc":"","ref":"Bonfire.Search.Indexer.html"},{"type":"function","title":"Bonfire.Search.Indexer.host/1","doc":"","ref":"Bonfire.Search.Indexer.html#host/1"},{"type":"function","title":"Bonfire.Search.Indexer.index_public_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#index_public_object/1"},{"type":"function","title":"Bonfire.Search.Indexer.init_index/3","doc":"","ref":"Bonfire.Search.Indexer.html#init_index/3"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_delete_object/2","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_delete_object/2"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_index_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_index_object/1"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_indexable_and_discoverable/2","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_indexable_and_discoverable/2"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_indexable_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_indexable_object/1"},{"type":"module","title":"Bonfire.Search.LiveHandler","doc":"","ref":"Bonfire.Search.LiveHandler.html"},{"type":"function","title":"Bonfire.Search.LiveHandler.content_live_search/6","doc":"","ref":"Bonfire.Search.LiveHandler.html#content_live_search/6"},{"type":"function","title":"Bonfire.Search.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Search.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Search.LiveHandler.live_search/4","doc":"","ref":"Bonfire.Search.LiveHandler.html#live_search/4"},{"type":"macro","title":"Bonfire.Search.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Search.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Search.Meili","doc":"","ref":"Bonfire.Search.Meili.html"},{"type":"function","title":"Bonfire.Search.Meili.api/4","doc":"","ref":"Bonfire.Search.Meili.html#api/4"},{"type":"function","title":"Bonfire.Search.Meili.create_index/2","doc":"","ref":"Bonfire.Search.Meili.html#create_index/2"},{"type":"function","title":"Bonfire.Search.Meili.delete/3","doc":"","ref":"Bonfire.Search.Meili.html#delete/3"},{"type":"function","title":"Bonfire.Search.Meili.facet_from_map/1","doc":"","ref":"Bonfire.Search.Meili.html#facet_from_map/1"},{"type":"function","title":"Bonfire.Search.Meili.get/1","doc":"","ref":"Bonfire.Search.Meili.html#get/1"},{"type":"function","title":"Bonfire.Search.Meili.get/3","doc":"","ref":"Bonfire.Search.Meili.html#get/3"},{"type":"function","title":"Bonfire.Search.Meili.index_exists/1","doc":"","ref":"Bonfire.Search.Meili.html#index_exists/1"},{"type":"function","title":"Bonfire.Search.Meili.list_facets/1","doc":"","ref":"Bonfire.Search.Meili.html#list_facets/1"},{"type":"function","title":"Bonfire.Search.Meili.patch/3","doc":"","ref":"Bonfire.Search.Meili.html#patch/3"},{"type":"function","title":"Bonfire.Search.Meili.post/3","doc":"","ref":"Bonfire.Search.Meili.html#post/3"},{"type":"function","title":"Bonfire.Search.Meili.public_index/0","doc":"","ref":"Bonfire.Search.Meili.html#public_index/0"},{"type":"function","title":"Bonfire.Search.Meili.put/3","doc":"","ref":"Bonfire.Search.Meili.html#put/3"},{"type":"function","title":"Bonfire.Search.Meili.search/2","doc":"","ref":"Bonfire.Search.Meili.html#search/2"},{"type":"function","title":"Bonfire.Search.Meili.search/4","doc":"","ref":"Bonfire.Search.Meili.html#search/4"},{"type":"function","title":"Bonfire.Search.Meili.search_by_type/2","doc":"","ref":"Bonfire.Search.Meili.html#search_by_type/2"},{"type":"function","title":"Bonfire.Search.Meili.search_execute/2","doc":"","ref":"Bonfire.Search.Meili.html#search_execute/2"},{"type":"function","title":"Bonfire.Search.Meili.set_facets/2","doc":"","ref":"Bonfire.Search.Meili.html#set_facets/2"},{"type":"function","title":"Bonfire.Search.Meili.set_searchable_fields/2","doc":"","ref":"Bonfire.Search.Meili.html#set_searchable_fields/2"},{"type":"function","title":"Bonfire.Search.Meili.settings/2","doc":"","ref":"Bonfire.Search.Meili.html#settings/2"},{"type":"module","title":"Bonfire.Search.RuntimeConfig","doc":"","ref":"Bonfire.Search.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Search.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Search.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Search.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Search.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Search.Stopwords","doc":"Handles matching of needs & offers","ref":"Bonfire.Search.Stopwords.html"},{"type":"function","title":"Bonfire.Search.Stopwords.filter/2","doc":"Filters out pre-defined stop words.","ref":"Bonfire.Search.Stopwords.html#filter/2"},{"type":"function","title":"Bonfire.Search.Stopwords.split_sentences/1","doc":"","ref":"Bonfire.Search.Stopwords.html#split_sentences/1"},{"type":"function","title":"Bonfire.Search.Stopwords.split_words/1","doc":"","ref":"Bonfire.Search.Stopwords.html#split_words/1"},{"type":"function","title":"Bonfire.Search.Stopwords.stop_words/1","doc":"","ref":"Bonfire.Search.Stopwords.html#stop_words/1"},{"type":"module","title":"Bonfire.Search.Web.Routes","doc":"","ref":"Bonfire.Search.Web.Routes.html"},{"type":"function","title":"Bonfire.Search.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Search.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Seeder","doc":"A way to have data seeds that work similarly to migrations.\n\nTo generate a new seed: `mix phil_columns.gen.seed my_seed_name` will create a new module in `priv/repo/seeds`\n\nTo actually insert the seeds into your app, if that's not configured to be done automatically in your mix aliases, run `mix phil_columns.seed`\n\nTo roll-back: `mix phil_columns.rollback`","ref":"Bonfire.Seeder.html"},{"type":"module","title":"Bonfire.Social","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Feeds / Timelines\n- Activities\n- Threads\n- Boosting\n- Liking\n- Flagging\n- etc","ref":"Bonfire.Social.html"},{"type":"module","title":"Handy commands - Bonfire.Social","doc":"","ref":"Bonfire.Social.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Social","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Social.declared_extension/0","doc":"","ref":"Bonfire.Social.html#declared_extension/0"},{"type":"function","title":"Bonfire.Social.federate_outgoing?/1","doc":"Checks if outgoing federation is enabled for the given subject.","ref":"Bonfire.Social.html#federate_outgoing?/1"},{"type":"function","title":"Parameters - Bonfire.Social.federate_outgoing?/1","doc":"- subject: The subject to check for federation capability (optional).","ref":"Bonfire.Social.html#federate_outgoing?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.federate_outgoing?/1","doc":"iex> Bonfire.Social.federate_outgoing?()\n true\n\n iex> Bonfire.Social.federate_outgoing?(user)\n false","ref":"Bonfire.Social.html#federate_outgoing?/1-examples"},{"type":"function","title":"Bonfire.Social.federating?/1","doc":"Checks if federation is generally enabled for the given subject.","ref":"Bonfire.Social.html#federating?/1"},{"type":"function","title":"Parameters - Bonfire.Social.federating?/1","doc":"- subject: The subject to check for federation capability (optional).","ref":"Bonfire.Social.html#federating?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.federating?/1","doc":"iex> Bonfire.Social.federating?()\n true\n\n iex> Bonfire.Social.federating?(user)\n true","ref":"Bonfire.Social.html#federating?/1-examples"},{"type":"function","title":"Bonfire.Social.is_local?/2","doc":"Determines if the given thing is local to the current instance.","ref":"Bonfire.Social.html#is_local?/2"},{"type":"function","title":"Parameters - Bonfire.Social.is_local?/2","doc":"- thing: The object to check for locality.\n - opts: Additional options for the check (optional).","ref":"Bonfire.Social.html#is_local?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.is_local?/2","doc":"iex> Bonfire.Social.is_local?(local_user)\n true\n\n iex> Bonfire.Social.is_local?(remote_user)\n false","ref":"Bonfire.Social.html#is_local?/2-examples"},{"type":"function","title":"Bonfire.Social.mailer/0","doc":"Returns the configured mailer module.","ref":"Bonfire.Social.html#mailer/0"},{"type":"function","title":"Bonfire.Social.many/3","doc":"Executes a query and returns results based on the specified options.\n\nThis function can return query results in various formats, including raw query,\nstream, or paginated results.","ref":"Bonfire.Social.html#many/3"},{"type":"function","title":"Parameters - Bonfire.Social.many/3","doc":"- query: The Ecto query to execute.\n - paginate?: Boolean indicating whether to paginate results.\n - opts: Additional options for query execution.","ref":"Bonfire.Social.html#many/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.many/3","doc":"iex> query = from(u in User, where: u.age > 18)\n iex> Bonfire.Social.many(query, false, return: :query)\n #Ecto.Query<...>\n\n iex> Bonfire.Social.many(query, true, after: \"1\")\n %{entries: [%User{}, ...], page_info: %{...}}","ref":"Bonfire.Social.html#many/3-examples"},{"type":"function","title":"Bonfire.Social.maybe_federate/5","doc":"Attempts to federate an activity based on the given parameters.\n\nThis function handles various patterns of activities and objects, attempting to\nfederate them according to the specified verb and options.","ref":"Bonfire.Social.html#maybe_federate/5"},{"type":"function","title":"Parameters - Bonfire.Social.maybe_federate/5","doc":"- subject: The subject initiating the federation.\n - verb: The verb describing the activity (e.g., :create, :delete).\n - object: The object to be federated.\n - activity: The associated activity data (optional).\n - opts: Additional options for federation.","ref":"Bonfire.Social.html#maybe_federate/5-parameters"},{"type":"function","title":"Examples - Bonfire.Social.maybe_federate/5","doc":"iex> subject = %User{id: 1}\n iex> object = %Post{id: 2, content: \"Hello, world!\"}\n iex> Bonfire.Social.maybe_federate(subject, :create, object)\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.html#maybe_federate/5-examples"},{"type":"function","title":"Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"Federates an activity (if enabled) and wraps it with additional metadata.\n\nThis function attempts to federate an activity and, if successful, merges the\nfederated activity information with the original object.","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"- subject: The subject initiating the federation.\n - object: The object to be federated.\n - opts: Optional parameters for federation.","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"iex> subject = %User{id: 1}\n iex> object = %Post{id: 2, content: \"Hello, world!\"}\n iex> {:ok, wrapped_object} = Bonfire.Social.maybe_federate_and_gift_wrap_activity(subject, object)\n iex> Map.has_key?(wrapped_object, :activity)\n true","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3-examples"},{"type":"function","title":"Bonfire.Social.repo/0","doc":"Returns the configured repository module.","ref":"Bonfire.Social.html#repo/0"},{"type":"function","title":"Examples - Bonfire.Social.repo/0","doc":"iex> Bonfire.Social.repo()\n Bonfire.Common.Repo","ref":"Bonfire.Social.html#repo/0-examples"},{"type":"module","title":"Bonfire.Social.APActivities","doc":"A special type of activity object that stores federated JSON data as-is.\n\nThis module is used for any object type that isn't recognized or isn't implemented by an extension.\nIt provides functionality to handle ActivityPub activities, particularly for receiving and creating activities.","ref":"Bonfire.Social.APActivities.html"},{"type":"function","title":"Bonfire.Social.APActivities.ap_receive_activity/3","doc":"Receives and processes an ActivityPub activity.\n\nThis function is used to handle incoming federated activities.","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.APActivities.ap_receive_activity/3","doc":"- creator: The character (user) associated with the activity.\n - activity: The ActivityPub activity data.\n - object: The object associated with the activity.","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.APActivities.ap_receive_activity/3","doc":"iex> creator = %Character{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Create\"}}\n iex> object = %{data: %{\"type\" => \"Note\", \"content\" => \"Hello, fediverse!\"}}\n iex> Bonfire.Social.APActivities.ap_receive_activity(creator, activity, object)\n {:ok, %APActivity{}}","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.APActivities.create/4","doc":"Creates an `APActivity` from the given character, activity, and object.\n\nThis function handles various patterns of input data to create an APActivity.","ref":"Bonfire.Social.APActivities.html#create/4"},{"type":"function","title":"Parameters - Bonfire.Social.APActivities.create/4","doc":"- character: The character (user) creating the activity.\n - activity: The activity data.\n - object: The object associated with the activity.\n - public: A boolean indicating whether the activity is public (optional).","ref":"Bonfire.Social.APActivities.html#create/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.APActivities.create/4","doc":"iex> character = %Character{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Create\", \"object\" => %{\"content\" => \"Hello, world!\"}}}\n iex> object = %{data: %{\"type\" => \"Note\"}}\n iex> Bonfire.Social.APActivities.create(character, activity, object)\n {:ok, %APActivity{}}\n\n iex> Bonfire.Social.APActivities.create(character, activity, object, true)\n {:ok, %APActivity{}}","ref":"Bonfire.Social.APActivities.html#create/4-examples"},{"type":"module","title":"Bonfire.Social.Activities","doc":"Helpers to create or query (though that's usually done through `Bonfire.Social.FeedActivities`) activities, preload relevant associations, and otherwise massage activity-related data.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.Activity`, which has these fields:\n- id: primary key (which when the verb is Create usually matches the related Object) \n- subject: references the who (eg. a user)\n- verb: what kind of action (eg. references Like or Follow in `Bonfire.Data.AccessControl.Verb`)\n- object: references the what (eg. a specific post)","ref":"Bonfire.Social.Activities.html"},{"type":"function","title":"Bonfire.Social.Activities.activity_preloads/2","doc":"Applies preloads to a query or or post-loads to object(s) with the specified options. See `activity_preloads/3` for what preload options you can specify.","ref":"Bonfire.Social.Activities.html#activity_preloads/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_preloads/2","doc":"iex> activity_preloads(query, preload: [])\n # Query with applied activity preloads","ref":"Bonfire.Social.Activities.html#activity_preloads/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_preloads/3","doc":"Applies preloads to a query or or post-loads to object(s) with the specified preloads and options.","ref":"Bonfire.Social.Activities.html#activity_preloads/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_preloads/3","doc":"> activity_preloads(query, [], [])\n # Original query, with no extra joins/preloads\n\n > activity_preloads(object, [], [])\n # Original object, with no extra assocs preloads\n\n > activity_preloads(object_or_query, [:with_creator], [])\n # Object or query with extra assocs preloads\n\n > activity_preloads(object_or_query, [:feed, :with_reply_to, :with_media, :with_object_more, :maybe_with_labelled])\n # Object or query several extra assoc preloads\n\n Other possible preloads:\n :default\n :all\n :feed\n :feed_postload\n :feed_metadata\n :feed_by_subject\n :feed_by_creator\n :notifications\n :object_with_creator\n :posts\n :posts_with_thread\n :posts_with_reply_to\n :with_creator\n :with_subject\n :with_verb\n :with_object\n :with_object_posts\n :with_object_more\n :with_replied\n :with_thread_name\n :with_parent\n :with_reply_to\n :with_seen\n :with_media\n :per_media\n :tags\n :maybe_with_labelled","ref":"Bonfire.Social.Activities.html#activity_preloads/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_under_object/1","doc":"Processes and structures activity data within an object.","ref":"Bonfire.Social.Activities.html#activity_under_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_under_object/1","doc":"iex> activity_under_object(%{activity: %{id: 2, object: %{id: 1}}})\n %{id: 1, activity: %{id: 2}}","ref":"Bonfire.Social.Activities.html#activity_under_object/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_under_object/2","doc":"","ref":"Bonfire.Social.Activities.html#activity_under_object/2"},{"type":"function","title":"Bonfire.Social.Activities.activity_with_object_from_assigns/1","doc":"","ref":"Bonfire.Social.Activities.html#activity_with_object_from_assigns/1"},{"type":"function","title":"Bonfire.Social.Activities.all_verb_names/0","doc":"Outputs the names of all object verbs for localization, for the purpose of adding to the localisation strings, as long as the output is piped through to localise_strings/1 at compile time.","ref":"Bonfire.Social.Activities.html#all_verb_names/0"},{"type":"function","title":"Bonfire.Social.Activities.all_verb_names_extra/0","doc":"Retrieves additional verb names with various formats for localization.","ref":"Bonfire.Social.Activities.html#all_verb_names_extra/0"},{"type":"function","title":"Bonfire.Social.Activities.as_permitted_for/3","doc":"Filters a query to include only permitted objects.","ref":"Bonfire.Social.Activities.html#as_permitted_for/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.as_permitted_for/3","doc":"> as_permitted_for(query, [])\n # Filtered query","ref":"Bonfire.Social.Activities.html#as_permitted_for/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.build_assoc/3","doc":"","ref":"Bonfire.Social.Activities.html#build_assoc/3"},{"type":"function","title":"Bonfire.Social.Activities.build_assoc/4","doc":"","ref":"Bonfire.Social.Activities.html#build_assoc/4"},{"type":"function","title":"Bonfire.Social.Activities.by_subject_verb_object_q/3","doc":"","ref":"Bonfire.Social.Activities.html#by_subject_verb_object_q/3"},{"type":"function","title":"Bonfire.Social.Activities.cast/4","doc":"Casts a changeset with the provided verb, creator and options.","ref":"Bonfire.Social.Activities.html#cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.cast/4","doc":"> cast(changeset, :like, %User{}, feed_ids: [])\n # Changeset with associations set","ref":"Bonfire.Social.Activities.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.count_total/0","doc":"Counts the total number of activities.","ref":"Bonfire.Social.Activities.html#count_total/0"},{"type":"function","title":"Bonfire.Social.Activities.create/4","doc":"Create an Activity.\nNOTE: you will usually want to use `cast/3` instead or maybe `Objects.publish/5`","ref":"Bonfire.Social.Activities.html#create/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.create/4","doc":"> create(%User{id: \"1\"}, :like, %Post{id: \"1\"})\n {:ok, %Activity{}}","ref":"Bonfire.Social.Activities.html#create/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete/1","doc":"Deletes activities by ID or struct, or using specific filters.","ref":"Bonfire.Social.Activities.html#delete/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete/1","doc":"> delete(activity)\n # Number of deleted activities\n \n > delete(\"1\")\n # Number of deleted activities\n\n > delete([id: \"1\"])\n # Number of deleted activities","ref":"Bonfire.Social.Activities.html#delete/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete_by_object/1","doc":"Deletes an activity by object ID.","ref":"Bonfire.Social.Activities.html#delete_by_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete_by_object/1","doc":"iex> delete_by_object(\"1\")\n # Number of deleted objects","ref":"Bonfire.Social.Activities.html#delete_by_object/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete_by_subject_verb_object/3","doc":"Deletes an activity by subject, verb, and object.","ref":"Bonfire.Social.Activities.html#delete_by_subject_verb_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete_by_subject_verb_object/3","doc":"> delete_by_subject_verb_object(%User{id: \"1\"}, :like, %Post{id: \"1\"})\n # Number of deleted activities","ref":"Bonfire.Social.Activities.html#delete_by_subject_verb_object/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.fetch_cursor_value_fun/2","doc":"Retrieves the cursor value for pagination based on field or data structure.","ref":"Bonfire.Social.Activities.html#fetch_cursor_value_fun/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.fetch_cursor_value_fun/2","doc":"> fetch_cursor_value_fun(%{nested_replies_count: 5}, :num_replies)\n # returns the cursor value based on the number of replies","ref":"Bonfire.Social.Activities.html#fetch_cursor_value_fun/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.get/2","doc":"Gets an activity by its ID.","ref":"Bonfire.Social.Activities.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.get/2","doc":"iex> get(\"activity_id\", [])","ref":"Bonfire.Social.Activities.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.load_object/2","doc":"Loads an object based on its ID or pointer.","ref":"Bonfire.Social.Activities.html#load_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.load_object/2","doc":"> load_object(\"object_id\")","ref":"Bonfire.Social.Activities.html#load_object/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_join_creator/2","doc":"Optionally joins the creator.\n\nPerforms a query optimization: only includes the creator if different from the subject or current user.\n\nIf `exclude_user_ids` is empty, the creator is always included. Otherwise, it is included only if it is different from the users in `exclude_user_ids`.","ref":"Bonfire.Social.Activities.html#maybe_join_creator/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.maybe_join_creator/2","doc":"iex> maybe_join_creator(query, [])\n # returns query with creator preloaded if different from the subject\n\n iex> maybe_join_creator(query, [1, 2, 3])\n # returns query with creator included only if creator.id not in [1, 2, 3]","ref":"Bonfire.Social.Activities.html#maybe_join_creator/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_join_subject/2","doc":"Optimizes the query to optionally include the subject data.\n\nIf `exclude_user_ids` is empty, the subject is always included. Otherwise, it is included only if it is different from the users in `exclude_user_ids`.","ref":"Bonfire.Social.Activities.html#maybe_join_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.maybe_join_subject/2","doc":"iex> maybe_join_subject(query, [])\n # returns query with subject preloaded\n\n iex> maybe_join_subject(query, [1, 2, 3])\n # returns query with subject included only if subject.id not in [1, 2, 3]","ref":"Bonfire.Social.Activities.html#maybe_join_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_remove_for_deleters_feeds/1","doc":"","ref":"Bonfire.Social.Activities.html#maybe_remove_for_deleters_feeds/1"},{"type":"function","title":"Bonfire.Social.Activities.maybe_with_labelled/0","doc":"","ref":"Bonfire.Social.Activities.html#maybe_with_labelled/0"},{"type":"function","title":"Bonfire.Social.Activities.object_from_activity/1","doc":"Retrieves or constructs the object from an activity.","ref":"Bonfire.Social.Activities.html#object_from_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_from_activity/1","doc":"iex> object_from_activity(%{object: %{id: 1}})\n %{id: 1}","ref":"Bonfire.Social.Activities.html#object_from_activity/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_preload_activity/2","doc":"Preloads the activity for an object and verb.","ref":"Bonfire.Social.Activities.html#object_preload_activity/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_preload_activity/2","doc":"> object_preload_activity(%Post{}, :like)\n # Object with preloaded activity","ref":"Bonfire.Social.Activities.html#object_preload_activity/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_preload_create_activity/1","doc":"Preloads the creation activity for an object.","ref":"Bonfire.Social.Activities.html#object_preload_create_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_preload_create_activity/1","doc":"> object_preload_create_activity(%Post{})\n # Object with preloaded creation activity","ref":"Bonfire.Social.Activities.html#object_preload_create_activity/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_under_activity/2","doc":"","ref":"Bonfire.Social.Activities.html#object_under_activity/2"},{"type":"function","title":"Bonfire.Social.Activities.order_cursor_fields/2","doc":"Provides cursor fields for ordering based on sort criteria.","ref":"Bonfire.Social.Activities.html#order_cursor_fields/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.order_cursor_fields/2","doc":"> order_cursor_fields(:num_likes, :asc)\n # returns cursor fields for ordering by number of likes in ascending order","ref":"Bonfire.Social.Activities.html#order_cursor_fields/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.order_pagination_opts/2","doc":"Provides pagination options for ordering.","ref":"Bonfire.Social.Activities.html#order_pagination_opts/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.order_pagination_opts/2","doc":"> order_pagination_opts(:num_likes, :desc)\n # returns pagination options for ordering by number of likes in descending order","ref":"Bonfire.Social.Activities.html#order_pagination_opts/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.put_assoc/3","doc":"","ref":"Bonfire.Social.Activities.html#put_assoc/3"},{"type":"function","title":"Bonfire.Social.Activities.put_assoc/4","doc":"","ref":"Bonfire.Social.Activities.html#put_assoc/4"},{"type":"function","title":"Bonfire.Social.Activities.query/2","doc":"Constructs a query based on filters and optional user context.","ref":"Bonfire.Social.Activities.html#query/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query/2","doc":"iex> query(filters)\n\n iex> query([my: :feed], [current_user: nil])","ref":"Bonfire.Social.Activities.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_module/0","doc":"","ref":"Bonfire.Social.Activities.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Activities.query_object_preload_activity/4","doc":"Preloads activity for objects in a query using the specified verb and object ID field.","ref":"Bonfire.Social.Activities.html#query_object_preload_activity/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_object_preload_activity/4","doc":"> query_object_preload_activity(query, :like, :post_id, [])\n # Query with preloaded activities","ref":"Bonfire.Social.Activities.html#query_object_preload_activity/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_object_preload_create_activity/2","doc":"Preloads creation activity for objects in a query.","ref":"Bonfire.Social.Activities.html#query_object_preload_create_activity/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_object_preload_create_activity/2","doc":"> query_object_preload_create_activity(query, [])\n # Query with preloaded creation activities","ref":"Bonfire.Social.Activities.html#query_object_preload_create_activity/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_order/4","doc":"Orders query results based on a specified field and sort order.","ref":"Bonfire.Social.Activities.html#query_order/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_order/4","doc":"> query_order(query, :num_replies, :asc)\n # returns the query ordered by number of replies in ascending order","ref":"Bonfire.Social.Activities.html#query_order/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.read/2","doc":"Retrieves an activity based on a query and options.","ref":"Bonfire.Social.Activities.html#read/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.read/2","doc":"iex> read(query)\n # returns an activity based on the provided query\n\n iex> read(object_id)\n # returns an activity for the provided object ID (usually a create activity)","ref":"Bonfire.Social.Activities.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.read_query/2","doc":"Constructs a query for reading activities based on input.","ref":"Bonfire.Social.Activities.html#read_query/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.read_query/2","doc":"> read_query(query, opts)\n\n > read_query(object_id, opts)","ref":"Bonfire.Social.Activities.html#read_query/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.reply_to_as_permitted_for/3","doc":"","ref":"Bonfire.Social.Activities.html#reply_to_as_permitted_for/3"},{"type":"function","title":"Bonfire.Social.Activities.schema_module/0","doc":"","ref":"Bonfire.Social.Activities.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Activities.verb_congugate/1","doc":"","ref":"Bonfire.Social.Activities.html#verb_congugate/1"},{"type":"function","title":"Bonfire.Social.Activities.verb_display/1","doc":"Returns a localized and formatted display name for a verb.","ref":"Bonfire.Social.Activities.html#verb_display/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_display/1","doc":"iex> verb_display(\"create\")","ref":"Bonfire.Social.Activities.html#verb_display/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_id/1","doc":"Retrieves or constructs an ID for a verb based on its name or identifier.","ref":"Bonfire.Social.Activities.html#verb_id/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_id/1","doc":"iex> verb_id(:create)","ref":"Bonfire.Social.Activities.html#verb_id/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_maybe_modify/2","doc":"Optionally modifies the verb based on activity context.","ref":"Bonfire.Social.Activities.html#verb_maybe_modify/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_maybe_modify/2","doc":"iex> verb_maybe_modify(\"Create\", %{object: %{post_content: %{id: 1}}})\n \"Write\"","ref":"Bonfire.Social.Activities.html#verb_maybe_modify/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_name/1","doc":"Returns the name of a verb based on its slug or identifier.","ref":"Bonfire.Social.Activities.html#verb_name/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_name/1","doc":"iex> verb_name(:create)\n \"Create\"","ref":"Bonfire.Social.Activities.html#verb_name/1-examples"},{"type":"module","title":"Bonfire.Social.Acts.Activity","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates an activity for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `verb` - indicates what kind of activity we're creating, default: `:create`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Activity.html"},{"type":"function","title":"Bonfire.Social.Acts.Activity.run/2","doc":"","ref":"Bonfire.Social.Acts.Activity.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Activity.UnderObject","doc":"","ref":"Bonfire.Social.Acts.Activity.UnderObject.html"},{"type":"function","title":"Bonfire.Social.Acts.Activity.UnderObject.run/2","doc":"","ref":"Bonfire.Social.Acts.Activity.UnderObject.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.AntiSpam","doc":"An Act (as specified by `Bonfire.Epics`) that marks the sensitivity level of a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.AntiSpam.html"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.all_text_content/2","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#all_text_content/2"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.check!/3","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#check!/3"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.run/2","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#run/2"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.spam?/3","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#spam?/3"},{"type":"module","title":"Bonfire.Social.Acts.Federate","doc":"An Act (as specified by `Bonfire.Epics`) that translates an object (eg. a post) or changeset into some jobs for the AP publish worker. Handles creation, update and delete.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `ap_on` - key in assigns to find the AP object, default: `:ap_object`\n * `action` - indicates what kind of action we're federating, default: `:insert`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Federate.html"},{"type":"function","title":"Bonfire.Social.Acts.Federate.run/2","doc":"","ref":"Bonfire.Social.Acts.Federate.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Feeds","doc":"NOT USED - Finds a list of appropriate feeds into which to post.\n\nEpic Options:\n * `:current_user` - current user. required.\n * `:boundary` - preset string or custom boundaries. default: nil\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required","ref":"Bonfire.Social.Acts.Feeds.html"},{"type":"function","title":"Bonfire.Social.Acts.Feeds.run/2","doc":"","ref":"Bonfire.Social.Acts.Feeds.html#run/2"},{"type":"function","title":"Bonfire.Social.Acts.Feeds.thread_id/1","doc":"","ref":"Bonfire.Social.Acts.Feeds.html#thread_id/1"},{"type":"module","title":"Bonfire.Social.Acts.LivePush","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates an activity for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `feeds` - key\n * `notify_feeds` - key","ref":"Bonfire.Social.Acts.LivePush.html"},{"type":"function","title":"Bonfire.Social.Acts.LivePush.run/2","doc":"","ref":"Bonfire.Social.Acts.LivePush.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Objects.Delete","doc":"Delete something + specified associations with a changeset","ref":"Bonfire.Social.Acts.Objects.Delete.html"},{"type":"module","title":"Bonfire.Social.Acts.PostContents","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates a the post contents for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.PostContents.html"},{"type":"function","title":"Bonfire.Social.Acts.PostContents.run/2","doc":"","ref":"Bonfire.Social.Acts.PostContents.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Sensitivity","doc":"An Act (as specified by `Bonfire.Epics`) that marks the sensitivity level of a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Sensitivity.html"},{"type":"function","title":"Bonfire.Social.Acts.Sensitivity.run/2","doc":"","ref":"Bonfire.Social.Acts.Sensitivity.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Threaded","doc":"An Act (as specified by `Bonfire.Epics`) that sets the thread and/or reply_to for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Threaded.html"},{"type":"function","title":"Bonfire.Social.Acts.Threaded.run/2","doc":"","ref":"Bonfire.Social.Acts.Threaded.html#run/2"},{"type":"module","title":"Bonfire.Social.Answers","doc":"Answers are just another kind of `Bonfire.Social.Pins`, please refer to that module.","ref":"Bonfire.Social.Answers.html"},{"type":"module","title":"Bonfire.Social.Bookmarks","doc":"Mutate or query bookmarks (similar to likes but only visible to the creator of the bookmark)\n\nBookmarks are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Bookmarks.html"},{"type":"function","title":"Bonfire.Social.Bookmarks.bookmark/3","doc":"Bookmarks an object for a user.","ref":"Bonfire.Social.Bookmarks.html#bookmark/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.bookmark/3","doc":"iex> Bonfire.Social.Bookmarks.bookmark(user, object)\n {:ok, %Bonfire.Data.Social.Bookmark{}}","ref":"Bonfire.Social.Bookmarks.html#bookmark/3-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.bookmarked?/2","doc":"Checks if a user has bookmarked an object.","ref":"Bonfire.Social.Bookmarks.html#bookmarked?/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.bookmarked?/2","doc":"iex> Bonfire.Social.Bookmarks.bookmarked?(user, object)\n true","ref":"Bonfire.Social.Bookmarks.html#bookmarked?/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.by_bookmarked/2","doc":"Retrieves bookmark(er)s for an object.","ref":"Bonfire.Social.Bookmarks.html#by_bookmarked/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.by_bookmarked/2","doc":"iex> Bonfire.Social.Bookmarks.by_bookmarked(object)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#by_bookmarked/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.by_bookmarker/2","doc":"Retrieves bookmarked objects by a subject.","ref":"Bonfire.Social.Bookmarks.html#by_bookmarker/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.by_bookmarker/2","doc":"iex> Bonfire.Social.Bookmarks.by_bookmarker(user)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#by_bookmarker/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.count/2","doc":"Counts bookmarks based on filters and options.","ref":"Bonfire.Social.Bookmarks.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.count/2","doc":"iex> Bonfire.Social.Bookmarks.count([subject: user_id], [])\n 5\n\n iex> Bonfire.Social.Bookmarks.count(user, object)\n 1\n\n iex> Bonfire.Social.Bookmarks.count(object, [])\n 10","ref":"Bonfire.Social.Bookmarks.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.get/3","doc":"Retrieves a bookmark by subject and object.","ref":"Bonfire.Social.Bookmarks.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.get/3","doc":"iex> Bonfire.Social.Bookmarks.get(user, object)\n {:ok, %Bonfire.Data.Social.Bookmark{}}","ref":"Bonfire.Social.Bookmarks.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.get!/3","doc":"Retrieves a bookmark edge, raising an error if not found.","ref":"Bonfire.Social.Bookmarks.html#get!/3"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_by/2","doc":"Lists bookmarks by a specific user.","ref":"Bonfire.Social.Bookmarks.html#list_by/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_by/2","doc":"iex> Bonfire.Social.Bookmarks.list_by(user_id, current_user: me)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_my/1","doc":"Lists the current user's bookmarks.","ref":"Bonfire.Social.Bookmarks.html#list_my/1"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_my/1","doc":"iex> Bonfire.Social.Bookmarks.list_my(current_user: me)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_of/2","doc":"Lists bookmark(er)s of a specific object or objects.","ref":"Bonfire.Social.Bookmarks.html#list_of/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_of/2","doc":"iex> Bonfire.Social.Bookmarks.list_of(object_id)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.query/2","doc":"","ref":"Bonfire.Social.Bookmarks.html#query/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.query_module/0","doc":"","ref":"Bonfire.Social.Bookmarks.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Bookmarks.schema_module/0","doc":"","ref":"Bonfire.Social.Bookmarks.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Bookmarks.unbookmark/3","doc":"Removes a bookmark from an object for a user, if one exists","ref":"Bonfire.Social.Bookmarks.html#unbookmark/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.unbookmark/3","doc":"iex> Bonfire.Social.Bookmarks.unbookmark(user, object)\n :ok","ref":"Bonfire.Social.Bookmarks.html#unbookmark/3-examples"},{"type":"module","title":"Bonfire.Social.Bookmarks.LiveHandler","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.bookmarker_count/1","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#bookmarker_count/1"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.do_bookmark/3","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#do_bookmark/3"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Bookmarks.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Boosts","doc":"Mutate, query, and federate boosts (re-sharing an activity or object).\n\nBoosts are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Boosts.html"},{"type":"function","title":"Bonfire.Social.Boosts.ap_publish_activity/3","doc":"Publishes a federated activity for a boost action.","ref":"Bonfire.Social.Boosts.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.ap_publish_activity/3","doc":"iex> Bonfire.Social.Boosts.ap_publish_activity(subject, :create, boost)\n {:ok, _activity}","ref":"Bonfire.Social.Boosts.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.ap_receive_activity/3","doc":"Receives and processes a federated boost activity.","ref":"Bonfire.Social.Boosts.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.ap_receive_activity/3","doc":"iex> Bonfire.Social.Boosts.ap_receive_activity(creator, activity, object)\n {:ok, _boost}","ref":"Bonfire.Social.Boosts.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.boost/3","doc":"Boosts an object for a user.","ref":"Bonfire.Social.Boosts.html#boost/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.boost/3","doc":"iex> Bonfire.Social.Boosts.boost(user, object)\n {:ok, %Bonfire.Data.Social.Boost{}}","ref":"Bonfire.Social.Boosts.html#boost/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.boosted?/2","doc":"Checks if a user has boosted an object.","ref":"Bonfire.Social.Boosts.html#boosted?/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.boosted?/2","doc":"iex> Bonfire.Social.Boosts.boosted?(user, object)\n true","ref":"Bonfire.Social.Boosts.html#boosted?/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.count/2","doc":"Counts boosts based on filters and options.","ref":"Bonfire.Social.Boosts.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.count/2","doc":"iex> Bonfire.Social.Boosts.count([subject: user_id], [])\n 5 # user made 5 boosts, across all objects\n\n iex> Bonfire.Social.Boosts.count(user, object)\n 3 # user boosted object 3 times\n\n iex> Bonfire.Social.Boosts.count(object, [])\n 10 # object was boosted 5 times, across all users","ref":"Bonfire.Social.Boosts.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.date_last_boosted/2","doc":"Gets the date of the latest boost by a user for an object.","ref":"Bonfire.Social.Boosts.html#date_last_boosted/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.date_last_boosted/2","doc":"iex> Bonfire.Social.Boosts.date_last_boosted(user, object)\n ~U[2023-07-29 12:34:56Z]","ref":"Bonfire.Social.Boosts.html#date_last_boosted/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.federation_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.get/3","doc":"Retrieves a boost edge by subject and object.","ref":"Bonfire.Social.Boosts.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.get/3","doc":"iex> Bonfire.Social.Boosts.get(subject, object)\n {:ok, %Bonfire.Data.Social.Boost{}}","ref":"Bonfire.Social.Boosts.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.get!/3","doc":"Retrieves a boost edge, raising an error if not found.","ref":"Bonfire.Social.Boosts.html#get!/3"},{"type":"function","title":"Bonfire.Social.Boosts.list_by/2","doc":"Lists boosts by a specific user.","ref":"Bonfire.Social.Boosts.html#list_by/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_by/2","doc":"iex> Bonfire.Social.Boosts.list_by(user_id)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_my/1","doc":"Lists boosts by the current user.","ref":"Bonfire.Social.Boosts.html#list_my/1"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_my/1","doc":"iex> Bonfire.Social.Boosts.list_my(current_user: me)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_of/2","doc":"Lists boosts of a specific object.","ref":"Bonfire.Social.Boosts.html#list_of/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_of/2","doc":"iex> Bonfire.Social.Boosts.list_of(object_id)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_paginated/2","doc":"Lists boosts with pagination.","ref":"Bonfire.Social.Boosts.html#list_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_paginated/2","doc":"iex> Bonfire.Social.Boosts.list_paginated([subject: user_id], [limit: 10])\n %{edges: [%Bonfire.Data.Social.Boost{}, ...], page_info: %{...}}","ref":"Bonfire.Social.Boosts.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.maybe_boost/3","doc":"","ref":"Bonfire.Social.Boosts.html#maybe_boost/3"},{"type":"function","title":"Bonfire.Social.Boosts.query/2","doc":"","ref":"Bonfire.Social.Boosts.html#query/2"},{"type":"function","title":"Bonfire.Social.Boosts.query_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.schema_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.unboost/3","doc":"Removes a boost from an object for a user, if one exists","ref":"Bonfire.Social.Boosts.html#unboost/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.unboost/3","doc":"iex> Bonfire.Social.Boosts.unboost(user, object)\n {:ok, _}","ref":"Bonfire.Social.Boosts.html#unboost/3-examples"},{"type":"module","title":"Bonfire.Social.Boosts.LiveHandler","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.do_boost/3","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#do_boost/3"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Boosts.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Edges","doc":"Shared helpers for modules that implemented Edges to mutate or query them, preload relevant associations, etc.\n\nThis is a shared [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Edges.Edge`, which has these fields:\n- id: primary key which matches the related Activity \n- subject: the who (eg. a user)\n- table: what kind of action (eg. references Like or Follow in `Needle.Table` ...)\n- object: the what (eg. a specific post)","ref":"Bonfire.Social.Edges.html"},{"type":"function","title":"Bonfire.Social.Edges.changeset/5","doc":"Prepares a full changeset for the given schema, subject, verb, object, and options.","ref":"Bonfire.Social.Edges.html#changeset/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset/5","doc":"iex> changeset(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.changeset_base/4","doc":"Prepares a basic schema, with the schema type as top-level and an Egde assoc\n\niex> changeset_base(Like, %User{id: 1}, %Post{id: 2}, [])\n %Ecto.Changeset{}\n\niex> changeset_base(Follow, %User{id: 1}, %User{id: 2}, [])\n %Ecto.Changeset{}\n\niex> changeset_base({Request, Follow}, %User{id: 1}, %User{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_base/4"},{"type":"function","title":"Bonfire.Social.Edges.changeset_base_with_creator/4","doc":"Prepares a changeset with creator but no caretaker, which avoids the edge being deleted when subject is deleted.","ref":"Bonfire.Social.Edges.html#changeset_base_with_creator/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset_base_with_creator/4","doc":"iex> changeset_base_with_creator(MySchema, %User{id: 1}, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_base_with_creator/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.changeset_extra/5","doc":"Prepares a changeset with Acls, Activities and FeedActivities","ref":"Bonfire.Social.Edges.html#changeset_extra/5"},{"type":"function","title":"Bonfire.Social.Edges.changeset_without_caretaker/5","doc":"Prepares a changeset with creator but no caretaker, which avoids the edge being deleted when subject is deleted. Also includes Acls, Activities and FeedActivities.","ref":"Bonfire.Social.Edges.html#changeset_without_caretaker/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset_without_caretaker/5","doc":"iex> changeset_without_caretaker(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_without_caretaker/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.count/3","doc":"Counts the edges for the given type, filters or object, and options.","ref":"Bonfire.Social.Edges.html#count/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.count/3","doc":"> count(:like, %Post{id: 2}, [])\n 42","ref":"Bonfire.Social.Edges.html#count/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.count_for_subject/4","doc":"Counts the edges for the given type, subject, object, and options.","ref":"Bonfire.Social.Edges.html#count_for_subject/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.count_for_subject/4","doc":"> count_for_subject(:like, %User{id: 1}, %Post{id: 2}, [])\n 42","ref":"Bonfire.Social.Edges.html#count_for_subject/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_both/3","doc":"Deletes edges by subject, type, and object","ref":"Bonfire.Social.Edges.html#delete_by_both/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_both/3","doc":"iex> delete_by_both(%User{id: 1}, MySchema, %User{id: 2})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_both/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_object/1","doc":"Deletes edges where the given user is the object.","ref":"Bonfire.Social.Edges.html#delete_by_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_object/1","doc":"iex> delete_by_object(%User{id: 1})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_object/1-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_subject/1","doc":"Deletes edges where the given user is the subject.","ref":"Bonfire.Social.Edges.html#delete_by_subject/1"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_subject/1","doc":"iex> delete_by_subject(%User{id: 1})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_subject/1-examples"},{"type":"function","title":"Bonfire.Social.Edges.edge_module_query/2","doc":"","ref":"Bonfire.Social.Edges.html#edge_module_query/2"},{"type":"function","title":"Bonfire.Social.Edges.exists?/4","doc":"Checks if an edge exists with the given schema/context, subject, and object.","ref":"Bonfire.Social.Edges.html#exists?/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.exists?/4","doc":"> exists?(MySchema, %User{id: 1}, %Post{id: 2}, [])\n true","ref":"Bonfire.Social.Edges.html#exists?/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.filters_from_opts/1","doc":"TODOC","ref":"Bonfire.Social.Edges.html#filters_from_opts/1"},{"type":"function","title":"Bonfire.Social.Edges.get/4","doc":"Retrieves the edge with either:\n- a schema/context, subject, and object(s)\n- a schema/context, filters, and options","ref":"Bonfire.Social.Edges.html#get/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.get/4","doc":"> get(MySchema, %User{id: 1}, %Post{id: 2})\n\n > get(MySchema, [%{subject: %User{id: 1}}], [])","ref":"Bonfire.Social.Edges.html#get/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.get!/4","doc":"","ref":"Bonfire.Social.Edges.html#get!/4"},{"type":"function","title":"Bonfire.Social.Edges.insert/3","doc":"Inserts a changeset with optional subject and object.","ref":"Bonfire.Social.Edges.html#insert/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.insert/3","doc":"iex> insert(%Changeset{}, %User{id: 1}, %Post{id: 2})\n {:ok, %Edge{}}","ref":"Bonfire.Social.Edges.html#insert/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.insert/5","doc":"Inserts a new edge with the given schema, subject, verb, and object.","ref":"Bonfire.Social.Edges.html#insert/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.insert/5","doc":"> insert(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n {:ok, %Edge{}}","ref":"Bonfire.Social.Edges.html#insert/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.last/4","doc":"Retrieves the last edge of a given type, subject, and object from the database.","ref":"Bonfire.Social.Edges.html#last/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.last/4","doc":"iex> last(MySchema, %User{id: 1}, %Post{id: 2}, [])","ref":"Bonfire.Social.Edges.html#last/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.last_date/4","doc":"Retrieves the date of the last edge of a given type, subject, and object from the database.","ref":"Bonfire.Social.Edges.html#last_date/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.last_date/4","doc":"> last_date(:like, %User{id: 1}, %Post{id: 2}, [])\n ~N[2023-07-25 12:34:56]","ref":"Bonfire.Social.Edges.html#last_date/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.put_edge_assoc/3","doc":"","ref":"Bonfire.Social.Edges.html#put_edge_assoc/3"},{"type":"function","title":"Bonfire.Social.Edges.put_edge_assoc/4","doc":"","ref":"Bonfire.Social.Edges.html#put_edge_assoc/4"},{"type":"function","title":"Bonfire.Social.Edges.query/2","doc":"TODOC","ref":"Bonfire.Social.Edges.html#query/2"},{"type":"function","title":"Bonfire.Social.Edges.query_parent/3","doc":"TODOC","ref":"Bonfire.Social.Edges.html#query_parent/3"},{"type":"module","title":"Bonfire.Social.Fake","doc":"","ref":"Bonfire.Social.Fake.html"},{"type":"function","title":"Bonfire.Social.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Social.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Social.FeedActivities","doc":"Helpers to create or query a feed's activities.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.FeedPublish`, which has two foreign fields:\n- id (of the activity, see `Bonfire.Social.Activities`)\n- feed (see `Bonfire.Social.Feeds`)","ref":"Bonfire.Social.FeedActivities.html"},{"type":"function","title":"Bonfire.Social.FeedActivities.cast/2","doc":"Casts the changeset to publish an activity to the given feed IDs.","ref":"Bonfire.Social.FeedActivities.html#cast/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.cast/2","doc":"> cast(changeset, feed_ids)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#cast/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.cast/3","doc":"Casts the changeset to publish an activity to the given creator and feed IDs.","ref":"Bonfire.Social.FeedActivities.html#cast/3"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.cast/3","doc":"> cast(changeset, creator, opts)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#cast/3-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count/2","doc":"Returns the count of items in a feed based on given filters and options.","ref":"Bonfire.Social.FeedActivities.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.count/2","doc":"iex> count(filters, current_user: me)\n 10","ref":"Bonfire.Social.FeedActivities.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count_subjects/2","doc":"Returns the count of distinct subjects in a feed based on given filters and options.","ref":"Bonfire.Social.FeedActivities.html#count_subjects/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.count_subjects/2","doc":"iex> count_subjects(filters, opts)\n 3","ref":"Bonfire.Social.FeedActivities.html#count_subjects/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count_total/0","doc":"Returns the total count of activities in feeds.","ref":"Bonfire.Social.FeedActivities.html#count_total/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.delete/1","doc":"Remove activities from feeds, using specific filters","ref":"Bonfire.Social.FeedActivities.html#delete/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.delete/1","doc":"iex> filters = [object_id: \"123\"]\n iex> Bonfire.Social.FeedActivities.delete(filters)\n {5, nil}","ref":"Bonfire.Social.FeedActivities.html#delete/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.delete/2","doc":"Remove one or more activities from all feeds","ref":"Bonfire.Social.FeedActivities.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.delete/2","doc":"iex> Bonfire.Social.FeedActivities.delete(\"123\", :object_id)\n {1, nil}","ref":"Bonfire.Social.FeedActivities.html#delete/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.exclude_object_types/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#exclude_object_types/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed/2","doc":"Gets a feed by id or ids or a thing/things containing an id/ids.","ref":"Bonfire.Social.FeedActivities.html#feed/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed/2","doc":"iex> Bonfire.Social.FeedActivities.feed(\"feed123\", [])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> Bonfire.Social.FeedActivities.feed(:explore, [])\n %{edges: [%{activity: %{}}], page_info: %{}}","ref":"Bonfire.Social.FeedActivities.html#feed/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_contains?/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_contains?/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_contains_single?/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_contains_single?/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_ids_and_opts/2","doc":"Gets feed ids and options for the given feed or list of feeds.","ref":"Bonfire.Social.FeedActivities.html#feed_ids_and_opts/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_ids_and_opts/2","doc":"> feed_ids_and_opts(feed_name, opts)\n {feed_ids, opts}\n\n > feed_ids_and_opts({feed_name, feed_id}, opts)\n\n iex> feed_ids_and_opts(:my, [current_user: me])\n {[\"feed_id1\", \"feed_id2\"], [exclude_verbs: [:flag, :boost, :follow]]}\n\n iex> feed_ids_and_opts({:notifications, \"feed_id3\"}, [current_user: me])\n {\"feed_id3\", [skip_boundary_check: :admins, include_flags: true, exclude_verbs: false, skip_dedup: true, preload: [:notifications]]}","ref":"Bonfire.Social.FeedActivities.html#feed_ids_and_opts/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_many_paginated/2","doc":"Returns paginated results for the given query.","ref":"Bonfire.Social.FeedActivities.html#feed_many_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_many_paginated/2","doc":"> feed_many_paginated(query, opts)\n %{edges: edges, page_info: page_info}","ref":"Bonfire.Social.FeedActivities.html#feed_many_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_name/2","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_name/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_paginated/2","doc":"Returns a page of feed activities (reverse chronological) + pagination metadata \n\nTODO: consolidate with `feed/2`","ref":"Bonfire.Social.FeedActivities.html#feed_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_paginated/2","doc":"iex> feed_paginated([], [])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> query = Ecto.Query.from(f in FeedPublish)\n iex> Bonfire.Social.FeedActivities.feed_paginated([], base_query: query)","ref":"Bonfire.Social.FeedActivities.html#feed_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_with_object/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_with_object/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feeds_for_activity/1","doc":"Gets a list of feed ids this activity was published to from the database.\n\nCurrently only used by the ActivityPub integration.","ref":"Bonfire.Social.FeedActivities.html#feeds_for_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feeds_for_activity/1","doc":"iex> feeds_for_activity(%{id: id})\n [feed_id1, feed_id2]\n\n iex> feeds_for_activity(id)\n [feed_id1, feed_id2]\n\n iex> feeds_for_activity(activity)\n []","ref":"Bonfire.Social.FeedActivities.html#feeds_for_activity/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.filters_from_opts/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#filters_from_opts/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.get_feed_ids/1","doc":"Computes the feed ids for `get_feed_publishes/2`.\n\nOptions:\n* `:inbox` - list of users/characters whose inbox we should attempt to insert into.\n* `:outbox` - list of users/characters whose outbox we should attempt to insert into.\n* `:notifications` - list of users/characters whose notifications we should attempt to insert into.\n* `:feeds` - list of ids (or objects containing IDs) of feeds to post to.","ref":"Bonfire.Social.FeedActivities.html#get_feed_ids/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.get_feed_ids/1","doc":"iex> options = [outbox: [%{id: \"author123\"}], inbox: [%{id: \"mention987\"}], notifications: [%{id: \"reply654\"}], feeds: [\"feed456\"]]\n iex> Bonfire.Social.FeedActivities.get_feed_ids(options)\n [\"inbox_feed_id_for_user123\", \"feed456\"]","ref":"Bonfire.Social.FeedActivities.html#get_feed_ids/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.get_feed_publishes/1","doc":"Creates the underlying data for `put_feed_publishes/2`.\n\nOptions: see `get_feed_ids/1`","ref":"Bonfire.Social.FeedActivities.html#get_feed_publishes/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.get_feed_publishes/1","doc":"iex> options = [feeds: [\"feed123\", \"feed456\"]]\n iex> Bonfire.Social.FeedActivities.get_feed_publishes(options)\n [%{feed_id: \"feed123\"}, %{feed_id: \"feed456\"}]","ref":"Bonfire.Social.FeedActivities.html#get_feed_publishes/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.mark_all_seen/2","doc":"Marks all unseen items in a feed as seen for the current user.","ref":"Bonfire.Social.FeedActivities.html#mark_all_seen/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.mark_all_seen/2","doc":"iex> mark_all_seen(feed_id, current_user: me)\n {:ok, number_of_marked_items}","ref":"Bonfire.Social.FeedActivities.html#mark_all_seen/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.maybe_feed_publish/5","doc":"Creates a new local activity or takes an existing one and publishes to specified feeds","ref":"Bonfire.Social.FeedActivities.html#maybe_feed_publish/5"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.maybe_feed_publish/5","doc":"iex> subject = %{id: \"user123\"}\n iex> verb = :create\n iex> object = %{id: \"post456\"}\n iex> feeds = [\"feed789\"]\n iex> opts = []\n iex> Bonfire.Social.FeedActivities.maybe_feed_publish(subject, verb, object, feeds, opts)\n {:ok, %Bonfire.Data.Social.Activity{}}","ref":"Bonfire.Social.FeedActivities.html#maybe_feed_publish/5-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.my_feed/2","doc":"Gets a user's home feed, a combination of all feeds the user is subscribed to.","ref":"Bonfire.Social.FeedActivities.html#my_feed/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.my_feed/2","doc":"iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: \"user123\"}])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: \"user123\"}], [\"feed_id1\", \"feed_id2\"])\n %{edges: [%{activity: %{}}], page_info: %{}}","ref":"Bonfire.Social.FeedActivities.html#my_feed/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.publish/4","doc":"Creates a new local activity and publishes to appropriate feeds\nTODO: make this re-use the changeset-based code like in Epics instead of duplicating logic (currently it is only used in VF extension anyway)","ref":"Bonfire.Social.FeedActivities.html#publish/4"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.publish/4","doc":"iex> subject = %{id: \"user123\"}\n iex> verb = :create\n iex> object = %{id: \"post456\"}\n iex> Bonfire.Social.FeedActivities.publish(subject, verb, object, [])\n {:ok, %Bonfire.Data.Social.Activity{}}","ref":"Bonfire.Social.FeedActivities.html#publish/4-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.put_feed_publishes/2","doc":"Arranges for an insert changeset to also publish to feeds related to some objects.\n\nOptions: see `get_feed_ids/1`","ref":"Bonfire.Social.FeedActivities.html#put_feed_publishes/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.put_feed_publishes/2","doc":"iex> changeset = %Ecto.Changeset{}\n iex> options = [feeds: [\"feed123\", \"feed456\"]]\n iex> Bonfire.Social.FeedActivities.put_feed_publishes(changeset, options)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#put_feed_publishes/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.query/3","doc":"Return a boundarised query for a feed","ref":"Bonfire.Social.FeedActivities.html#query/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_extras_boundarised/2","doc":"add assocs needed in timelines/feeds","ref":"Bonfire.Social.FeedActivities.html#query_extras_boundarised/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_module/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#query_module/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_object_extras_boundarised/2","doc":"add assocs needed in lists of objects","ref":"Bonfire.Social.FeedActivities.html#query_object_extras_boundarised/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.schema_module/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.skip_verbs_default/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#skip_verbs_default/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.the_object/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#the_object/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.to_feed_options/1","doc":"Converts socket, assigns, or options to feed options.","ref":"Bonfire.Social.FeedActivities.html#to_feed_options/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.to_feed_options/1","doc":"> assigns = %{exclude_verbs: [:flag, :boost]}\n > to_feed_options(assigns)\n [exclude_verbs: [:flag, :boost, :follow]]","ref":"Bonfire.Social.FeedActivities.html#to_feed_options/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.unseen_count/2","doc":"Returns the count of unseen items in a feed for the current user.","ref":"Bonfire.Social.FeedActivities.html#unseen_count/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.unseen_count/2","doc":"iex> unseen_count(feed_id, current_user: me)\n 5","ref":"Bonfire.Social.FeedActivities.html#unseen_count/2-examples"},{"type":"module","title":"Bonfire.Social.Feeds","doc":"Helpers to create or query (though that's usually done through `Bonfire.Social.FeedActivities`) feeds.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.Feed`, a virtual schema with just one field:\n- id","ref":"Bonfire.Social.Feeds.html"},{"type":"function","title":"Bonfire.Social.Feeds.admin_notifications/1","doc":"","ref":"Bonfire.Social.Feeds.html#admin_notifications/1"},{"type":"function","title":"Bonfire.Social.Feeds.admins_notifications/0","doc":"Retrieves the notifications feed IDs for all admins.","ref":"Bonfire.Social.Feeds.html#admins_notifications/0"},{"type":"function","title":"Bonfire.Social.Feeds.admins_notifications/1","doc":"Retrieves the notifications feed IDs for the provided admin(s).","ref":"Bonfire.Social.Feeds.html#admins_notifications/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.admins_notifications/1","doc":"","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-examples"},{"type":"function","title":"For an admin: - Bonfire.Social.Feeds.admins_notifications/1","doc":"> Bonfire.Social.Feeds.admin_notifications(admin)\n # Notifications feed ID for the admin","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-for-an-admin"},{"type":"function","title":"For a list of admins: - Bonfire.Social.Feeds.admins_notifications/1","doc":"> Bonfire.Social.Feeds.admins_notifications([admin1, admin2])\n # List of notifications feed IDs for the admins","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-for-a-list-of-admins"},{"type":"function","title":"Bonfire.Social.Feeds.feed_id/2","doc":"Gets the feed ID for a given feed name and subject.","ref":"Bonfire.Social.Feeds.html#feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_id/2-examples"},{"type":"function","title":"For a character: - Bonfire.Social.Feeds.feed_id/2","doc":"> Bonfire.Social.Feeds.feed_id(:notifications, character)\n # Feed ID for notifications of the character","ref":"Bonfire.Social.Feeds.html#feed_id/2-for-a-character"},{"type":"function","title":"For a binary feed name: - Bonfire.Social.Feeds.feed_id/2","doc":"> Bonfire.Social.Feeds.feed_id(\"notifications\", subject)\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#feed_id/2-for-a-binary-feed-name"},{"type":"function","title":"Bonfire.Social.Feeds.feed_id!/2","doc":"Gets the feed ID for a given feed name and subject, raising an error if not found.","ref":"Bonfire.Social.Feeds.html#feed_id!/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_id!/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_id!/2-examples"},{"type":"function","title":"For a valid feed: - Bonfire.Social.Feeds.feed_id!/2","doc":"> Bonfire.Social.Feeds.feed_id!(:notifications, subject)\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#feed_id!/2-for-a-valid-feed"},{"type":"function","title":"For an invalid feed: - Bonfire.Social.Feeds.feed_id!/2","doc":"> Bonfire.Social.Feeds.feed_id!(:invalid, subject)\n ** (RuntimeError) Expected feed name and user or character, got :invalid","ref":"Bonfire.Social.Feeds.html#feed_id!/2-for-an-invalid-feed"},{"type":"function","title":"Bonfire.Social.Feeds.feed_ids/2","doc":"Retrieves a list of feed IDs based on the feed name and subjects.","ref":"Bonfire.Social.Feeds.html#feed_ids/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_ids/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_ids/2-examples"},{"type":"function","title":"For a list of subjects: - Bonfire.Social.Feeds.feed_ids/2","doc":"> Bonfire.Social.Feeds.feed_ids(:notifications, [subject1, subject2])\n # List of notification feed IDs for the subjects","ref":"Bonfire.Social.Feeds.html#feed_ids/2-for-a-list-of-subjects"},{"type":"function","title":"For a single subject: - Bonfire.Social.Feeds.feed_ids/2","doc":"> Bonfire.Social.Feeds.feed_ids(:notifications, subject)\n [feed_id]","ref":"Bonfire.Social.Feeds.html#feed_ids/2-for-a-single-subject"},{"type":"function","title":"Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"Determines the feed IDs to publish based on the provided parameters.\n\nTODO: de-duplicate `feed_ids_to_publish/4` and `target_feeds/3`","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-examples"},{"type":"function","title":"When called with the `\"admins\"` boundary: - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"iex> Bonfire.Social.Feeds.feed_ids_to_publish(nil, \"admins\", nil)\n # List of admin feed IDS","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-when-called-with-the-admins-boundary"},{"type":"function","title":"When called with a different boundary and some optional feeds: - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"> Bonfire.Social.Feeds.feed_ids_to_publish(me, \"public\", %{reply_to: true}, [some_feed_id])\n # List of feed IDs for the provided boundary","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-when-called-with-a-different-boundary-and-some-optional-feeds"},{"type":"function","title":"Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"Gets the inbox feed ID of the creator of the given object.","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1-examples"},{"type":"function","title":"For an object: - Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"> Bonfire.Social.Feeds.inbox_of_obj_creator(object)\n # Inbox feed ID of the object's creator","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1-for-an-object"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_create_feed/2","doc":"Creates a feed for the given subject if it doesn't already exist.","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-examples"},{"type":"function","title":"For a new feed: - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"> Bonfire.Social.Feeds.maybe_create_feed(:notifications, subject)\n {:ok, feed_id}","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-for-a-new-feed"},{"type":"function","title":"For an existing feed: - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"> Bonfire.Social.Feeds.maybe_create_feed(:notifications, existing_subject)\n {:ok, existing_feed_id}","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-for-an-existing-feed"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"Checks if a creator notification should be sent for a subject.","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-examples"},{"type":"function","title":"When creator is different: - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"> Bonfire.Social.Feeds.maybe_creator_notification(subject, other_creator)\n [{:notifications, other_creator}]","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-when-creator-is-different"},{"type":"function","title":"When creator is the same: - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"> Bonfire.Social.Feeds.maybe_creator_notification(subject, subject)\n []","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-when-creator-is-the-same"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"Retrieves custom feeds if specified in the options.","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1-examples"},{"type":"function","title":"With custom feeds specified: - Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"iex> Bonfire.Social.Feeds.maybe_custom_feeds(to_feeds: [custom_feed_id])\n [custom_feed_id]","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1-with-custom-feeds-specified"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"Returns the feed ID of the outbox depending on the boundary.","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-examples"},{"type":"function","title":"When the boundary is `\"public\"`: - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, \"public\")\n # Feed ID of the outbox","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-when-the-boundary-is-public"},{"type":"function","title":"When the boundary is `\"mentions\"` or `\"admins\"`: - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, \"mentions\")\n nil","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-when-the-boundary-is-mentions-or-admins"},{"type":"function","title":"Bonfire.Social.Feeds.my_feed_id/2","doc":"Retrieves the feed ID for a given type and subject.","ref":"Bonfire.Social.Feeds.html#my_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.my_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#my_feed_id/2-examples"},{"type":"function","title":"For a user: - Bonfire.Social.Feeds.my_feed_id/2","doc":"> Bonfire.Social.Feeds.my_feed_id(:notifications, user)\n # Feed ID for notifications of the user","ref":"Bonfire.Social.Feeds.html#my_feed_id/2-for-a-user"},{"type":"function","title":"Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"Generates the home feed IDs for a user, including extra feeds if specified.","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-examples"},{"type":"function","title":"With socket options and extra feeds: - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"> Bonfire.Social.Feeds.my_home_feed_ids(socket_or_opts, [extra_feed_id])\n # List of home feed IDs including extra feeds","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-with-socket-options-and-extra-feeds"},{"type":"function","title":"Without socket options: - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"> Bonfire.Social.Feeds.my_home_feed_ids(_, [extra_feed_id])\n # List of home feed IDs including extra feeds","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-without-socket-options"},{"type":"function","title":"Bonfire.Social.Feeds.named_feed_id/2","doc":"Gets the feed ID for a named feed.","ref":"Bonfire.Social.Feeds.html#named_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.named_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-examples"},{"type":"function","title":"For an existing named feed: - Bonfire.Social.Feeds.named_feed_id/2","doc":"iex> Bonfire.Social.Feeds.named_feed_id(:notifications, [])\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-for-an-existing-named-feed"},{"type":"function","title":"For a binary name: - Bonfire.Social.Feeds.named_feed_id/2","doc":"iex> Bonfire.Social.Feeds.named_feed_id(\"notifications\", [])\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-for-a-binary-name"},{"type":"function","title":"Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"Generates a list of notification feed IDs based on mentions and replies.","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-examples"},{"type":"function","title":"When there are mentions and a reply to creator: - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, \"public\", [\"mention1\"], \"creator_id\")\n # List of notification feed IDs","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-when-there-are-mentions-and-a-reply-to-creator"},{"type":"function","title":"When no mentions and no reply to creator: - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, \"local\", [], nil)\n # List of notification feed IDs for local boundary","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-when-no-mentions-and-no-reply-to-creator"},{"type":"function","title":"Bonfire.Social.Feeds.schema_module/0","doc":"","ref":"Bonfire.Social.Feeds.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Feeds.target_feeds/3","doc":"Determines the target feeds for a given changeset, creator, and options.\n\nTODO: de-duplicate `feed_ids_to_publish/4` and `target_feeds/3`","ref":"Bonfire.Social.Feeds.html#target_feeds/3"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.target_feeds/3","doc":"","ref":"Bonfire.Social.Feeds.html#target_feeds/3-examples"},{"type":"function","title":"When given a changeset: - Bonfire.Social.Feeds.target_feeds/3","doc":"> Bonfire.Social.Feeds.target_feeds(changeset, creator, opts)\n # List of target feed IDs based on the changeset","ref":"Bonfire.Social.Feeds.html#target_feeds/3-when-given-a-changeset"},{"type":"function","title":"When given an object: - Bonfire.Social.Feeds.target_feeds/3","doc":"> Bonfire.Social.Feeds.target_feeds(object, creator, opts)\n # List of target feed IDs based on the object","ref":"Bonfire.Social.Feeds.html#target_feeds/3-when-given-an-object"},{"type":"type","title":"Bonfire.Social.Feeds.feed_name/0","doc":"Names a predefined feed attached to a user","ref":"Bonfire.Social.Feeds.html#t:feed_name/0"},{"type":"module","title":"Bonfire.Social.Feeds.LiveHandler","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.actions_update_many/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#actions_update_many/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.activity_update_many/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#activity_update_many/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.assign_feed/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#assign_feed/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_assigns_maybe_async/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_assigns_maybe_async/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_assigns_non_live/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_assigns_non_live/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_default_assigns/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_default_assigns/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_extra_preloads_list/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_extra_preloads_list/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_live_update_many_preloads?/0","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_live_update_many_preloads?/0"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_info/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_info/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.insert_feed/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#insert_feed/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.load_user_feed_assigns/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#load_user_feed_assigns/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.load_user_feed_assigns/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#load_user_feed_assigns/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.object_preloads/0","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#object_preloads/0"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_feed/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_feed/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_fetch_assign_default/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_fetch_assign_default/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_opts/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_opts/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.preload_activity_and_object_assocs/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#preload_activity_and_object_assocs/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.remove_activity/1","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#remove_activity/1"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.reply_to_activity/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#reply_to_activity/2"},{"type":"macro","title":"Bonfire.Social.Feeds.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.user_feed_assign_or_load_async/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#user_feed_assign_or_load_async/4"},{"type":"module","title":"Bonfire.Social.Flags","doc":"Flagging functionality\n\nThis module handles flagging (reporting an activity or object to moderators and/or admins). It includes creating, querying, and managing flags, as well as handling federation through ActivityPub.\n\nFlags are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Flags.html"},{"type":"function","title":"Bonfire.Social.Flags.ap_publish_activity/3","doc":"Publishes a flag activity to ActivityPub.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.ap_publish_activity/3","doc":"- `subject`: The subject (flagger) of the flag.\n- `_verb`: The verb associated with the flag (unused).\n- `flag`: The flag to publish.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.ap_publish_activity/3","doc":"The result of the ActivityPub publish operation.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.ap_publish_activity/3","doc":"iex> subject = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flag = %Bonfire.Data.Social.Flag{}\n iex> Bonfire.Social.Flags.ap_publish_activity(subject, :flag, flag)\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.ap_receive_activity/3","doc":"Receives a flag activity from ActivityPub for multiple objects.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.ap_receive_activity/3","doc":"- `creator`: The creator of the flag.\n- `activity`: The ActivityPub activity.\n- `object`: An object or list of objects to be flagged.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.ap_receive_activity/3","doc":"A tuple containing the result of the flag operation.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.ap_receive_activity/3","doc":"iex> creator = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Flag\"}}\n iex> objects = [%{pointer_id: \"post456\"}, %{pointer_id: \"post789\"}]\n iex> Bonfire.Social.Flags.ap_receive_activity(creator, activity, objects)\n {:ok, [%Bonfire.Data.Social.Flag{}, %Bonfire.Data.Social.Flag{}]}","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.by_flagged/1","doc":"Retrieves flags of a specific flagged object.","ref":"Bonfire.Social.Flags.html#by_flagged/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.by_flagged/1","doc":"- `object`: The object to query flags for.","ref":"Bonfire.Social.Flags.html#by_flagged/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.by_flagged/1","doc":"A list of flags for the given object.","ref":"Bonfire.Social.Flags.html#by_flagged/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.by_flagged/1","doc":"iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.by_flagged(object)\n [%Bonfire.Data.Social.Flag{}, ...]","ref":"Bonfire.Social.Flags.html#by_flagged/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.by_flagger/1","doc":"Retrieves flags created by a specific user.","ref":"Bonfire.Social.Flags.html#by_flagger/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.by_flagger/1","doc":"- `subject`: The flagger to query flags for.","ref":"Bonfire.Social.Flags.html#by_flagger/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.by_flagger/1","doc":"A list of flags created by the subject.","ref":"Bonfire.Social.Flags.html#by_flagger/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.by_flagger/1","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> Bonfire.Social.Flags.by_flagger(flagger)\n [%Bonfire.Data.Social.Flag{}, ...]","ref":"Bonfire.Social.Flags.html#by_flagger/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.federation_module/0","doc":"","ref":"Bonfire.Social.Flags.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Flags.flag/3","doc":"Records a flag.","ref":"Bonfire.Social.Flags.html#flag/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.flag/3","doc":"- `flagger`: The user creating the flag.\n- `flagged`: The object being flagged.\n- `opts`: Additional options (optional).","ref":"Bonfire.Social.Flags.html#flag/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.flag/3","doc":"A tuple containing the created flag or an error.","ref":"Bonfire.Social.Flags.html#flag/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.flag/3","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flagged = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.flag(flagger, flagged)\n {:ok, %Bonfire.Data.Social.Flag{}}","ref":"Bonfire.Social.Flags.html#flag/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.flagged?/2","doc":"Checks if a user has flagged an object.","ref":"Bonfire.Social.Flags.html#flagged?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.flagged?/2","doc":"- `user`: The user to check.\n- `object`: The object to check.","ref":"Bonfire.Social.Flags.html#flagged?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.flagged?/2","doc":"Boolean indicating whether the user has flagged the object.","ref":"Bonfire.Social.Flags.html#flagged?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.flagged?/2","doc":"iex> user = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.flagged?(user, object)\n false","ref":"Bonfire.Social.Flags.html#flagged?/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.get/3","doc":"Retrieves a flag by subject and object.","ref":"Bonfire.Social.Flags.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.get/3","doc":"- `subject`: The subject (flagger) of the flag.\n- `object`: The object being flagged.\n- `opts`: Additional options (optional).","ref":"Bonfire.Social.Flags.html#get/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.get/3","doc":"The flag if found, otherwise an error tuple.","ref":"Bonfire.Social.Flags.html#get/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.get/3","doc":"iex> Bonfire.Social.Flags.get(subject, object)\n {:ok, %Bonfire.Data.Social.Flag{}}","ref":"Bonfire.Social.Flags.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.get!/3","doc":"Retrieves a flag by subject and object, raising an error if not found.","ref":"Bonfire.Social.Flags.html#get!/3"},{"type":"function","title":"Bonfire.Social.Flags.instance_moderators/0","doc":"Retrieves instance moderators.","ref":"Bonfire.Social.Flags.html#instance_moderators/0"},{"type":"function","title":"Returns - Bonfire.Social.Flags.instance_moderators/0","doc":"A list of instance moderators.","ref":"Bonfire.Social.Flags.html#instance_moderators/0-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.instance_moderators/0","doc":"iex> Bonfire.Social.Flags.instance_moderators()\n [%Bonfire.Data.Identity.User{}, ...]","ref":"Bonfire.Social.Flags.html#instance_moderators/0-examples"},{"type":"function","title":"Bonfire.Social.Flags.list/1","doc":"Lists flags based on given options.","ref":"Bonfire.Social.Flags.html#list/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list/1","doc":"A paginated list of flags.","ref":"Bonfire.Social.Flags.html#list/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list/1","doc":"iex> Bonfire.Social.Flags.list(scope: :instance)\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_by/2","doc":"Lists flags created by a specific user.","ref":"Bonfire.Social.Flags.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_by/2","doc":"- `by_user`: The user or user ID to filter flags by.\n- `opts`: Options for filtering and pagination (optional).","ref":"Bonfire.Social.Flags.html#list_by/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_by/2","doc":"A paginated list of flags created by the specified user.","ref":"Bonfire.Social.Flags.html#list_by/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_by/2","doc":"iex> Bonfire.Social.Flags.list_by(\"user123\")\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_my/1","doc":"Lists flags created by the current user.","ref":"Bonfire.Social.Flags.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_my/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list_my/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_my/1","doc":"A paginated list of flags created by the current user.","ref":"Bonfire.Social.Flags.html#list_my/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_my/1","doc":"iex> Bonfire.Social.Flags.list_my(current_user: %Bonfire.Data.Identity.User{id: \"user123\"})\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_of/2","doc":"Lists flags for a specific object.","ref":"Bonfire.Social.Flags.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_of/2","doc":"- `object`: The object or object ID to filter flags by.\n- `opts`: Options for filtering and pagination (optional).","ref":"Bonfire.Social.Flags.html#list_of/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_of/2","doc":"A paginated list of flags for the specified object.","ref":"Bonfire.Social.Flags.html#list_of/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_of/2","doc":"iex> Bonfire.Social.Flags.list_of(\"post456\")\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_paginated/2","doc":"","ref":"Bonfire.Social.Flags.html#list_paginated/2"},{"type":"function","title":"Bonfire.Social.Flags.list_preloaded/1","doc":"Lists flags with preloaded associations.","ref":"Bonfire.Social.Flags.html#list_preloaded/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_preloaded/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list_preloaded/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_preloaded/1","doc":"A paginated list of flags with preloaded associations.","ref":"Bonfire.Social.Flags.html#list_preloaded/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_preloaded/1","doc":"iex> Bonfire.Social.Flags.list_preloaded(scope: :instance)\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{object: %{created: %{creator: %{}}}}, ...]}","ref":"Bonfire.Social.Flags.html#list_preloaded/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.moderators/1","doc":"Retrieves moderators for a given object.","ref":"Bonfire.Social.Flags.html#moderators/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.moderators/1","doc":"- `object`: The object to find moderators for.","ref":"Bonfire.Social.Flags.html#moderators/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Flags.moderators/1","doc":"iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.moderators(object)","ref":"Bonfire.Social.Flags.html#moderators/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.query/2","doc":"","ref":"Bonfire.Social.Flags.html#query/2"},{"type":"function","title":"Bonfire.Social.Flags.query_module/0","doc":"","ref":"Bonfire.Social.Flags.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Flags.schema_module/0","doc":"","ref":"Bonfire.Social.Flags.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Flags.unflag/2","doc":"Removes a flag created by a specific user on an object, if one exists.","ref":"Bonfire.Social.Flags.html#unflag/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.unflag/2","doc":"- `flagger`: The user who created the flag.\n- `flagged`: The flagged object or ID.","ref":"Bonfire.Social.Flags.html#unflag/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.unflag/2","doc":"The result of the unflag operation.","ref":"Bonfire.Social.Flags.html#unflag/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.unflag/2","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flagged = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.unflag(flagger, flagged)\n :ok","ref":"Bonfire.Social.Flags.html#unflag/2-examples"},{"type":"module","title":"Bonfire.Social.Flags.LiveHandler","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Flags.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Flags.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Graph","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Following\n- Follow Requests\n- Social graph analysis","ref":"Bonfire.Social.Graph.html"},{"type":"module","title":"Handy commands - Bonfire.Social.Graph","doc":"","ref":"Bonfire.Social.Graph.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Social.Graph","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.Graph.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Social.Graph.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Social.Graph.html#child_spec/1"},{"type":"function","title":"Bonfire.Social.Graph.graph_add/3","doc":"Adds a relationship to the graph.","ref":"Bonfire.Social.Graph.html#graph_add/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_add/3","doc":"iex> Bonfire.Social.Graph.graph_add(\"subject_id\", \"object_id\", \"type\")\n :ok","ref":"Bonfire.Social.Graph.html#graph_add/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_clear/0","doc":"Clears the graph database by deleting all nodes and relationships. Use with care!","ref":"Bonfire.Social.Graph.html#graph_clear/0"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_clear/0","doc":"iex> Bonfire.Social.Graph.graph_clear()\n :ok","ref":"Bonfire.Social.Graph.html#graph_clear/0-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_conn/0","doc":"Retrieves the graph DB connection.","ref":"Bonfire.Social.Graph.html#graph_conn/0"},{"type":"function","title":"Bonfire.Social.Graph.graph_distance/2","doc":"Calculates the distance between two nodes in the graph.","ref":"Bonfire.Social.Graph.html#graph_distance/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_distance/2","doc":"iex> Bonfire.Social.Graph.graph_distance(\"subject_id\", \"object_id\")\n {:ok, length}","ref":"Bonfire.Social.Graph.html#graph_distance/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_distances/1","doc":"Retrieves distances from a given subject to all other nodes.","ref":"Bonfire.Social.Graph.html#graph_distances/1"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_distances/1","doc":"iex> Bonfire.Social.Graph.graph_distances(\"subject_id\")\n [{id, length}]","ref":"Bonfire.Social.Graph.html#graph_distances/1-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_query/2","doc":"Executes a query on the graph database.","ref":"Bonfire.Social.Graph.html#graph_query/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_query/2","doc":"iex> Bonfire.Social.Graph.graph_query(\"MATCH (n) RETURN n\")\n {:ok, result}","ref":"Bonfire.Social.Graph.html#graph_query/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_remove/3","doc":"Removes a relationship from the graph.","ref":"Bonfire.Social.Graph.html#graph_remove/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_remove/3","doc":"iex> Bonfire.Social.Graph.graph_remove(\"subject_id\", \"object_id\", \"type\")\n :ok","ref":"Bonfire.Social.Graph.html#graph_remove/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.init/1","doc":"Initializes the GenServer and calls `init_and_load/0`","ref":"Bonfire.Social.Graph.html#init/1"},{"type":"function","title":"Bonfire.Social.Graph.init_and_load/0","doc":"Initializes the graph DB and calls `load_from_db/0`","ref":"Bonfire.Social.Graph.html#init_and_load/0"},{"type":"function","title":"Bonfire.Social.Graph.load_from_db/0","doc":"Loads follows from the SQL DB and stores them the in-memory graph DB.","ref":"Bonfire.Social.Graph.html#load_from_db/0"},{"type":"function","title":"Bonfire.Social.Graph.maybe_applications/0","doc":"Retrieves the possible applications to be started based on configuration.\n\nReturns a list of OTP applications (including the `Bolt.Sips` Neo4j driver to connect to the graph database) or an empty list if disabled.","ref":"Bonfire.Social.Graph.html#maybe_applications/0"},{"type":"function","title":"Bonfire.Social.Graph.start_link/1","doc":"Starts the GenServer link.","ref":"Bonfire.Social.Graph.html#start_link/1"},{"type":"module","title":"Bonfire.Social.Graph.Aliases","doc":"Implements aliases (i.e. \"also known as\") for characters in Bonfire.\n\nThis module provides functionality for managing aliases, including adding,\nremoving, and querying aliases. It also implements ActivityPub federation\nfor the \"Move\" activity.","ref":"Bonfire.Social.Graph.Aliases.html"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.add/3","doc":"Adds an alias to a user, linking it to a another character.","ref":"Bonfire.Social.Graph.Aliases.html#add/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.add/3","doc":"iex> Bonfire.Social.Graph.Aliases.add(user, target)\n {:ok, %Alias{}}","ref":"Bonfire.Social.Graph.Aliases.html#add/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_by_object/2","doc":"Retrieves all aliases for a given object (i.e target).","ref":"Bonfire.Social.Graph.Aliases.html#all_by_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_by_object/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_by_object(object)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_by_subject/2","doc":"Retrieves all aliases for a given subject.","ref":"Bonfire.Social.Graph.Aliases.html#all_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_by_subject/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_by_subject(user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_objects_by_subject/2","doc":"Retrieves all aliased objects for a given subject.","ref":"Bonfire.Social.Graph.Aliases.html#all_objects_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_objects_by_subject/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_objects_by_subject(user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_subjects_by_object/2","doc":"Retrieves all alias subjects for a given object (i.e target).","ref":"Bonfire.Social.Graph.Aliases.html#all_subjects_by_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_subjects_by_object/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_subjects_by_object(object)\n [%Subject{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_subjects_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.also_known_as?/2","doc":"Checks if a local user is also known as the target.","ref":"Bonfire.Social.Graph.Aliases.html#also_known_as?/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.also_known_as?/2","doc":"iex> Bonfire.Social.Graph.Aliases.also_known_as?(\"http://example.com/user\", target)\n true\n\n iex> Bonfire.Social.Graph.Aliases.also_known_as?(%User{}, target)\n true","ref":"Bonfire.Social.Graph.Aliases.html#also_known_as?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a move operation.","ref":"Bonfire.Social.Graph.Aliases.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.ap_publish_activity/3","doc":"iex> Bonfire.Social.Graph.Aliases.ap_publish_activity(subject, :move, target)","ref":"Bonfire.Social.Graph.Aliases.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.ap_receive_activity/3","doc":"Processes an incoming ActivityPub Move activity.","ref":"Bonfire.Social.Graph.Aliases.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.ap_receive_activity/3","doc":"iex> Bonfire.Social.Graph.Aliases.ap_receive_activity(subject, activity, origin_object)\n {:ok, :moved}","ref":"Bonfire.Social.Graph.Aliases.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.exists?/2","doc":"Checks if an alias relationship exists between a subject and a target.","ref":"Bonfire.Social.Graph.Aliases.html#exists?/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.exists?/2","doc":"iex> Bonfire.Social.Graph.Aliases.exists?(subject, target)\n true","ref":"Bonfire.Social.Graph.Aliases.html#exists?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.federation_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.get/3","doc":"Retrieves an alias between a subject and an object, if one exists","ref":"Bonfire.Social.Graph.Aliases.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.get/3","doc":"iex> Bonfire.Social.Graph.Aliases.get(subject, object)\n {:ok, %Alias{}}","ref":"Bonfire.Social.Graph.Aliases.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.get!/3","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#get!/3"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_aliased/2","doc":"Lists entities who aliased a a given user.","ref":"Bonfire.Social.Graph.Aliases.html#list_aliased/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_aliased/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_aliased(user)\n [%AliasedEntity{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_aliased/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_aliases/2","doc":"Lists aliases for a given user.","ref":"Bonfire.Social.Graph.Aliases.html#list_aliases/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_aliases/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_aliases(user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_aliases/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_my_aliased/2","doc":"Lists entities who aliased the current user.","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliased/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_my_aliased/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_my_aliased(current_user)\n [%AliasedEntity{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliased/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_my_aliases/2","doc":"Lists aliases for the current user.","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliases/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_my_aliases/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_my_aliases(current_user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliases/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.move/2","doc":"Initiates a move operation for migrating a local user to another instance.","ref":"Bonfire.Social.Graph.Aliases.html#move/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.move/2","doc":"iex> Bonfire.Social.Graph.Aliases.move(subject, target)\n {:ok, :moved}","ref":"Bonfire.Social.Graph.Aliases.html#move/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.query/2","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#query/2"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.query_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.remove/2","doc":"Removes an alias relationship between a user and a target.","ref":"Bonfire.Social.Graph.Aliases.html#remove/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.remove/2","doc":"iex> Bonfire.Social.Graph.Aliases.remove(user, target)","ref":"Bonfire.Social.Graph.Aliases.html#remove/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.schema_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#schema_module/0"},{"type":"module","title":"Bonfire.Social.Graph.Aliases.LiveHandler","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Graph.Aliases.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Graph.Fake","doc":"","ref":"Bonfire.Social.Graph.Fake.html"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_incoming_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_incoming_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_outgoing_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_outgoing_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Social.Graph.Follows","doc":"Module for handling follow relationships in the Bonfire social graph.","ref":"Bonfire.Social.Graph.Follows.html"},{"type":"function","title":"Bonfire.Social.Graph.Follows.accept/2","doc":"Accepts a follow request, publishes to feeds and federates.","ref":"Bonfire.Social.Graph.Follows.html#accept/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.accept/2","doc":"- `request`: A `Request` struct or its ID\n- `opts`: Additional options including the current user","ref":"Bonfire.Social.Graph.Follows.html#accept/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.accept/2","doc":"`{:ok, follow}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#accept/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.accept/2","doc":"iex> Bonfire.Social.Graph.Follows.accept(request, current_user: acceptor)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#accept/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.accept_from/2","doc":"Accepts a follow request, publishes to feeds and federates.","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.accept_from/2","doc":"- `subject`: The requester\n- `opts`: Additional options including the current user","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.accept_from/2","doc":"`{:ok, follow}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.accept_from/2","doc":"iex> Bonfire.Social.Graph.Follows.accept_from(requester, current_user: acceptor)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_by_object/2","doc":"Lists all follows for an object.","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"- `user`: The object whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"List of follows.","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"iex> Bonfire.Social.Graph.Follows.all_by_object(user)\n [%Follow{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"Lists all follows by a subject.","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"- `user`: The user whose follows to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"List of follows.","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"iex> Bonfire.Social.Graph.Follows.all_by_subject(user)\n [%Follow{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"Lists all followed outboxes for a user.","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"- `user`: The user whose followed outboxes to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"List of followed outbox IDs.","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user)\n [\"outbox_id_1\", ...]\n\n iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user, include_followed_categories: true)\n [\"outbox_id_1\", \"category_outbox_id_1\", ...]","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"Lists all objects followed by a subject.","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"- `user`: The user whose followed objects to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"iex> Bonfire.Social.Graph.Follows.all_objects_by_subject(user)\n [%FollowedObject{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"Lists all subjects following an object.","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"- `user`: The object whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"List of follower subjects.","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"iex> Bonfire.Social.Graph.Follows.all_subjects_by_object(user)\n [%FollowerSubject{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a follow-related action.","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"- `subject`: The subject of the activity\n- `verb`: The verb of the activity (e.g., :delete)\n- `follow`: The follow object or ID","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"`{:ok, activity}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"iex> Bonfire.Social.Graph.Follows.ap_publish_activity(user, :delete, follow)\n {:ok, %ActivityPub.Activity{}}","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"Receives and processes an ActivityPub activity related to follows.","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"- `follower`: The follower\n- `activity`: The ActivityPub activity\n- `object`: The object of the activity","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"`{:ok, result}` on success, `{:ignore, reason}` on failure or when ignored.","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"iex> Bonfire.Social.Graph.Follows.ap_receive_activity(follower, activity, object)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.federation_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.follow/3","doc":"Follows someone or something. In case of success, publishes to feeds and federates.\n\nIf the user is not permitted to follow the object, or the object is\na remote actor, it will instead send a request to follow.","ref":"Bonfire.Social.Graph.Follows.html#follow/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.follow/3","doc":"- `user`: The user who wants to follow\n- `object`: The object to be followed\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#follow/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.follow/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#follow/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.follow/3","doc":"iex> Bonfire.Social.Graph.Follows.follow(me, user2)\n {:ok, %Follow{}}\n\n iex> Bonfire.Social.Graph.Follows.follow(me, user3)\n {:ok, %Request{}}","ref":"Bonfire.Social.Graph.Follows.html#follow/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.following?/2","doc":"Checks if a subject is following an object.","ref":"Bonfire.Social.Graph.Follows.html#following?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.following?/2","doc":"- `subject`: The subject (follower)\n- `object`: The object (followed)","ref":"Bonfire.Social.Graph.Follows.html#following?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.following?/2","doc":"Boolean indicating if the subject is following the object.","ref":"Bonfire.Social.Graph.Follows.html#following?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.following?/2","doc":"iex> Bonfire.Social.Graph.Follows.following?(user, profile)\n true","ref":"Bonfire.Social.Graph.Follows.html#following?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.get/3","doc":"Gets a follow relationship between a subject and an object, if one exists.","ref":"Bonfire.Social.Graph.Follows.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.get/3","doc":"- `subject`: The subject (follower)\n- `object`: The object (followed)\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#get/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.get/3","doc":"`{:ok, follow}` if found, `{:error, :not_found}` otherwise.","ref":"Bonfire.Social.Graph.Follows.html#get/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.get/3","doc":"iex> Bonfire.Social.Graph.Follows.get(user, profile)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.get!/3","doc":"Gets a follow relationship between a subject and an object, raising an error if not found.","ref":"Bonfire.Social.Graph.Follows.html#get!/3"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ignore/2","doc":"Ignores a follow request.","ref":"Bonfire.Social.Graph.Follows.html#ignore/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ignore/2","doc":"- `request`: The request to ignore\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ignore/2","doc":"Result of the ignore operation.","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ignore/2","doc":"iex> Bonfire.Social.Graph.Follows.ignore(request, current_user: user)\n {:ok, ignored_request}","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_followed/2","doc":"Lists followed objects for a given user.","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_followed/2","doc":"- `user`: The user whose followed objects to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_followed/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_followed/2","doc":"iex> Bonfire.Social.Graph.Follows.list_followed(user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_followers/2","doc":"Lists followers for a given user.","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_followers/2","doc":"- `user`: The user whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_followers/2","doc":"List of followers.","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_followers/2","doc":"iex> Bonfire.Social.Graph.Follows.list_followers(user)\n [%User{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"Lists followed objects for the current user.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"- `current_user`: The current user\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"iex> Bonfire.Social.Graph.Follows.list_my_followed(current_user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"Lists followers for the current user.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"- `current_user`: The current user\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"List of followers.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"iex> Bonfire.Social.Graph.Follows.list_my_followers(current_user)\n [%User{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.query/2","doc":"Queries follows based on filters and options.","ref":"Bonfire.Social.Graph.Follows.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.query/2","doc":"- `filters`: List of filters to apply to the query\n- `opts`: Additional query options","ref":"Bonfire.Social.Graph.Follows.html#query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.query/2","doc":"An Ecto query for follows.","ref":"Bonfire.Social.Graph.Follows.html#query/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.query/2","doc":"iex> Bonfire.Social.Graph.Follows.query([my: :object], current_user: user)\n # following\n\n iex> Bonfire.Social.Graph.Follows.query([my: :followers], current_user: user)\n # followers","ref":"Bonfire.Social.Graph.Follows.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.query_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.requested?/2","doc":"Checks if a follow request has been made.","ref":"Bonfire.Social.Graph.Follows.html#requested?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.requested?/2","doc":"- `subject`: The subject (requester)\n- `object`: The object (requested)","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.requested?/2","doc":"Boolean indicating if a follow request exists.","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.requested?/2","doc":"iex> Bonfire.Social.Graph.Follows.requested?(user, profile)\n true","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.schema_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.unfollow/3","doc":"Unfollows someone or something.","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.unfollow/3","doc":"- `user`: The user who wants to unfollow\n- `object`: The object to be unfollowed\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.unfollow/3","doc":"Result of the unfollow operation.","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.unfollow/3","doc":"iex> Bonfire.Social.Graph.Follows.unfollow(me, user2)\n {:ok, deleted_follow}","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-examples"},{"type":"module","title":"Bonfire.Social.Graph.Follows.LiveHandler","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Graph.Follows.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Graph.Import","doc":"","ref":"Bonfire.Social.Graph.Import.html"},{"type":"function","title":"Bonfire.Social.Graph.Import.import_from_csv_file/3","doc":"Import follows, ghosts, silences, or blocks from a CSV file.","ref":"Bonfire.Social.Graph.Import.html#import_from_csv_file/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.import_from_csv_file/3","doc":"iex> import_from_csv_file(:follows, user, \"path/to/file.csv\")","ref":"Bonfire.Social.Graph.Import.html#import_from_csv_file/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Import.perform/1","doc":"Perform the queued job based on the operation and user.","ref":"Bonfire.Social.Graph.Import.html#perform/1"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.perform/1","doc":"iex> perform(%{args: %{\"op\" => \"follows_import\", \"user_id\" => \"user1\", \"identifier\" => \"id1\"}})\n :ok","ref":"Bonfire.Social.Graph.Import.html#perform/1-examples"},{"type":"function","title":"Bonfire.Social.Graph.Import.perform/3","doc":"Perform an import operation for the user.","ref":"Bonfire.Social.Graph.Import.html#perform/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.perform/3","doc":"iex> perform(\"follows_import\", user, \"identifier\")","ref":"Bonfire.Social.Graph.Import.html#perform/3-examples"},{"type":"module","title":"Bonfire.Social.Graph.Integration","doc":"","ref":"Bonfire.Social.Graph.Integration.html"},{"type":"function","title":"Bonfire.Social.Graph.Integration.declared_extension/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Social.Graph.Integration.mailer/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Social.Graph.Integration.repo/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Social.Likes","doc":"Mutate, query, and federate likes (indicating appreciation for an activity or object).\n\nThis module provides functionality to manage and query likes, including creating, deleting, and listing likes.\nIt also handles federation of likes using ActivityPub.\n\nLikes are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Likes.html"},{"type":"function","title":"Bonfire.Social.Likes.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a like.","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.ap_publish_activity/3","doc":"- subject: The subject of the like activity.\n - verb: The verb of the activity (:delete or other).\n - like: The like object.","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.ap_publish_activity/3","doc":"iex> Bonfire.Social.Likes.ap_publish_activity(%User{id: \"user123\"}, :create, %Like{})\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.ap_receive_activity/3","doc":"Receives and processes an ActivityPub like activity.","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.ap_receive_activity/3","doc":"- liker: The user performing the like action.\n - activity: The ActivityPub activity data.\n - object: The object being liked.","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.ap_receive_activity/3","doc":"iex> activity = %{data: %{\"type\" => \"Like\"}}\n iex> object = %ActivityPub.Object{}\n iex> Bonfire.Social.Likes.ap_receive_activity(%User{id: \"user123\"}, activity, object)\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.by_liked/2","doc":"Lists likes for a specific object.","ref":"Bonfire.Social.Likes.html#by_liked/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.by_liked/2","doc":"- object: The object that was liked.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#by_liked/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.by_liked/2","doc":"iex> Bonfire.Social.Likes.by_liked(%Post{id: \"post456\"})\n [%Like{}, ...]","ref":"Bonfire.Social.Likes.html#by_liked/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.by_liker/2","doc":"Lists likes created by a specific subject.","ref":"Bonfire.Social.Likes.html#by_liker/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.by_liker/2","doc":"- subject: The subject (usually a user) who created the likes.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#by_liker/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.by_liker/2","doc":"iex> Bonfire.Social.Likes.by_liker(%User{id: \"user123\"})\n [%Like{}, ...]","ref":"Bonfire.Social.Likes.html#by_liker/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.count/2","doc":"Counts likes based on filters or for a specific user-object pair.","ref":"Bonfire.Social.Likes.html#count/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.count/2","doc":"- filters: A list of filters to apply when counting likes.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#count/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.count/2","doc":"iex> Bonfire.Social.Likes.count([object: %Post{id: \"post456\"}])\n 5\n\n iex> Bonfire.Social.Likes.count(%User{id: \"user123\"}, %Post{id: \"post456\"})\n 1","ref":"Bonfire.Social.Likes.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.do_like/3","doc":"","ref":"Bonfire.Social.Likes.html#do_like/3"},{"type":"function","title":"Bonfire.Social.Likes.federation_module/0","doc":"","ref":"Bonfire.Social.Likes.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Likes.get/3","doc":"Retrieves a Like edge between a subject and an object.","ref":"Bonfire.Social.Likes.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.get/3","doc":"- subject: The subject (usually a user) of the Like edge.\n - object: The object that was liked.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.get/3","doc":"iex> Bonfire.Social.Likes.get(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.get!/3","doc":"Similar to `get/3`, but raises an error if the Like edge is not found.","ref":"Bonfire.Social.Likes.html#get!/3"},{"type":"function","title":"Bonfire.Social.Likes.get_or_create_emoji/2","doc":"","ref":"Bonfire.Social.Likes.html#get_or_create_emoji/2"},{"type":"function","title":"Bonfire.Social.Likes.like/3","doc":"Records a like for an object.","ref":"Bonfire.Social.Likes.html#like/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.like/3","doc":"- liker: The user creating the like.\n - object: The object to be liked.\n - opts: Additional options for creating the like (optional).","ref":"Bonfire.Social.Likes.html#like/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.like/3","doc":"iex> Bonfire.Social.Likes.like(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#like/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.liked?/2","doc":"Checks if a user has liked an object.","ref":"Bonfire.Social.Likes.html#liked?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.liked?/2","doc":"- user: The user to check.\n - object: The object to check for likes.","ref":"Bonfire.Social.Likes.html#liked?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.liked?/2","doc":"iex> Bonfire.Social.Likes.liked?(%User{id: \"user123\"}, %Post{id: \"post456\"})\n true","ref":"Bonfire.Social.Likes.html#liked?/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_by/2","doc":"Lists likes created by a specific user.","ref":"Bonfire.Social.Likes.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_by/2","doc":"- by_user: The user whose likes to list.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#list_by/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_by/2","doc":"iex> Bonfire.Social.Likes.list_by(%User{id: \"user123\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_my/1","doc":"List the current user's likes.","ref":"Bonfire.Social.Likes.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_my/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#list_my/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_my/1","doc":"iex> Bonfire.Social.Likes.list_my(current_user: %User{id: \"user123\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_of/2","doc":"Lists likers of a specific object or objects.","ref":"Bonfire.Social.Likes.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_of/2","doc":"- object: The object or objects to find likers for.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#list_of/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_of/2","doc":"iex> Bonfire.Social.Likes.list_of(%Post{id: \"post456\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_paginated/2","doc":"","ref":"Bonfire.Social.Likes.html#list_paginated/2"},{"type":"function","title":"Bonfire.Social.Likes.query/2","doc":"Creates a query for Like edges based on the given filters and options.","ref":"Bonfire.Social.Likes.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.query/2","doc":"- filters: A keyword list of filters to apply to the query.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.query/2","doc":"iex> filters = [subject: %User{id: \"user123\"}]\n iex> opts = [limit: 10]\n iex> Bonfire.Social.Likes.query(filters, opts)\n #Ecto.Query<...>","ref":"Bonfire.Social.Likes.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.query_module/0","doc":"","ref":"Bonfire.Social.Likes.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Likes.schema_module/0","doc":"","ref":"Bonfire.Social.Likes.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Likes.unlike/3","doc":"Removes a like for an object.","ref":"Bonfire.Social.Likes.html#unlike/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.unlike/3","doc":"- liker: The user removing the like.\n - object: The object to be unliked.\n - opts: Additional options (optional).","ref":"Bonfire.Social.Likes.html#unlike/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.unlike/3","doc":"iex> Bonfire.Social.Likes.unlike(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, nil}","ref":"Bonfire.Social.Likes.html#unlike/3-examples"},{"type":"module","title":"Bonfire.Social.Likes.LiveHandler","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.do_like/3","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#do_like/3"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.liker_count/1","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#liker_count/1"},{"type":"macro","title":"Bonfire.Social.Likes.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Objects","doc":"Generic helpers for querying and mutating objects.\n\nThis module provides functions for working with social objects, including:\n- Casting common associations when creating objects\n- Reading and querying objects\n- Deleting objects\n- Publishing and setting boundaries\n- Handling ActivityPub federation","ref":"Bonfire.Social.Objects.html"},{"type":"function","title":"Bonfire.Social.Objects.ap_maybe_delete/2","doc":"","ref":"Bonfire.Social.Objects.html#ap_maybe_delete/2"},{"type":"function","title":"Bonfire.Social.Objects.ap_receive_activity/3","doc":"","ref":"Bonfire.Social.Objects.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Social.Objects.as_permitted_for/3","doc":"","ref":"Bonfire.Social.Objects.html#as_permitted_for/3"},{"type":"function","title":"Bonfire.Social.Objects.care_closures/1","doc":"Retrieves care closures for the given IDs.","ref":"Bonfire.Social.Objects.html#care_closures/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.care_closures/1","doc":"- `ids`: A list of IDs to find care closures for.","ref":"Bonfire.Social.Objects.html#care_closures/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.care_closures/1","doc":"iex> care_closures([\"id1\", \"id2\"])","ref":"Bonfire.Social.Objects.html#care_closures/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.care_taken/1","doc":"Retrieves a list of objects that are taken care of by the given caretaker IDs.","ref":"Bonfire.Social.Objects.html#care_taken/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.care_taken/1","doc":"- `ids`: A list of caretaker IDs.","ref":"Bonfire.Social.Objects.html#care_taken/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.care_taken/1","doc":"iex> care_taken([\"caretaker1\", \"caretaker2\"])\n [%Object{}, %Object{}]","ref":"Bonfire.Social.Objects.html#care_taken/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast/4","doc":"Casts various attributes for an object changeset.\n\nHandles casting:\n- Creator\n- Caretaker\n- Threaded replies (when present)\n- Tags/Mentions (when present)\n- ACLs\n- Activity","ref":"Bonfire.Social.Objects.html#cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast/4","doc":"iex> cast(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_acl/3","doc":"","ref":"Bonfire.Social.Objects.html#cast_acl/3"},{"type":"function","title":"Bonfire.Social.Objects.cast_basic/4","doc":"Casts basic attributes for an object changeset.\n\nHandles casting:\n- Creator\n- Caretaker\n- ACLs","ref":"Bonfire.Social.Objects.html#cast_basic/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_basic/4","doc":"iex> cast_basic(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_basic/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_caretaker/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_caretaker/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_creator/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_creator/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_creator_caretaker/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_creator_caretaker/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_mini/4","doc":"Casts minimal attributes for an object changeset.\n\nHandles casting:\n- ACLs","ref":"Bonfire.Social.Objects.html#cast_mini/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_mini/4","doc":"iex> cast_mini(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_mini/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_publish/4","doc":"Casts attributes for publishing an object.\n\nHandles casting:\n- ACLs\n- Activity\n- Feed Publishes","ref":"Bonfire.Social.Objects.html#cast_publish/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_publish/4","doc":"iex> cast_publish(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_publish/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_sensitivity/2","doc":"Casts the object sensitivity on a changeset.","ref":"Bonfire.Social.Objects.html#cast_sensitivity/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_sensitivity/2","doc":"iex> cast_sensitivity(%Changeset{}, true)\n %Changeset{}","ref":"Bonfire.Social.Objects.html#cast_sensitivity/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.changeset_named/2","doc":"","ref":"Bonfire.Social.Objects.html#changeset_named/2"},{"type":"function","title":"Bonfire.Social.Objects.delete/2","doc":"Deletes an object if the current users (provided in opts) has permission to, along with related associations (such as mixins).","ref":"Bonfire.Social.Objects.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.delete/2","doc":"iex> delete(%Object{}, current_user: me)\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#delete/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.delete_apply_error/2","doc":"","ref":"Bonfire.Social.Objects.html#delete_apply_error/2"},{"type":"function","title":"Bonfire.Social.Objects.delete_caretaken/1","doc":"Deletes objects that are taken care of by the given main object(s).\n\nThis function recursively deletes caretakers and their objects, except for the original object (i.e if Alice is a user who takes care of some posts but also a group that in turn takes care of some posts or boosts, it will delete all of those except Alice herself).","ref":"Bonfire.Social.Objects.html#delete_caretaken/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.delete_caretaken/1","doc":"- `main`: The main object or list of objects to start the deletion from.","ref":"Bonfire.Social.Objects.html#delete_caretaken/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.delete_caretaken/1","doc":"iex> delete_caretaken(%Object{id: \"main_id\"})\n {:ok, [%Object{}, %Object{}]}","ref":"Bonfire.Social.Objects.html#delete_caretaken/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.do_delete/2","doc":"","ref":"Bonfire.Social.Objects.html#do_delete/2"},{"type":"function","title":"Bonfire.Social.Objects.federation_module/0","doc":"","ref":"Bonfire.Social.Objects.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Objects.filter/3","doc":"","ref":"Bonfire.Social.Objects.html#filter/3"},{"type":"function","title":"Bonfire.Social.Objects.list_paginated/2","doc":"Lists objects in a paginated manner.","ref":"Bonfire.Social.Objects.html#list_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.list_paginated/2","doc":"iex> list_paginated([type: :post], [])\n %Page{}","ref":"Bonfire.Social.Objects.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.list_query/2","doc":"","ref":"Bonfire.Social.Objects.html#list_query/2"},{"type":"function","title":"Bonfire.Social.Objects.maybe_generic_delete/3","doc":"Attempts a generic deletion of an object, to be used when no specific delete function is defined for a schema.","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.maybe_generic_delete/3","doc":"- `type`: The type of the object to delete.\n- `object`: The object to delete.\n- `options`: A keyword list of options for the deletion.","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.maybe_generic_delete/3","doc":"iex> maybe_generic_delete(MyApp.SomeType, %MyApp.SomeType{}, [])\n {:ok, %MyApp.SomeType{}}","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.maybe_preload_activity_object/2","doc":"","ref":"Bonfire.Social.Objects.html#maybe_preload_activity_object/2"},{"type":"function","title":"Bonfire.Social.Objects.object_creator/1","doc":"Gets the creator of an object (if preloaded)","ref":"Bonfire.Social.Objects.html#object_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.object_creator/1","doc":"iex> object_creator(%Object{})\n %User{}","ref":"Bonfire.Social.Objects.html#object_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.permalink/1","doc":"Gets the permalink for an object.","ref":"Bonfire.Social.Objects.html#permalink/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.permalink/1","doc":"iex> permalink(%{canonical_uri: \"https://example.com/object/123\"})\n \"https://example.com/object/123\"","ref":"Bonfire.Social.Objects.html#permalink/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.preload_creator/1","doc":"Preloads the creator for an object.","ref":"Bonfire.Social.Objects.html#preload_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.preload_creator/1","doc":"iex> preload_creator(%Object{})\n %Object{}","ref":"Bonfire.Social.Objects.html#preload_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.preload_reply_creator/1","doc":"Preloads the reply creator for an object.","ref":"Bonfire.Social.Objects.html#preload_reply_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.preload_reply_creator/1","doc":"iex> preload_reply_creator(%Object{})\n %Object{replied: %{reply_to: ...}}","ref":"Bonfire.Social.Objects.html#preload_reply_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.publish/5","doc":"Publishes an object.","ref":"Bonfire.Social.Objects.html#publish/5"},{"type":"function","title":"Examples - Bonfire.Social.Objects.publish/5","doc":"iex> publish(%User{}, :create, %Object{}, [], __MODULE__)\n {:ok, %Activity{}}","ref":"Bonfire.Social.Objects.html#publish/5-examples"},{"type":"function","title":"Bonfire.Social.Objects.query_base/1","doc":"Returns a basic query over undeleted pointable objects in the system,\noptionally limited to one or more types.","ref":"Bonfire.Social.Objects.html#query_base/1"},{"type":"function","title":"Bonfire.Social.Objects.read/2","doc":"Reads an object by its ID.","ref":"Bonfire.Social.Objects.html#read/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.read/2","doc":"iex> read(\"123\", [])\n {:ok, %{id: \"123\", activity: %{}}}","ref":"Bonfire.Social.Objects.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.reset_preset_boundary/5","doc":"Resets the preset boundary for an object.","ref":"Bonfire.Social.Objects.html#reset_preset_boundary/5"},{"type":"function","title":"Examples - Bonfire.Social.Objects.reset_preset_boundary/5","doc":"iex> reset_preset_boundary(%User{}, %Object{}, \"public\", [], __MODULE__)\n {:ok, %Boundary{}}","ref":"Bonfire.Social.Objects.html#reset_preset_boundary/5-examples"},{"type":"function","title":"Bonfire.Social.Objects.run_epic/3","doc":"Runs an epic for a given type and options.","ref":"Bonfire.Social.Objects.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.run_epic/3","doc":"- `type`: The type of epic to run.\n- `options`: A keyword list of options for the epic.\n- `on`: The key in the epic's assigns to return (default: `:object`).","ref":"Bonfire.Social.Objects.html#run_epic/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.run_epic/3","doc":"iex> run_epic(:delete, [object: %Object{}])\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#run_epic/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_boundaries/4","doc":"Sets boundaries for an object.","ref":"Bonfire.Social.Objects.html#set_boundaries/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_boundaries/4","doc":"iex> set_boundaries(%User{}, %Object{}, [], __MODULE__)\n [boundary: \"public\", to_circles: [], to_feeds: []]","ref":"Bonfire.Social.Objects.html#set_boundaries/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_name/3","doc":"Sets the name/title of an object.","ref":"Bonfire.Social.Objects.html#set_name/3"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_name/3","doc":"iex> set_name(\"123\", \"New Name\", [])\n {:ok, %Object{id: \"123\", named: %{name: \"New Name\"}}}","ref":"Bonfire.Social.Objects.html#set_name/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_sensitivity/2","doc":"Sets the sensitivity of an existing object.","ref":"Bonfire.Social.Objects.html#set_sensitivity/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_sensitivity/2","doc":"iex> set_sensitivity(%Object{sensitive: %{}}, true)\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#set_sensitivity/2-examples"},{"type":"module","title":"Bonfire.Social.Objects.LiveHandler","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.load_object_assigns/1","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#load_object_assigns/1"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.load_object_assigns/2","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#load_object_assigns/2"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.not_found_fallback/3","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#not_found_fallback/3"},{"type":"macro","title":"Bonfire.Social.Objects.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Pins","doc":"Mutate or query pins (which make an activity or object appear at the beginning of feeds or other lists).\n\nThis module provides functionality to manage and query pins, including creating, deleting, and listing pins. \n\nPins are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Pins.html"},{"type":"function","title":"Bonfire.Social.Pins.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a pin.","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.ap_publish_activity/3","doc":"- subject: The subject of the pin activity.\n - verb: The verb of the activity (not used - currently pins are federated out as likes)\n - pin: The `Pin` object.","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.ap_publish_activity/3","doc":"iex> Bonfire.Social.Pins.ap_publish_activity(%User{id: \"user123\"}, :create, %Pin{})\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.by_pinned/2","doc":"Lists pins of a specific object.","ref":"Bonfire.Social.Pins.html#by_pinned/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.by_pinned/2","doc":"- object: The object that was pinned.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#by_pinned/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.by_pinned/2","doc":"iex> Bonfire.Social.Pins.by_pinned(%Post{id: \"post456\"})\n [%Pin{}, ...]","ref":"Bonfire.Social.Pins.html#by_pinned/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.by_pinner/2","doc":"Lists pins by a specific subject.","ref":"Bonfire.Social.Pins.html#by_pinner/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.by_pinner/2","doc":"- subject: The subject (usually a user) who created the pins.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#by_pinner/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.by_pinner/2","doc":"iex> Bonfire.Social.Pins.by_pinner(%User{id: \"user123\"})\n [%Pin{}, ...]","ref":"Bonfire.Social.Pins.html#by_pinner/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.federation_module/0","doc":"","ref":"Bonfire.Social.Pins.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Pins.get/3","doc":"Retrieves a Pin edge between a subject and an object.","ref":"Bonfire.Social.Pins.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.get/3","doc":"- subject: The subject (usually a user) of the Pin edge.\n - object: The object that was pinned.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.get/3","doc":"iex> Bonfire.Social.Pins.get(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Pin{}}","ref":"Bonfire.Social.Pins.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.get!/3","doc":"Similar to `get/3`, but raises an error if the Pin edge is not found.","ref":"Bonfire.Social.Pins.html#get!/3"},{"type":"function","title":"Bonfire.Social.Pins.list_by/2","doc":"Lists pins by a specific user.","ref":"Bonfire.Social.Pins.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_by/2","doc":"- by_user: The user whose pins to list.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#list_by/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_by/2","doc":"iex> Bonfire.Social.Pins.list_by(%User{id: \"user123\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_instance_pins/1","doc":"Lists pins for the instance.","ref":"Bonfire.Social.Pins.html#list_instance_pins/1"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_instance_pins/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Pins.html#list_instance_pins/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_instance_pins/1","doc":"iex> Bonfire.Social.Pins.list_instance_pins(limit: 10)\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_instance_pins/1-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_my/1","doc":"Lists pins for the current user.","ref":"Bonfire.Social.Pins.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_my/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Pins.html#list_my/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_my/1","doc":"iex> Bonfire.Social.Pins.list_my(current_user: %User{id: \"user123\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_of/2","doc":"Lists pinners of a specific object or objects.","ref":"Bonfire.Social.Pins.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_of/2","doc":"- object: The object or objects to find pinners for.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#list_of/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_of/2","doc":"iex> Bonfire.Social.Pins.list_of(%Post{id: \"post456\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.pin/4","doc":"Creates a pin for an object.","ref":"Bonfire.Social.Pins.html#pin/4"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.pin/4","doc":"- pinner: The user creating the pin.\n - object: The object to be pinned.\n - scope: The scope of the pin (eg. `:instance`, optional).\n - opts: Additional options for creating the pin (optional).","ref":"Bonfire.Social.Pins.html#pin/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.pin/4","doc":"iex> Bonfire.Social.Pins.pin(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Pin{}}\n\n iex> Bonfire.Social.Pins.pin(%User{id: \"user123\"}, %Post{id: \"post456\"}, :instance)\n {:ok, %Pin{}}","ref":"Bonfire.Social.Pins.html#pin/4-examples"},{"type":"function","title":"Bonfire.Social.Pins.pinned?/2","doc":"Checks if an object is pinned by the instance.","ref":"Bonfire.Social.Pins.html#pinned?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.pinned?/2","doc":"- scope: The scope to check for pinning (eg. `:instance` or a user)\n - object: The object to check for pinning.","ref":"Bonfire.Social.Pins.html#pinned?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.pinned?/2","doc":"iex> Bonfire.Social.Pins.pinned?(:instance, %Post{id: \"post123\"})\n true\n\n iex> Bonfire.Social.Pins.pinned?(%User{id: \"user123\"}, %Post{id: \"post456\"})\n false","ref":"Bonfire.Social.Pins.html#pinned?/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.query/2","doc":"","ref":"Bonfire.Social.Pins.html#query/2"},{"type":"function","title":"Bonfire.Social.Pins.query_module/0","doc":"","ref":"Bonfire.Social.Pins.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Pins.rank_pin/3","doc":"Sets the rank/position of a pin within a specific scope.","ref":"Bonfire.Social.Pins.html#rank_pin/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.rank_pin/3","doc":"- pin: The pin to be ranked.\n - scope: The scope for ranking (eg. `:instance`).\n - position: The desired position/rank for the pin.","ref":"Bonfire.Social.Pins.html#rank_pin/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.rank_pin/3","doc":"iex> Bonfire.Social.Pins.rank_pin(\"pin123\", :instance, 1)\n {:ok, %Bonfire.Data.Assort.Ranked{}}\n\n iex> Bonfire.Social.Pins.rank_pin(\"pin123\", %User{id: \"user456\"}, 2)\n {:ok, %Bonfire.Data.Assort.Ranked{}}","ref":"Bonfire.Social.Pins.html#rank_pin/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.schema_module/0","doc":"","ref":"Bonfire.Social.Pins.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Pins.unpin/3","doc":"Removes a pin for an object.","ref":"Bonfire.Social.Pins.html#unpin/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.unpin/3","doc":"- user: The user removing the pin.\n - object: The object to be unpinned.\n - scope: The scope of the pin (eg. `:instance`, optional).","ref":"Bonfire.Social.Pins.html#unpin/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.unpin/3","doc":"iex> Bonfire.Social.Pins.unpin(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, nil}\n\n iex> Bonfire.Social.Pins.unpin(%User{id: \"user123\"}, %Post{id: \"post456\"}, :instance)\n {:ok, nil}","ref":"Bonfire.Social.Pins.html#unpin/3-examples"},{"type":"module","title":"Bonfire.Social.Pins.LiveHandler","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Pins.LiveHandler.do_pin/3","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#do_pin/3"},{"type":"function","title":"Bonfire.Social.Pins.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Pins.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.PostContents","doc":"Query, manipulate, and federate post contents. See also `Bonfire.Social.Posts` for directly handling posts.\n\nContext for `Bonfire.Data.Social.PostContent` which has the following fields:\n- name (eg. title)\n- summary (eg. description)\n- html_body (NOTE: can also contain markdown or plaintext)","ref":"Bonfire.Social.PostContents.html"},{"type":"function","title":"Bonfire.Social.PostContents.all_text_content/1","doc":"","ref":"Bonfire.Social.PostContents.html#all_text_content/1"},{"type":"function","title":"Bonfire.Social.PostContents.ap_receive_activity/3","doc":"","ref":"Bonfire.Social.PostContents.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Social.PostContents.ap_receive_attrs_prepare/4","doc":"","ref":"Bonfire.Social.PostContents.html#ap_receive_attrs_prepare/4"},{"type":"function","title":"Bonfire.Social.PostContents.base_query/0","doc":"Returns the base query for post contents.","ref":"Bonfire.Social.PostContents.html#base_query/0"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.base_query/0","doc":"iex> Bonfire.Social.PostContents.base_query()\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#base_query/0-examples"},{"type":"function","title":"Bonfire.Social.PostContents.cast/5","doc":"Given a changeset, post content attributes, creator, boundary and options, returns a changeset prepared with relevant attributes and associations.","ref":"Bonfire.Social.PostContents.html#cast/5"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.cast/5","doc":"iex> attrs = %{name: \"Test Post\", html_body: \"Content\"}\n iex> creator = %Bonfire.Data.Identity.User{id: \"01FXYZ123ABC\"}\n iex> boundary = \"public\"\n iex> opts = []\n iex> changeset = %Ecto.Changeset{}\n iex> Bonfire.Social.PostContents.cast(changeset, attrs, creator, boundary, opts)\n #Ecto.Changeset<...>","ref":"Bonfire.Social.PostContents.html#cast/5-examples"},{"type":"function","title":"Bonfire.Social.PostContents.changeset/2","doc":"Creates a changeset for a PostContent struct.","ref":"Bonfire.Social.PostContents.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.changeset/2","doc":"iex> attrs = %{name: \"Test Post\", html_body: \"Content\"}\n iex> Bonfire.Social.PostContents.changeset(%Bonfire.Data.Social.PostContent{}, attrs)\n #Ecto.Changeset<...>","ref":"Bonfire.Social.PostContents.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.diff/2","doc":"","ref":"Bonfire.Social.PostContents.html#diff/2"},{"type":"function","title":"Bonfire.Social.PostContents.edit/3","doc":"","ref":"Bonfire.Social.PostContents.html#edit/3"},{"type":"function","title":"Bonfire.Social.PostContents.editor_output_content_type/1","doc":"","ref":"Bonfire.Social.PostContents.html#editor_output_content_type/1"},{"type":"function","title":"Bonfire.Social.PostContents.federation_module/0","doc":"","ref":"Bonfire.Social.PostContents.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.PostContents.get/2","doc":"Given a post content ID, returns the corresponding post content.","ref":"Bonfire.Social.PostContents.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.get/2","doc":"iex> Bonfire.Social.PostContents.get(\"01FXYZ123ABC\")\n %Bonfire.Data.Social.PostContent{id: \"01FXYZ123ABC\", ...}","ref":"Bonfire.Social.PostContents.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.get_versions/1","doc":"","ref":"Bonfire.Social.PostContents.html#get_versions/1"},{"type":"function","title":"Bonfire.Social.PostContents.get_versions_diffed/1","doc":"","ref":"Bonfire.Social.PostContents.html#get_versions_diffed/1"},{"type":"function","title":"Bonfire.Social.PostContents.indexing_object_format/1","doc":"","ref":"Bonfire.Social.PostContents.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Social.PostContents.maybe_detect_languages/2","doc":"","ref":"Bonfire.Social.PostContents.html#maybe_detect_languages/2"},{"type":"function","title":"Bonfire.Social.PostContents.maybe_prepare_contents/4","doc":"Given post content attributes, creator, boundary, and options, prepares the post contents for processing by detecting languages, mentions, hashtags, and urls.","ref":"Bonfire.Social.PostContents.html#maybe_prepare_contents/4"},{"type":"function","title":"Bonfire.Social.PostContents.merge_with_body_or_nil/2","doc":"","ref":"Bonfire.Social.PostContents.html#merge_with_body_or_nil/2"},{"type":"function","title":"Bonfire.Social.PostContents.no_known_output/2","doc":"","ref":"Bonfire.Social.PostContents.html#no_known_output/2"},{"type":"function","title":"Bonfire.Social.PostContents.one/2","doc":"Given a set of filters, returns a single post content matching those filters.","ref":"Bonfire.Social.PostContents.html#one/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.one/2","doc":"iex> Bonfire.Social.PostContents.one(%{name: \"Test Post\"})\n %Bonfire.Data.Social.PostContent{name: \"Test Post\", ...}","ref":"Bonfire.Social.PostContents.html#one/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.prepare_text/3","doc":"","ref":"Bonfire.Social.PostContents.html#prepare_text/3"},{"type":"function","title":"Bonfire.Social.PostContents.query/2","doc":"Given a set of filters, returns an Ecto.Query for matching post contents.","ref":"Bonfire.Social.PostContents.html#query/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.query/2","doc":"iex> Bonfire.Social.PostContents.query(%{name: \"Test Post\"})\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.query_base/0","doc":"","ref":"Bonfire.Social.PostContents.html#query_base/0"},{"type":"function","title":"Bonfire.Social.PostContents.search_query/2","doc":"Performs a search query on post contents based on the given text.","ref":"Bonfire.Social.PostContents.html#search_query/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.search_query/2","doc":"iex> Bonfire.Social.PostContents.search_query(\"test\", %{})\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#search_query/2-examples"},{"type":"module","title":"Bonfire.Social.Requests","doc":"Handles social requests (e.g. follows requests), including creating, accepting, ignoring, and managing requests.","ref":"Bonfire.Social.Requests.html"},{"type":"function","title":"Bonfire.Social.Requests.accept/2","doc":"Accepts a request.","ref":"Bonfire.Social.Requests.html#accept/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.accept/2","doc":"iex> accept(request, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#accept/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_by_object/3","doc":"Retrieves all requests by object.","ref":"Bonfire.Social.Requests.html#all_by_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_by_object/3","doc":"iex> all_by_object(user, type, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#all_by_object/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_by_subject/3","doc":"Retrieves all requests by subject.","ref":"Bonfire.Social.Requests.html#all_by_subject/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_by_subject/3","doc":"iex> all_by_subject(user, type, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#all_by_subject/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_objects_by_subject/3","doc":"Retrieves all request objects by subject.","ref":"Bonfire.Social.Requests.html#all_objects_by_subject/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_objects_by_subject/3","doc":"iex> all_objects_by_subject(user, type, opts)\n [object]","ref":"Bonfire.Social.Requests.html#all_objects_by_subject/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_requested_outboxes/3","doc":"Retrieves all requested outboxes by user and type.","ref":"Bonfire.Social.Requests.html#all_requested_outboxes/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_requested_outboxes/3","doc":"iex> all_requested_outboxes(user, type, opts)\n [outbox_id]","ref":"Bonfire.Social.Requests.html#all_requested_outboxes/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_subjects_by_object/3","doc":"Retrieves all subjects by object.","ref":"Bonfire.Social.Requests.html#all_subjects_by_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_subjects_by_object/3","doc":"iex> all_subjects_by_object(user, type, opts)\n [subject]","ref":"Bonfire.Social.Requests.html#all_subjects_by_object/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.ap_publish_activity/3","doc":"","ref":"Bonfire.Social.Requests.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Social.Requests.exists?/4","doc":"Checks if a request exists.","ref":"Bonfire.Social.Requests.html#exists?/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.exists?/4","doc":"iex> exists?(subject, Follow, object, opts)\n true","ref":"Bonfire.Social.Requests.html#exists?/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.get/2","doc":"Retrieves a request by filters.","ref":"Bonfire.Social.Requests.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.get/2","doc":"iex> get(filters, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.get/4","doc":"Retrieves a request.","ref":"Bonfire.Social.Requests.html#get/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.get/4","doc":"iex> get(subject, Follow, object, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#get/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.get!/4","doc":"","ref":"Bonfire.Social.Requests.html#get!/4"},{"type":"function","title":"Bonfire.Social.Requests.ignore/2","doc":"Ignores a request.","ref":"Bonfire.Social.Requests.html#ignore/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.ignore/2","doc":"iex> ignore(request, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#ignore/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_my_requested/1","doc":"Lists all requests made by the current user.","ref":"Bonfire.Social.Requests.html#list_my_requested/1"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_my_requested/1","doc":"iex> list_my_requested(opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#list_my_requested/1-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_my_requesters/1","doc":"Lists all requesters for the current user.","ref":"Bonfire.Social.Requests.html#list_my_requesters/1"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_my_requesters/1","doc":"iex> list_my_requesters(opts)\n [{:ok, requester}]","ref":"Bonfire.Social.Requests.html#list_my_requesters/1-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_requested/2","doc":"Lists all requests made by the given user.","ref":"Bonfire.Social.Requests.html#list_requested/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_requested/2","doc":"iex> list_requested(user, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#list_requested/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_requesters/2","doc":"Lists all requesters for the given user.","ref":"Bonfire.Social.Requests.html#list_requesters/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_requesters/2","doc":"iex> list_requesters(user, opts)\n [{:ok, requester}]","ref":"Bonfire.Social.Requests.html#list_requesters/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.many/2","doc":"","ref":"Bonfire.Social.Requests.html#many/2"},{"type":"function","title":"Bonfire.Social.Requests.query/3","doc":"Prepares a DB query based on filters and type.","ref":"Bonfire.Social.Requests.html#query/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.query/3","doc":"iex> query(filters, type, opts)\n {:ok, query}","ref":"Bonfire.Social.Requests.html#query/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.query_module/0","doc":"","ref":"Bonfire.Social.Requests.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Requests.request/4","doc":"Requests to do something, and federates it.","ref":"Bonfire.Social.Requests.html#request/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.request/4","doc":"iex> request(subject, Follow, object)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#request/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.requested/2","doc":"Retrieves a request.","ref":"Bonfire.Social.Requests.html#requested/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.requested/2","doc":"iex> requested(request, current_user: me)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#requested/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.requested?/3","doc":"Checks if a request has been made.","ref":"Bonfire.Social.Requests.html#requested?/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.requested?/3","doc":"iex> requested?(subject, type, object)\n true","ref":"Bonfire.Social.Requests.html#requested?/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.schema_module/0","doc":"","ref":"Bonfire.Social.Requests.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Requests.unrequest/3","doc":"","ref":"Bonfire.Social.Requests.html#unrequest/3"},{"type":"module","title":"Bonfire.Social.Seen","doc":"Track seen/unseen status of things (usually `Activities`).\n\nThis module implements functionality to manage the seen/unseen status of objects (similar to read/unread status in other apps, but only indicates that it was displayed in a feed or other listing for the user, not that they actually read it). \n\nSeen is implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions).","ref":"Bonfire.Social.Seen.html"},{"type":"function","title":"Bonfire.Social.Seen.get/3","doc":"Retrieves a Seen edge between a subject and an object.","ref":"Bonfire.Social.Seen.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.get/3","doc":"- subject: The subject (usually a user) of the Seen edge.\n - object: The object that was seen.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Seen.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.get/3","doc":"iex> subject = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.get(subject, object)\n {:ok, %Seen{}}","ref":"Bonfire.Social.Seen.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Seen.get!/3","doc":"Similar to `get/3`, but raises an error if the Seen edge is not found.","ref":"Bonfire.Social.Seen.html#get!/3"},{"type":"function","title":"Bonfire.Social.Seen.mark_seen/2","doc":"Marks an object as seen by a user.","ref":"Bonfire.Social.Seen.html#mark_seen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.mark_seen/2","doc":"- subject: The user marking the object as seen.\n - object: The object(s) or ID(s) being marked as seen.","ref":"Bonfire.Social.Seen.html#mark_seen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.mark_seen/2","doc":"iex> user = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.mark_seen(user, object)\n {:ok, %Seen{}}\n\n iex> Bonfire.Social.Seen.mark_seen(user, \"456\")\n {:ok, %Seen{}}","ref":"Bonfire.Social.Seen.html#mark_seen/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.mark_unseen/2","doc":"Marks an object as unseen by a user.","ref":"Bonfire.Social.Seen.html#mark_unseen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.mark_unseen/2","doc":"- subject: The user marking the object as unseen.\n- object: The object or ID being marked as unseen.","ref":"Bonfire.Social.Seen.html#mark_unseen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.mark_unseen/2","doc":"iex> user = %User{id: \"user123\"}\niex> object = %Post{id: \"post456\"}\niex> Bonfire.Social.Seen.mark_unseen(user, object)\n{:ok, nil}\n\niex> Bonfire.Social.Seen.mark_unseen(user, \"456\")","ref":"Bonfire.Social.Seen.html#mark_unseen/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.query/2","doc":"Creates a query for Seen edges based on the given filters and options.","ref":"Bonfire.Social.Seen.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.query/2","doc":"- filters: A keyword list of filters to apply to the query.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Seen.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.query/2","doc":"iex> filters = [subject: %User{id: \"123\"}]\n iex> opts = [limit: 10]\n iex> Bonfire.Social.Seen.query(filters, opts)\n #Ecto.Query<...>","ref":"Bonfire.Social.Seen.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.query_module/0","doc":"","ref":"Bonfire.Social.Seen.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Seen.schema_module/0","doc":"","ref":"Bonfire.Social.Seen.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Seen.seen?/2","doc":"Checks if a user has seen an object.","ref":"Bonfire.Social.Seen.html#seen?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.seen?/2","doc":"- user: The user to check.\n - object: The object to check if seen.","ref":"Bonfire.Social.Seen.html#seen?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.seen?/2","doc":"iex> user = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.seen?(user, object)\n true","ref":"Bonfire.Social.Seen.html#seen?/2-examples"},{"type":"module","title":"Bonfire.Social.Tags","doc":"Helpers for tagging things. Mostly wrappers around functions in `Bonfire.Tag` and `Bonfire.Classify` extensions.\n\nThis module provides functionality for processing tags, handling categories, and auto-boosting content.","ref":"Bonfire.Social.Tags.html"},{"type":"function","title":"Bonfire.Social.Tags.auto_boost/2","doc":"Auto-boosts an object to some categories' feed.","ref":"Bonfire.Social.Tags.html#auto_boost/2"},{"type":"function","title":"Examples - Bonfire.Social.Tags.auto_boost/2","doc":"iex> auto_boost([%Bonfire.Classify.Category{id: \"123\"}], %Post{id: \"456\"})\n :ok","ref":"Bonfire.Social.Tags.html#auto_boost/2-examples"},{"type":"function","title":"Bonfire.Social.Tags.indexing_format_tags/1","doc":"","ref":"Bonfire.Social.Tags.html#indexing_format_tags/1"},{"type":"function","title":"Bonfire.Social.Tags.maybe_auto_boost/3","doc":"Attempts to auto-boost an object to categories, based on which ones a user has permission to publish to.","ref":"Bonfire.Social.Tags.html#maybe_auto_boost/3"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_auto_boost/3","doc":"iex> maybe_auto_boost(%User{}, [%Bonfire.Classify.Category{id: \"123\"}], %Post{id: \"456\"})\n :ok","ref":"Bonfire.Social.Tags.html#maybe_auto_boost/3-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_boostable_categories/2","doc":"Filters a list of categories, returning those that are auto-boostable for a user.","ref":"Bonfire.Social.Tags.html#maybe_boostable_categories/2"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_boostable_categories/2","doc":"iex> maybe_boostable_categories(%User{}, [%Bonfire.Classify.Category{id: \"123\"}])\n [%Bonfire.Classify.Category{id: \"123\", tree: nil}]","ref":"Bonfire.Social.Tags.html#maybe_boostable_categories/2-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_cast/4","doc":"Casts tags if the Bonfire.Tag module is enabled for the creator.","ref":"Bonfire.Social.Tags.html#maybe_cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_cast/4","doc":"iex> maybe_cast(%Ecto.Changeset{}, %{tags: [\"tag1\", \"tag2\"]}, %User{}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Tags.html#maybe_cast/4-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_process/3","doc":"Processes text to extract mentions, hashtags, and URLs if the Bonfire.Tag module is enabled.","ref":"Bonfire.Social.Tags.html#maybe_process/3"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_process/3","doc":"iex> maybe_process(%User{}, \"Hello @user #hashtag https://example.com\", [])\n {:ok, %{text: \"Hello @user #hashtag https://example.com\", mentions: [], hashtags: [], urls: []}}","ref":"Bonfire.Social.Tags.html#maybe_process/3-examples"},{"type":"module","title":"Bonfire.Social.Threads","doc":"Handle mutating and querying discussion threads and replies.\n\nProvides functionality for managing threaded discussions, including creating replies, querying threads, and handling participants.\n\nIt is the context module for `Bonfire.Data.Social.Replied` which contains these fields:\n- id: object \n- reply_to: what object or activity are we replying to\n- thread: what discussion thread we're in, if any (usually same as the ID of the original object that started the thread)\n- direct_replies_count: number of direct replies to this object (automatically counted and updated)\n- nested_replies_count: number of nested replies to this object and any replies to it (automatically aggregated, counted and updated)\n- total_replies_count: direct replies + nested replies (automatically summed)\n- path: breadcrumbs leading from the `reply_to` all the way to the original object that started the thread. Powered by `EctoMaterializedPath`.","ref":"Bonfire.Social.Threads.html"},{"type":"function","title":"Bonfire.Social.Threads.ap_prepare/2","doc":"Prepares a thread or reply for federation with ActivityPub.","ref":"Bonfire.Social.Threads.html#ap_prepare/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.ap_prepare/2","doc":"- `object_or_thread_or_reply_to_id`: The object, thread, or reply ID\n- `key`: The key to use for preparation (`:thread_id` or `:reply_to_id`, default is `:thread_id`)","ref":"Bonfire.Social.Threads.html#ap_prepare/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.ap_prepare/2","doc":"iex> ap_prepare(\"thread_123\")\n \"https://example.com/ap/objects/thread_123\"","ref":"Bonfire.Social.Threads.html#ap_prepare/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.arrange_replies/2","doc":"Arranges replies. \n\nTODOC: how is it different than `arrange_replies_tree/2`?","ref":"Bonfire.Social.Threads.html#arrange_replies/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.arrange_replies/2","doc":"- `replies`: List of replies\n- `opts`: Arrangement options","ref":"Bonfire.Social.Threads.html#arrange_replies/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.arrange_replies/2","doc":"iex> arrange_replies([%{id: \"1\"}, %{id: \"2\", path: [\"1\"]}])\n %{\"1\" => %{id: \"1\", children: %{\"2\" => %{id: \"2\", path: [\"1\"]}}}}","ref":"Bonfire.Social.Threads.html#arrange_replies/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.arrange_replies_tree/2","doc":"Arranges replies into a tree structure.\n\nPowered by https://github.com/bonfire-networks/ecto_materialized_path","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.arrange_replies_tree/2","doc":"- `replies`: List of replies\n- `opts`: Arrangement options","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.arrange_replies_tree/2","doc":"iex> arrange_replies_tree([%{id: \"1\"}, %{id: \"2\", reply_to_id: \"1\"}])\n %{\"1\" => %{id: \"1\", direct_replies: [%{id: \"2\", reply_to_id: \"1\"}]}}","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.base_query/0","doc":"","ref":"Bonfire.Social.Threads.html#base_query/0"},{"type":"function","title":"Bonfire.Social.Threads.cast/4","doc":"Casts a changeset with reply_to and threading info.\n\nIf it's not a reply or the user is not permitted to reply to the thing, a new thread will be created.","ref":"Bonfire.Social.Threads.html#cast/4"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.cast/4","doc":"- `changeset`: The changeset to be updated\n- `attrs`: Attributes for the reply\n- `user`: The user creating the reply\n- `_preset_or_custom_boundary`: Boundary setting (currently unused)","ref":"Bonfire.Social.Threads.html#cast/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.cast/4","doc":"iex> cast(changeset, %{reply_to_id: \"123\"}, user, nil)\n %Ecto.Changeset{}","ref":"Bonfire.Social.Threads.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Threads.changeset/2","doc":"","ref":"Bonfire.Social.Threads.html#changeset/2"},{"type":"function","title":"Bonfire.Social.Threads.count_participants/2","doc":"Counts participants in a thread.","ref":"Bonfire.Social.Threads.html#count_participants/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.count_participants/2","doc":"- `thread_id`: The ID of the thread\n- `opts`: Additional options, should contain `current_user` to check for permission","ref":"Bonfire.Social.Threads.html#count_participants/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.count_participants/2","doc":"iex> count_participants(\"thread_123\")\n 5","ref":"Bonfire.Social.Threads.html#count_participants/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.create_parent_replied/3","doc":"Creates a parent replied record within a changeset.","ref":"Bonfire.Social.Threads.html#create_parent_replied/3"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.create_parent_replied/3","doc":"- `changeset` or `object`: The changeset to update\n- `replied`: The replied struct\n- `replied_attrs`: Attributes for the replied record","ref":"Bonfire.Social.Threads.html#create_parent_replied/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.create_parent_replied/3","doc":"iex> create_parent_replied(changeset, %Replied{}, %{id: \"789\", thread_id: \"456\"})\n %Ecto.Changeset{}","ref":"Bonfire.Social.Threads.html#create_parent_replied/3-examples"},{"type":"function","title":"Bonfire.Social.Threads.filter/3","doc":"Group per-thread","ref":"Bonfire.Social.Threads.html#filter/3"},{"type":"function","title":"Bonfire.Social.Threads.find_reply_to/2","doc":"Finds the object being replied to.","ref":"Bonfire.Social.Threads.html#find_reply_to/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.find_reply_to/2","doc":"- `attrs`: Attributes containing reply information\n- `user`: The user attempting to reply","ref":"Bonfire.Social.Threads.html#find_reply_to/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.find_reply_to/2","doc":"- `{:ok, reply}` if the reply object is found and the user has permission\n- `{:error, reason}` otherwise, where reason may be `:not_found` or `:not_permitted`","ref":"Bonfire.Social.Threads.html#find_reply_to/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.find_reply_to/2","doc":"iex> find_reply_to(%{reply_to_id: \"123\"}, user)\n {:ok, %{id: \"123\", ...}}","ref":"Bonfire.Social.Threads.html#find_reply_to/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.find_thread/2","doc":"Finds the thread for a reply.","ref":"Bonfire.Social.Threads.html#find_thread/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.find_thread/2","doc":"- `attrs`: Attributes containing thread information\n- `user`: The user attempting to access the thread","ref":"Bonfire.Social.Threads.html#find_thread/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.find_thread/2","doc":"iex> find_thread(%{thread_id: \"456\"}, user)\n {:ok, %{id: \"456\", ...}}","ref":"Bonfire.Social.Threads.html#find_thread/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.init_parent_replied/1","doc":"Initializes a parent replied record.","ref":"Bonfire.Social.Threads.html#init_parent_replied/1"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.init_parent_replied/1","doc":"- `replied_attrs`: Attributes for the replied record","ref":"Bonfire.Social.Threads.html#init_parent_replied/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.init_parent_replied/1","doc":"iex> init_parent_replied(%{id: \"789\", thread_id: \"456\"})\n {:ok, %Replied{}}","ref":"Bonfire.Social.Threads.html#init_parent_replied/1-examples"},{"type":"function","title":"Bonfire.Social.Threads.list_participants/3","doc":"Lists participants of a thread or individual object.","ref":"Bonfire.Social.Threads.html#list_participants/3"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.list_participants/3","doc":"- `activity_or_object`: The activity or object to list participants for\n- `thread_or_object_id`: Optional thread or object ID\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#list_participants/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.list_participants/3","doc":"iex> list_participants(activity, \"thread_123\", limit: 10)\n [%{id: \"user1\", ...}, %{id: \"user2\", ...}]","ref":"Bonfire.Social.Threads.html#list_participants/3-examples"},{"type":"function","title":"Bonfire.Social.Threads.list_replies/2","doc":"Lists replies in a thread.","ref":"Bonfire.Social.Threads.html#list_replies/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.list_replies/2","doc":"- `thread`: The thread or thread ID\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#list_replies/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.list_replies/2","doc":"iex> list_replies(\"thread_123\", limit: 10)\n %{edges: [%{id: \"reply1\", ...}, %{id: \"reply2\", ...}]}","ref":"Bonfire.Social.Threads.html#list_replies/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.mark_all_seen/2","doc":"Marks all unseen replies as seen.","ref":"Bonfire.Social.Threads.html#mark_all_seen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.mark_all_seen/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#mark_all_seen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.mark_all_seen/2","doc":"iex> mark_all_seen([thread_id: \"123\"], current_user: user)\n {:ok, [%{id: \"reply1\"}, %{id: \"reply2\"}]}","ref":"Bonfire.Social.Threads.html#mark_all_seen/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.maybe_re_order_result/2","doc":"re-order distinct threads after DISTINCT ON ordered them by thread_id - Note: does not support pagination","ref":"Bonfire.Social.Threads.html#maybe_re_order_result/2"},{"type":"function","title":"Bonfire.Social.Threads.maybe_with_pins/3","doc":"","ref":"Bonfire.Social.Threads.html#maybe_with_pins/3"},{"type":"function","title":"Bonfire.Social.Threads.query/2","doc":"Builds a query for thread replies.","ref":"Bonfire.Social.Threads.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.query/2","doc":"- `filter`: Filter criteria (e.g., `[thread_id: \"123\"]`)\n- `opts`: Additional query options","ref":"Bonfire.Social.Threads.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.query/2","doc":"iex> query([thread_id: \"123\"], preload: [:posts])\n %Ecto.Query{}","ref":"Bonfire.Social.Threads.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.query_module/0","doc":"","ref":"Bonfire.Social.Threads.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Threads.re_order_using_subquery/2","doc":"re-order distinct threads after DISTINCT ON ordered them by thread_id - Note: this results in (Ecto.QueryError) cannot preload associations in subquery in query","ref":"Bonfire.Social.Threads.html#re_order_using_subquery/2"},{"type":"function","title":"Bonfire.Social.Threads.read/2","doc":"Reads a thread by its ID.","ref":"Bonfire.Social.Threads.html#read/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.read/2","doc":"- `object_id`: The ID of the object to read\n- `opts`: should contain `current_user` to check for read permissions","ref":"Bonfire.Social.Threads.html#read/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.read/2","doc":"- `{:ok, object}` if the object is found and readable\n- `{:error, reason}` otherwise","ref":"Bonfire.Social.Threads.html#read/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.read/2","doc":"iex> read(\"123\", current_user: me)\n {:ok, %{id: \"123\", ...}}","ref":"Bonfire.Social.Threads.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.schema_module/0","doc":"","ref":"Bonfire.Social.Threads.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Threads.unseen_count/2","doc":"Counts unseen replies.","ref":"Bonfire.Social.Threads.html#unseen_count/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.unseen_count/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#unseen_count/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.unseen_count/2","doc":"iex> unseen_count([thread_id: \"123\"], current_user: user)\n 5","ref":"Bonfire.Social.Threads.html#unseen_count/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.unseen_query/2","doc":"Builds a query for unseen replies.","ref":"Bonfire.Social.Threads.html#unseen_query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.unseen_query/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional query options","ref":"Bonfire.Social.Threads.html#unseen_query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.unseen_query/2","doc":"- `{:ok, query}` if the query can be built\n- `{:error, reason}` otherwise","ref":"Bonfire.Social.Threads.html#unseen_query/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.unseen_query/2","doc":"iex> unseen_query([thread_id: \"123\"], current_user: user)\n {:ok, %Ecto.Query{}}","ref":"Bonfire.Social.Threads.html#unseen_query/2-examples"},{"type":"module","title":"Bonfire.Social.Threads.LiveHandler","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_info/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_info/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.insert_comments/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#insert_comments/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.live_more/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#live_more/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread/1"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread_assigns/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread_assigns/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread_maybe_async/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread_maybe_async/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.max_depth/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#max_depth/1"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.maybe_subscribe/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#maybe_subscribe/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.reply/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#reply/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.send_thread_updates/4","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#send_thread_updates/4"},{"type":"macro","title":"Bonfire.Social.Threads.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.thread_init/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#thread_init/1"},{"type":"module","title":"Bonfire.Tag","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles tagging posts or other things:\n- @ mentions \n- #hashtags\n- others (e.g. with a Category from Bonfire.Classify or a location from Bonfire.Geolocate)","ref":"Bonfire.Tag.html"},{"type":"module","title":"Handy commands - Bonfire.Tag","doc":"","ref":"Bonfire.Tag.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Tag","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Tag.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Tag.cast/4","doc":"For using on changesets (eg in epics)","ref":"Bonfire.Tag.html#cast/4"},{"type":"function","title":"Bonfire.Tag.context_module/0","doc":"","ref":"Bonfire.Tag.html#context_module/0"},{"type":"function","title":"Bonfire.Tag.find/2","doc":"","ref":"Bonfire.Tag.html#find/2"},{"type":"function","title":"Bonfire.Tag.get/2","doc":"","ref":"Bonfire.Tag.html#get/2"},{"type":"function","title":"Bonfire.Tag.get_hashtag/1","doc":"","ref":"Bonfire.Tag.html#get_hashtag/1"},{"type":"function","title":"Bonfire.Tag.get_or_create_hashtag/1","doc":"","ref":"Bonfire.Tag.html#get_or_create_hashtag/1"},{"type":"function","title":"Bonfire.Tag.indexing_object_format/1","doc":"","ref":"Bonfire.Tag.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Tag.indexing_object_format_name/1","doc":"","ref":"Bonfire.Tag.html#indexing_object_format_name/1"},{"type":"function","title":"Bonfire.Tag.list_trending/2","doc":"","ref":"Bonfire.Tag.html#list_trending/2"},{"type":"function","title":"Bonfire.Tag.list_trending_reset/2","doc":"","ref":"Bonfire.Tag.html#list_trending_reset/2"},{"type":"function","title":"Bonfire.Tag.list_trending_without_cache/2","doc":"","ref":"Bonfire.Tag.html#list_trending_without_cache/2"},{"type":"function","title":"Bonfire.Tag.many/2","doc":"Retrieves a list of tags by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for tags (inc. tests)","ref":"Bonfire.Tag.html#many/2"},{"type":"function","title":"Bonfire.Tag.maybe_find_tag/3","doc":"Try to find one (best-match) tag","ref":"Bonfire.Tag.html#maybe_find_tag/3"},{"type":"function","title":"Bonfire.Tag.maybe_find_tags/3","doc":"Search / autocomplete for tags by name","ref":"Bonfire.Tag.html#maybe_find_tags/3"},{"type":"function","title":"Bonfire.Tag.maybe_lookup_tag/2","doc":"Lookup a single for a tag by its name/username","ref":"Bonfire.Tag.html#maybe_lookup_tag/2"},{"type":"function","title":"Bonfire.Tag.maybe_put_tree_parent/3","doc":"","ref":"Bonfire.Tag.html#maybe_put_tree_parent/3"},{"type":"function","title":"Bonfire.Tag.maybe_tag/4","doc":"Maybe tag something","ref":"Bonfire.Tag.html#maybe_tag/4"},{"type":"function","title":"Bonfire.Tag.maybe_taxonomy_tag/2","doc":"","ref":"Bonfire.Tag.html#maybe_taxonomy_tag/2"},{"type":"function","title":"Bonfire.Tag.one/2","doc":"Retrieves a single tag by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for tags (inc. tests)","ref":"Bonfire.Tag.html#one/2"},{"type":"function","title":"Bonfire.Tag.query_module/0","doc":"","ref":"Bonfire.Tag.html#query_module/0"},{"type":"function","title":"Bonfire.Tag.search_hashtag/2","doc":"","ref":"Bonfire.Tag.html#search_hashtag/2"},{"type":"function","title":"Bonfire.Tag.search_hashtag_query/2","doc":"","ref":"Bonfire.Tag.html#search_hashtag_query/2"},{"type":"function","title":"Bonfire.Tag.tag_ids/1","doc":"","ref":"Bonfire.Tag.html#tag_ids/1"},{"type":"function","title":"Bonfire.Tag.tag_something/4","doc":"tag existing thing with one or multiple Tags, Needle, or anything that can be made into a tag","ref":"Bonfire.Tag.html#tag_something/4"},{"type":"function","title":"Bonfire.Tag.tag_things_changeset/2","doc":"Add things (Pointer objects) to a tag. You usually want to add tags to a thing instead, see `thing_tags_changeset`","ref":"Bonfire.Tag.html#tag_things_changeset/2"},{"type":"function","title":"Bonfire.Tag.thing_tags_changeset/2","doc":"Add tags to a thing (any Pointer object which defines a many_to_many relation to tag). This function applies to your object schema but is here for convenience.","ref":"Bonfire.Tag.html#thing_tags_changeset/2"},{"type":"module","title":"Bonfire.Tag.Acts.Tag","doc":"An act that optionally tags an object. \n\nEpic Options:\n * ...\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Tag.Acts.Tag.html"},{"type":"function","title":"Bonfire.Tag.Acts.Tag.run/2","doc":"","ref":"Bonfire.Tag.Acts.Tag.html#run/2"},{"type":"module","title":"Bonfire.Tag.Autocomplete","doc":"Functions to lookup and autocomplete tag names","ref":"Bonfire.Tag.Autocomplete.html"},{"type":"function","title":"Bonfire.Tag.Autocomplete.api_tag_lookup/3","doc":"","ref":"Bonfire.Tag.Autocomplete.html#api_tag_lookup/3"},{"type":"function","title":"Bonfire.Tag.Autocomplete.api_tag_lookup_public/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#api_tag_lookup_public/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.filter_results/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#filter_results/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.find_all_tags/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#find_all_tags/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.maybe_find_tags/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#maybe_find_tags/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.maybe_search/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#maybe_search/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.prefix_index/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#prefix_index/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_or_lookup/3","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_or_lookup/3"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_prefix/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_prefix/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_type/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_type/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_add_field/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_add_field/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_hit_prepare/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_hit_prepare/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_lookup_public/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_lookup_public/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search_from_tags/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search_from_tags/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search_from_text/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search_from_text/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tags_split/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tags_split/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_all_prefixes/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_all_prefixes/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_prefixes/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_prefixes/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_tag_search/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_tag_search/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_tag_search/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_tag_search/2"},{"type":"module","title":"Bonfire.Tag.GraphQL.TagResolver","doc":"GraphQL tag/category queries","ref":"Bonfire.Tag.GraphQL.TagResolver.html"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.fetch_tag/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#fetch_tag/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.name/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#name/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.summary/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#summary/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag_prepare/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag_prepare/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag_something/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag_something/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tagged_things_edges/3","doc":"Things associated with a Tag","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tagged_things_edges/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tags_edges/3","doc":"Tags associated with a Thing","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tags_edges/3"},{"type":"module","title":"Bonfire.Tag.Hashtag","doc":"A virtual schema used for hashtags","ref":"Bonfire.Tag.Hashtag.html"},{"type":"function","title":"Bonfire.Tag.Hashtag.changeset/2","doc":"","ref":"Bonfire.Tag.Hashtag.html#changeset/2"},{"type":"function","title":"Bonfire.Tag.Hashtag.delete/2","doc":"","ref":"Bonfire.Tag.Hashtag.html#delete/2"},{"type":"function","title":"Bonfire.Tag.Hashtag.get/3","doc":"","ref":"Bonfire.Tag.Hashtag.html#get/3"},{"type":"function","title":"Bonfire.Tag.Hashtag.normalize_name/1","doc":"","ref":"Bonfire.Tag.Hashtag.html#normalize_name/1"},{"type":"function","title":"Bonfire.Tag.Hashtag.put/3","doc":"","ref":"Bonfire.Tag.Hashtag.html#put/3"},{"type":"module","title":"Bonfire.Tag.LiveHandler","doc":"","ref":"Bonfire.Tag.LiveHandler.html"},{"type":"function","title":"Bonfire.Tag.LiveHandler.declared_extension/0","doc":"","ref":"Bonfire.Tag.LiveHandler.html#declared_extension/0"},{"type":"function","title":"Bonfire.Tag.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Tag.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Tag.LiveHandler.maybe_tag/4","doc":"","ref":"Bonfire.Tag.LiveHandler.html#maybe_tag/4"},{"type":"macro","title":"Bonfire.Tag.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Tag.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Tag.Queries","doc":"Queries for `Bonfire.Tag`","ref":"Bonfire.Tag.Queries.html"},{"type":"function","title":"Bonfire.Tag.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Tag.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Tag.Queries.join_to/3","doc":"","ref":"Bonfire.Tag.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Tag.Queries.list_trending/2","doc":"","ref":"Bonfire.Tag.Queries.html#list_trending/2"},{"type":"function","title":"Bonfire.Tag.Queries.queries/4","doc":"","ref":"Bonfire.Tag.Queries.html#queries/4"},{"type":"function","title":"Bonfire.Tag.Queries.query/1","doc":"","ref":"Bonfire.Tag.Queries.html#query/1"},{"type":"function","title":"Bonfire.Tag.Queries.query/2","doc":"","ref":"Bonfire.Tag.Queries.html#query/2"},{"type":"module","title":"Bonfire.Tag.Simulate","doc":"","ref":"Bonfire.Tag.Simulate.html"},{"type":"module","title":"Bonfire.Tag.Tagged","doc":"A mixin used for associating tags with an object","ref":"Bonfire.Tag.Tagged.html"},{"type":"function","title":"Bonfire.Tag.Tagged.all/0","doc":"","ref":"Bonfire.Tag.Tagged.html#all/0"},{"type":"function","title":"Bonfire.Tag.Tagged.changeset/2","doc":"","ref":"Bonfire.Tag.Tagged.html#changeset/2"},{"type":"function","title":"Bonfire.Tag.Tagged.delete/2","doc":"","ref":"Bonfire.Tag.Tagged.html#delete/2"},{"type":"function","title":"Bonfire.Tag.Tagged.get/3","doc":"","ref":"Bonfire.Tag.Tagged.html#get/3"},{"type":"function","title":"Bonfire.Tag.Tagged.latest/1","doc":"Get the latest tag added to a thing","ref":"Bonfire.Tag.Tagged.html#latest/1"},{"type":"function","title":"Bonfire.Tag.Tagged.put/3","doc":"","ref":"Bonfire.Tag.Tagged.html#put/3"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_tag/1","doc":"List the things tagged with a certain tag","ref":"Bonfire.Tag.Tagged.html#q_with_tag/1"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_thing/1","doc":"List the tags of a thing","ref":"Bonfire.Tag.Tagged.html#q_with_thing/1"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_type/1","doc":"List by type of tagged thing","ref":"Bonfire.Tag.Tagged.html#q_with_type/1"},{"type":"function","title":"Bonfire.Tag.Tagged.search_query/2","doc":"","ref":"Bonfire.Tag.Tagged.html#search_query/2"},{"type":"function","title":"Bonfire.Tag.Tagged.thing_tags_insert/2","doc":"","ref":"Bonfire.Tag.Tagged.html#thing_tags_insert/2"},{"type":"function","title":"Bonfire.Tag.Tagged.with_tag/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_tag/1"},{"type":"function","title":"Bonfire.Tag.Tagged.with_thing/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_thing/1"},{"type":"function","title":"Bonfire.Tag.Tagged.with_type/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_type/1"},{"type":"module","title":"Bonfire.Tag.TextContent.Formatter","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.escape_mention_handler/4","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#escape_mention_handler/4"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.linkify/2","doc":"Parses a text and replace plain text links with HTML. Returns a tuple with a result text, mentions, and hashtags.\n\nIf the 'safe_mention' option is given, only consecutive mentions at the start the post are actually mentioned.","ref":"Bonfire.Tag.TextContent.Formatter.html#linkify/2"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.nothing_handler/3","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#nothing_handler/3"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.tag_handler/4","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#tag_handler/4"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.url_handler/3","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#url_handler/3"},{"type":"module","title":"Bonfire.Tag.TextContent.Process","doc":"","ref":"Bonfire.Tag.TextContent.Process.html"},{"type":"function","title":"Bonfire.Tag.TextContent.Process.html_escape/2","doc":"","ref":"Bonfire.Tag.TextContent.Process.html#html_escape/2"},{"type":"function","title":"Bonfire.Tag.TextContent.Process.process/3","doc":"For use for things like a bio, where we want links but not to actually trigger mentions.","ref":"Bonfire.Tag.TextContent.Process.html#process/3"},{"type":"module","title":"Bonfire.Tag.Web.Routes","doc":"","ref":"Bonfire.Tag.Web.Routes.html"},{"type":"function","title":"Bonfire.Tag.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Tag.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Tags.Acts.AutoBoost","doc":"An act that optionally boosts an activity as a category. This is a way to auto-post in a category/group when tagged (and the author has permission).\n\nEpic Options:\n * ...\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Tags.Acts.AutoBoost.html"},{"type":"function","title":"Bonfire.Tags.Acts.AutoBoost.run/2","doc":"","ref":"Bonfire.Tags.Acts.AutoBoost.html#run/2"},{"type":"module","title":"Bonfire.Telemetry","doc":"","ref":"Bonfire.Telemetry.html"},{"type":"function","title":"Bonfire.Telemetry.handle_event/4","doc":"","ref":"Bonfire.Telemetry.html#handle_event/4"},{"type":"function","title":"Bonfire.Telemetry.setup/2","doc":"","ref":"Bonfire.Telemetry.html#setup/2"},{"type":"function","title":"Bonfire.Telemetry.setup_oban/0","doc":"","ref":"Bonfire.Telemetry.html#setup_oban/0"},{"type":"function","title":"Bonfire.Telemetry.setup_opentelemetry/2","doc":"","ref":"Bonfire.Telemetry.html#setup_opentelemetry/2"},{"type":"module","title":"Bonfire.Telemetry.Metrics","doc":"","ref":"Bonfire.Telemetry.Metrics.html"},{"type":"function","title":"Bonfire.Telemetry.Metrics.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Telemetry.Metrics.html#child_spec/1"},{"type":"function","title":"Bonfire.Telemetry.Metrics.metrics/0","doc":"","ref":"Bonfire.Telemetry.Metrics.html#metrics/0"},{"type":"function","title":"Bonfire.Telemetry.Metrics.oban_worker_memory/0","doc":"","ref":"Bonfire.Telemetry.Metrics.html#oban_worker_memory/0"},{"type":"function","title":"Bonfire.Telemetry.Metrics.start_link/1","doc":"","ref":"Bonfire.Telemetry.Metrics.html#start_link/1"},{"type":"module","title":"Bonfire.Telemetry.Storage","doc":"","ref":"Bonfire.Telemetry.Storage.html"},{"type":"function","title":"Bonfire.Telemetry.Storage.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Telemetry.Storage.html#child_spec/1"},{"type":"function","title":"Bonfire.Telemetry.Storage.handle_event/4","doc":"","ref":"Bonfire.Telemetry.Storage.html#handle_event/4"},{"type":"function","title":"Bonfire.Telemetry.Storage.metrics_history/1","doc":"","ref":"Bonfire.Telemetry.Storage.html#metrics_history/1"},{"type":"function","title":"Bonfire.Telemetry.Storage.start_link/1","doc":"","ref":"Bonfire.Telemetry.Storage.html#start_link/1"},{"type":"module","title":"Bonfire.Telemetry.SystemMonitor","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.format_percent/1","doc":"Formats percent.","ref":"Bonfire.Telemetry.SystemMonitor.html#format_percent/1"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.handle_alarm/2","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#handle_alarm/2"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.handle_event/2","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#handle_event/2"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.init/1","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#init/1"},{"type":"module","title":"Bonfire.Testing","doc":"","ref":"Bonfire.Testing.html"},{"type":"function","title":"Bonfire.Testing.configure_start_test/1","doc":"","ref":"Bonfire.Testing.html#configure_start_test/1"},{"type":"module","title":"Bonfire.Testing.InsecurePW","doc":"","ref":"Bonfire.Testing.InsecurePW.html"},{"type":"function","title":"Bonfire.Testing.InsecurePW.no_user_verify/0","doc":"","ref":"Bonfire.Testing.InsecurePW.html#no_user_verify/0"},{"type":"module","title":"Bonfire.Upcycle","doc":"Upcycle supports a network of high school fablabs in Milwaukee that receive contributions of materials from organizations in the community and share these with each other. It is implemented as a UI for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows), which are both available as extensions for [Bonfire](https://bonfire.cafe/). Upcycle was initially created for [LearnDeep](https://learndeep.org/) by students at [MSOE](https://www.msoe.edu/), and is now being maintained by the Bonfire team.","ref":"Bonfire.Upcycle.html"},{"type":"module","title":"Set up - Bonfire.Upcycle","doc":"Upcycle is packaged as part of the `cooperation` flavour of Bonfire. Check out the development or deployment [docs](https://doc.bonfirenetworks.org/readme.html) to get started.","ref":"Bonfire.Upcycle.html#module-set-up"},{"type":"module","title":"Copyright and License - Bonfire.Upcycle","doc":"Copyright (c) 2022 all contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Upcycle.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Upcycle.format_date/1","doc":"","ref":"Bonfire.Upcycle.html#format_date/1"},{"type":"function","title":"Bonfire.Upcycle.involved?/2","doc":"","ref":"Bonfire.Upcycle.html#involved?/2"},{"type":"function","title":"Bonfire.Upcycle.mailer/0","doc":"","ref":"Bonfire.Upcycle.html#mailer/0"},{"type":"function","title":"Bonfire.Upcycle.remote_tag_id/0","doc":"","ref":"Bonfire.Upcycle.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.Upcycle.remote_tag_prefix/0","doc":"","ref":"Bonfire.Upcycle.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.Upcycle.units/0","doc":"","ref":"Bonfire.Upcycle.html#units/0"},{"type":"module","title":"Bonfire.Upcycle.IntentLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.MapLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.ResourceLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.Routes","doc":"","ref":"Bonfire.Upcycle.Web.Routes.html"},{"type":"function","title":"Bonfire.Upcycle.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Upcycle.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#process/2"},{"type":"module","title":"ActivityPub","doc":"ActivityPub Library for elixir.\n\n**WORK IN PROGRESS, TESTING FEDERATION WITH DIFFERENT IMPLEMENTATIONS IS UNDERWAY**","ref":"ActivityPub.html"},{"type":"module","title":"Installation - ActivityPub","doc":"1. Add this library to your dependencies in `mix.exs`\n\n```\ndefp deps do\n [...]\n {:activity_pub, git: \"https://github.com/bonfire-networks/activity_pub.git\", branch: \"stable\"} # branch can \"stable\", or \"develop\" for the bleeding edge\nend\n```\n\n2. Create an adapter module. To start, one created at\n `lib/my_app/adapter.ex` might look like\n\n```elixir\ndefmodule MyApp.Adapter do\n @moduledoc \"\"\"\n Adapter functions delegated from the `ActivityPub` Library\n \"\"\"\n\n @behaviour ActivityPub.Federator.Adapter\nend\n```\n\nNote that, due to the defined `@behavior`, Elixir will warn you that\nthe required functions\n\n * `base_url/0`\n * `get_actor_by_id/1`\n * `get_actor_by_username/1`\n * `get_follower_local_ids/1`\n * `get_following_local_ids/1`\n * `get_redirect_url/1`\n * `handle_activity/1`\n * `maybe_create_remote_actor/1`\n * `maybe_publish_object/2`\n * `update_local_actor/2`\n * `update_remote_actor/1`\n\nhave not yet been implemented though you will be able to start your\napp. Defining these allows `ActivityPub` to handle ActivityPub HTTP\nand database calls and operations. An example of an implemented\nadaptor can be found\n[here](https://github.com/bonfire-networks/bonfire_federate_activitypub/tree/main/lib/adapter\n\"Link to file hosted on GitHub\").\n\nThen set it in config\n\n```\nconfig :activity_pub, :adapter, MyApp.Adapter\n```\n\n3. Set your application repo in config\n\n```\nconfig :activity_pub, :repo, MyApp.Repo\n```\n\n4. Create a new ecto migration and call `ActivityPub.Migration.up/0` from it\n\n5. Inject AP routes to your router by adding `use ActivityPub.Web.Router` to your app's router module\n\n6. Copy the default AP config to your app's confix.exs\n\n```\nconfig :activity_pub, :mrf_simple,\n media_removal: [],\n media_nsfw: [],\n report_removal: [],\n accept: [],\n avatar_removal: [],\n banner_removal: []\n\nconfig :activity_pub, :instance,\n hostname: \"example.com\",\n federation_publisher_modules: [ActivityPub.Federator.APPublisher],\n federation_reachability_timeout_days: 7,\n federating: true,\n rewrite_policy: []\n\nconfig :activity_pub, :http,\n proxy_url: nil,\n user_agent: \"Your app name\",\n send_user_agent: true,\n adapter: [\n ssl_options: [\n # Workaround for remote server certificate chain issues\n partial_chain: &:hackney_connect.partial_chain/1,\n # We don't support TLS v1.3 yet\n versions: [:tlsv1, :\"tlsv1.1\", :\"tlsv1.2\"]\n ]\n ]\n ```\n\n7. Change the hostname value in the instance config block to your instance's hostname \n\n8. If you don't already have Oban set up, follow the [Oban installation intructions](https://hexdocs.pm/oban/installation.html#content) and add the AP queues:\n\n```\nconfig :my_app, Oban, queues: [federator_incoming: 50, federator_outgoing: 50, remote_fetcher: 20]\n```\n\nNow you should be able to compile and run your app and move over to integration.\n\n\nThis module is the entrypoint to the ActivityPub API for processing incoming and outgoing federated objects (normalising, saving the the Object storage, passing them to the adapter, and queueing outgoing activities to be pushed out).\n\nIn general, the functions in this module take object-like map.\nThat includes a struct as the input for actor parameters. Use the functions in the `ActivityPub.Actor` module (`ActivityPub.Actor.get_cached/1` for example) to retrieve those.","ref":"ActivityPub.html#module-installation"},{"type":"function","title":"ActivityPub.accept/1","doc":"Generates and federates an Accept activity via the data passed through `params`.","ref":"ActivityPub.html#accept/1"},{"type":"function","title":"ActivityPub.accept_activity/1","doc":"","ref":"ActivityPub.html#accept_activity/1"},{"type":"function","title":"ActivityPub.announce/1","doc":"","ref":"ActivityPub.html#announce/1"},{"type":"function","title":"ActivityPub.block/1","doc":"","ref":"ActivityPub.html#block/1"},{"type":"function","title":"ActivityPub.create/1","doc":"Generates and federates a Create activity via the data passed through `params`.","ref":"ActivityPub.html#create/1"},{"type":"function","title":"ActivityPub.delete/3","doc":"","ref":"ActivityPub.html#delete/3"},{"type":"function","title":"ActivityPub.flag/1","doc":"","ref":"ActivityPub.html#flag/1"},{"type":"function","title":"ActivityPub.follow/1","doc":"Generates and federates a Follow activity.\n\nNote: the follow should be reflected as a Follow on the host database side only after receiving an `Accept` activity in response (though you could register it as a Request if your app has that concept)","ref":"ActivityPub.html#follow/1"},{"type":"function","title":"ActivityPub.like/1","doc":"Record a Like","ref":"ActivityPub.html#like/1"},{"type":"function","title":"ActivityPub.move/4","doc":"","ref":"ActivityPub.html#move/4"},{"type":"function","title":"ActivityPub.reject/1","doc":"Generates and federates a Reject activity via the data passed through `params`.","ref":"ActivityPub.html#reject/1"},{"type":"function","title":"ActivityPub.unannounce/1","doc":"","ref":"ActivityPub.html#unannounce/1"},{"type":"function","title":"ActivityPub.unblock/1","doc":"","ref":"ActivityPub.html#unblock/1"},{"type":"function","title":"ActivityPub.unfollow/1","doc":"Generates and federates an Unfollow activity.","ref":"ActivityPub.html#unfollow/1"},{"type":"function","title":"ActivityPub.unlike/1","doc":"","ref":"ActivityPub.html#unlike/1"},{"type":"function","title":"ActivityPub.update/1","doc":"","ref":"ActivityPub.html#update/1"},{"type":"module","title":"ActivityPub.Actor","doc":"An ActivityPub Actor type and functions for dealing with actors.\n\nSee [4. Actors](https://www.w3.org/TR/activitypub/#actors) in the\nActivityPub specification for more information on Actors.","ref":"ActivityPub.Actor.html"},{"type":"function","title":"ActivityPub.Actor.actor?/1","doc":"","ref":"ActivityPub.Actor.html#actor?/1"},{"type":"function","title":"ActivityPub.Actor.actor_url/1","doc":"","ref":"ActivityPub.Actor.html#actor_url/1"},{"type":"function","title":"ActivityPub.Actor.also_known_as?/2","doc":"","ref":"ActivityPub.Actor.html#also_known_as?/2"},{"type":"function","title":"ActivityPub.Actor.check_actor_is_active/1","doc":"","ref":"ActivityPub.Actor.html#check_actor_is_active/1"},{"type":"function","title":"ActivityPub.Actor.deactivate/1","doc":"","ref":"ActivityPub.Actor.html#deactivate/1"},{"type":"function","title":"ActivityPub.Actor.delete/2","doc":"","ref":"ActivityPub.Actor.html#delete/2"},{"type":"function","title":"ActivityPub.Actor.fetch_by_username/2","doc":"Fetches a remote actor by username in `username@domain.tld` format","ref":"ActivityPub.Actor.html#fetch_by_username/2"},{"type":"function","title":"ActivityPub.Actor.format_remote_actor/1","doc":"","ref":"ActivityPub.Actor.html#format_remote_actor/1"},{"type":"function","title":"ActivityPub.Actor.format_username/1","doc":"","ref":"ActivityPub.Actor.html#format_username/1"},{"type":"function","title":"ActivityPub.Actor.format_username/2","doc":"","ref":"ActivityPub.Actor.html#format_username/2"},{"type":"function","title":"ActivityPub.Actor.get_cached/1","doc":"Fetches an actor given its AP ID / URI, or username@domain, or by a pointer id \n\nRemote actors are just checked if they exist in AP or adapter's database and are NOT fetched remotely if they don't.\n\nRemote actors are also automatically updated every X hours (defaults to 24h).","ref":"ActivityPub.Actor.html#get_cached/1"},{"type":"function","title":"ActivityPub.Actor.get_cached!/1","doc":"","ref":"ActivityPub.Actor.html#get_cached!/1"},{"type":"function","title":"ActivityPub.Actor.get_cached_or_fetch/1","doc":"Tries to get a local actor by username or tries to fetch it remotely if username is provided in `username@domain.tld` format.","ref":"ActivityPub.Actor.html#get_cached_or_fetch/1"},{"type":"function","title":"ActivityPub.Actor.get_external_followers/1","doc":"","ref":"ActivityPub.Actor.html#get_external_followers/1"},{"type":"function","title":"ActivityPub.Actor.get_followers/1","doc":"","ref":"ActivityPub.Actor.html#get_followers/1"},{"type":"function","title":"ActivityPub.Actor.get_followings/1","doc":"","ref":"ActivityPub.Actor.html#get_followings/1"},{"type":"function","title":"ActivityPub.Actor.get_non_cached/1","doc":"","ref":"ActivityPub.Actor.html#get_non_cached/1"},{"type":"function","title":"ActivityPub.Actor.invalidate_cache/1","doc":"","ref":"ActivityPub.Actor.html#invalidate_cache/1"},{"type":"function","title":"ActivityPub.Actor.maybe_create_actor_from_object/1","doc":"","ref":"ActivityPub.Actor.html#maybe_create_actor_from_object/1"},{"type":"function","title":"ActivityPub.Actor.reactivate/1","doc":"","ref":"ActivityPub.Actor.html#reactivate/1"},{"type":"function","title":"ActivityPub.Actor.save_actor_tombstone/2","doc":"","ref":"ActivityPub.Actor.html#save_actor_tombstone/2"},{"type":"function","title":"ActivityPub.Actor.set_cache/1","doc":"","ref":"ActivityPub.Actor.html#set_cache/1"},{"type":"function","title":"ActivityPub.Actor.swap_or_create_actor_tombstone/1","doc":"","ref":"ActivityPub.Actor.html#swap_or_create_actor_tombstone/1"},{"type":"function","title":"ActivityPub.Actor.update_actor/1","doc":"Updates an existing actor struct by its AP ID.","ref":"ActivityPub.Actor.html#update_actor/1"},{"type":"function","title":"ActivityPub.Actor.update_actor/2","doc":"","ref":"ActivityPub.Actor.html#update_actor/2"},{"type":"type","title":"ActivityPub.Actor.ap_id/0","doc":"The ActivityPub ID of an object, which must be a publicly-dereferencable URI,\nor `nil` if the object is anonymous.\n\nNote that since the URI must be publicly-dereferencable,\nyou should set this value to `ActivityPub.Federator.Adapter.base_url() <> ~p\"/pub/actors/#{username}\"`.\nThis path is defined in `ActivityPub.Web.Endpoint` and serves data provided\nby the functions in `ActivityPub.Federator.Adapter`.\n\nSee section [3.1 Object Identifiers](https://www.w3.org/TR/activitypub/#obj-id)\nin the ActivityPub spec for more information on the format.","ref":"ActivityPub.Actor.html#t:ap_id/0"},{"type":"type","title":"Examples - ActivityPub.Actor.ap_id/0","doc":"\"https://kenzoishii.example.com/\"\n\n \"http://localhost:4000/pub/actors/rosa\"","ref":"ActivityPub.Actor.html#t:ap_id/0-examples"},{"type":"type","title":"ActivityPub.Actor.id/0","doc":"Your app's internal ID for an `Actor`.","ref":"ActivityPub.Actor.html#t:id/0"},{"type":"type","title":"Examples - ActivityPub.Actor.id/0","doc":"\"c1688a22-4e9c-42d7-935b-1f17e1d0cf58\"\n\n \"1234\"","ref":"ActivityPub.Actor.html#t:id/0-examples"},{"type":"type","title":"ActivityPub.Actor.pointer/0","doc":"An association (by default a `Needle.Pointer`) that references an `Actor`.\n\nPointers consist of a table ID, referencing a database table,\nand a pointer ID, referencing a row in that table.\nTable and pointer IDs are both `Pointers.ULID` strings, which is UUID-like.","ref":"ActivityPub.Actor.html#t:pointer/0"},{"type":"type","title":"ActivityPub.Actor.pointer_id/0","doc":"A ULID ID (eg. using the `Needle.ULID`library) that links an `Actor` to its object in the app's database.","ref":"ActivityPub.Actor.html#t:pointer_id/0"},{"type":"type","title":"ActivityPub.Actor.t/0","doc":"An ActivityPub Actor.","ref":"ActivityPub.Actor.html#t:t/0"},{"type":"type","title":"ActivityPub.Actor.username/0","doc":"An `Actor`'s user name, used as part of its ActivityPub ID.","ref":"ActivityPub.Actor.html#t:username/0"},{"type":"type","title":"Examples - ActivityPub.Actor.username/0","doc":"\"alyssa\"\n\n \"ben\"","ref":"ActivityPub.Actor.html#t:username/0-examples"},{"type":"module","title":"ActivityPub.Config","doc":"","ref":"ActivityPub.Config.html"},{"type":"function","title":"ActivityPub.Config.actors_and_collections/0","doc":"","ref":"ActivityPub.Config.html#actors_and_collections/0"},{"type":"function","title":"ActivityPub.Config.collection_types/0","doc":"","ref":"ActivityPub.Config.html#collection_types/0"},{"type":"function","title":"ActivityPub.Config.delete/1","doc":"","ref":"ActivityPub.Config.html#delete/1"},{"type":"function","title":"ActivityPub.Config.env/0","doc":"","ref":"ActivityPub.Config.html#env/0"},{"type":"function","title":"ActivityPub.Config.federating?/0","doc":"","ref":"ActivityPub.Config.html#federating?/0"},{"type":"function","title":"ActivityPub.Config.get/1","doc":"","ref":"ActivityPub.Config.html#get/1"},{"type":"function","title":"ActivityPub.Config.get/2","doc":"","ref":"ActivityPub.Config.html#get/2"},{"type":"function","title":"ActivityPub.Config.get!/1","doc":"","ref":"ActivityPub.Config.html#get!/1"},{"type":"macro","title":"ActivityPub.Config.is_in/2","doc":"For matching against the above list in guards TODO: use runtime config","ref":"ActivityPub.Config.html#is_in/2"},{"type":"function","title":"ActivityPub.Config.public_uri/0","doc":"","ref":"ActivityPub.Config.html#public_uri/0"},{"type":"function","title":"ActivityPub.Config.public_uris/0","doc":"","ref":"ActivityPub.Config.html#public_uris/0"},{"type":"function","title":"ActivityPub.Config.put/2","doc":"","ref":"ActivityPub.Config.html#put/2"},{"type":"function","title":"ActivityPub.Config.supported_activity_types/0","doc":"","ref":"ActivityPub.Config.html#supported_activity_types/0"},{"type":"function","title":"ActivityPub.Config.supported_actor_types/0","doc":"","ref":"ActivityPub.Config.html#supported_actor_types/0"},{"type":"exception","title":"ActivityPub.Config.Error","doc":"","ref":"ActivityPub.Config.Error.html"},{"type":"module","title":"ActivityPub.Federator","doc":"","ref":"ActivityPub.Federator.html"},{"type":"function","title":"ActivityPub.Federator.perform/3","doc":"","ref":"ActivityPub.Federator.html#perform/3"},{"type":"function","title":"ActivityPub.Federator.publish/2","doc":"","ref":"ActivityPub.Federator.html#publish/2"},{"type":"module","title":"ActivityPub.Federator.APPublisher","doc":"","ref":"ActivityPub.Federator.APPublisher.html"},{"type":"function","title":"ActivityPub.Federator.APPublisher.determine_inbox/4","doc":"Determine a user inbox to use based on heuristics. These heuristics\nare based on an approximation of the ``sharedInbox`` rules in the\n[ActivityPub specification][ap-sharedinbox].\n\n [ap-sharedinbox]: https://www.w3.org/TR/activitypub/#shared-inbox-delivery","ref":"ActivityPub.Federator.APPublisher.html#determine_inbox/4"},{"type":"function","title":"ActivityPub.Federator.APPublisher.gather_webfinger_links/1","doc":"","ref":"ActivityPub.Federator.APPublisher.html#gather_webfinger_links/1"},{"type":"function","title":"ActivityPub.Federator.APPublisher.is_representable?/1","doc":"","ref":"ActivityPub.Federator.APPublisher.html#is_representable?/1"},{"type":"function","title":"ActivityPub.Federator.APPublisher.maybe_federate_to_search_index/2","doc":"If you put the URL of the shared inbox of an ActivityPub instance in the following env variable, all public content will be pushed there via AP federation for search indexing purposes: PUSH_ALL_PUBLIC_CONTENT_TO_INSTANCE\n#TODO: move to adapter","ref":"ActivityPub.Federator.APPublisher.html#maybe_federate_to_search_index/2"},{"type":"function","title":"ActivityPub.Federator.APPublisher.publish/3","doc":"","ref":"ActivityPub.Federator.APPublisher.html#publish/3"},{"type":"function","title":"ActivityPub.Federator.APPublisher.publish_one/1","doc":"Publish a single message to a peer. Takes a struct with the following\nparameters set:\n\n* `inbox`: the inbox to publish to\n* `json`: the JSON message body representing the ActivityPub message\n* `actor`: the actor which is signing the message\n* `id`: the ActivityStreams URI of the message","ref":"ActivityPub.Federator.APPublisher.html#publish_one/1"},{"type":"behaviour","title":"ActivityPub.Federator.Adapter","doc":"Contract for ActivityPub module adapters","ref":"ActivityPub.Federator.Adapter.html"},{"type":"function","title":"ActivityPub.Federator.Adapter.adapter/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#adapter/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.base_url/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#base_url/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.base_url/0","doc":"The base URL of the application serving `ActivityPub.Web.Endpoint`.","ref":"ActivityPub.Federator.Adapter.html#c:base_url/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.call_or/3","doc":"Run function from adapter if defined, otherwise return fallback value","ref":"ActivityPub.Federator.Adapter.html#call_or/3"},{"type":"function","title":"ActivityPub.Federator.Adapter.external_followers_for_activity/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#external_followers_for_activity/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.external_followers_for_activity/2","doc":"Compute and return a subset of followers that should receive a specific activity (optional)","ref":"ActivityPub.Federator.Adapter.html#c:external_followers_for_activity/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.federate_actor?/3","doc":"Whether this (local or remote) actor has federation enabled and/or is blocked on this instance\n\nactor: the actor to check (eg. Alice)\ndirection: :in or :out - whether we're dealing with incoming federation or outgoing (optional)\nby_actor: optionally another actor (eg. if Alice is sending something to Bob, this would be Bob)","ref":"ActivityPub.Federator.Adapter.html#federate_actor?/3"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_ap_id/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_ap_id/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_ap_id/1","doc":"Fetch an `Actor` by its full ActivityPub ID.","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_ap_id/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_id/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_id/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_id/1","doc":"Fetch an `Actor` by its ID in the host application database.","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_id/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_username/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_username/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_username/1","doc":"Fetch an `Actor` given its preferred username","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_username/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_follower_local_ids/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_follower_local_ids/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_follower_local_ids/1","doc":"Get the host application IDs for all `Actor`s following the given `Actor`.","ref":"ActivityPub.Federator.Adapter.html#c:get_follower_local_ids/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_following_local_ids/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_following_local_ids/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_following_local_ids/1","doc":"Get the host application IDs for all `Actor`s that the given `Actor` is following.","ref":"ActivityPub.Federator.Adapter.html#c:get_following_local_ids/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_locale/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_locale/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_locale/0","doc":"Get the default locale of the host application.","ref":"ActivityPub.Federator.Adapter.html#c:get_locale/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_or_create_service_actor/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_or_create_service_actor/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_or_create_service_actor/0","doc":"Creates an internal service actor by username, if missing.","ref":"ActivityPub.Federator.Adapter.html#c:get_or_create_service_actor/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_redirect_url/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_redirect_url/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_redirect_url/1","doc":"Gets local url of an AP object to redirect in browser. Can take pointer id or an actor username.","ref":"ActivityPub.Federator.Adapter.html#c:get_redirect_url/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.handle_activity/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#handle_activity/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.handle_activity/1","doc":"Passes data to be handled by the host application","ref":"ActivityPub.Federator.Adapter.html#c:handle_activity/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_create_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_create_remote_actor/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.maybe_create_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:maybe_create_remote_actor/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_handle_activity/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_handle_activity/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_publish_object/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_publish_object/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.maybe_publish_object/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:maybe_publish_object/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_local_actor/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_local_actor/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.update_local_actor/2","doc":"Commit new fields to the host application database for the given `Actor`.","ref":"ActivityPub.Federator.Adapter.html#c:update_local_actor/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_remote_actor/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.update_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:update_remote_actor/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_remote_actor/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_remote_actor/2"},{"type":"module","title":"ActivityPub.Federator.Fetcher","doc":"Handles fetching AS2 objects from remote instances.","ref":"ActivityPub.Federator.Fetcher.html"},{"type":"function","title":"ActivityPub.Federator.Fetcher.allowed_recursion?/2","doc":"Returns `true` if the distance to target object does not exceed max configured value.\nServes to prevent fetching of very long threads, especially useful on smaller instances.\nAddresses memory leaks on recursive replies fetching.\nApplies to fetching of both ancestor (reply-to) and child (reply) objects.","ref":"ActivityPub.Federator.Fetcher.html#allowed_recursion?/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.cache_fetch_error/1","doc":"","ref":"ActivityPub.Federator.Fetcher.html#cache_fetch_error/1"},{"type":"function","title":"ActivityPub.Federator.Fetcher.enqueue_fetch/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#enqueue_fetch/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_collection/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_collection/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_fresh_object_from_id/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_fresh_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_object_from_id/2","doc":"Checks if an object exists in the AP and Adapter databases and fetches and creates it if not.","ref":"ActivityPub.Federator.Fetcher.html#fetch_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_objects_from_id/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_objects_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_outbox/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_outbox/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_remote_object_from_id/2","doc":"Fetches an AS2 object from remote AP ID.","ref":"ActivityPub.Federator.Fetcher.html#fetch_remote_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_replies/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_replies/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_thread/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_thread/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.get_cached_object_or_fetch_ap_id/2","doc":"Checks if an object exists in the AP database and fetches it if not (but does not send to Adapter).","ref":"ActivityPub.Federator.Fetcher.html#get_cached_object_or_fetch_ap_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.get_cached_object_or_fetch_pointer_id/2","doc":"Checks if an object exists in the AP database and prepares it if not (local objects only).","ref":"ActivityPub.Federator.Fetcher.html#get_cached_object_or_fetch_pointer_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.maybe_fetch/2","doc":"Fetch a list of objects within recursion limits. Used for reply_to/context, and replies or similar collections.","ref":"ActivityPub.Federator.Fetcher.html#maybe_fetch/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.maybe_parse_header_url/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#maybe_parse_header_url/2"},{"type":"module","title":"ActivityPub.Federator.HTTP","doc":"Module for building and performing HTTP requests.","ref":"ActivityPub.Federator.HTTP.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.delete/4","doc":"Makes a DELETE request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#delete/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.get/3","doc":"Makes a GET request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#get/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.http_request/5","doc":"Builds and perform http request.\n\n# Arguments:\n`method` - :get, :post, :put, :delete\n`url`\n`body`\n`headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n`options` - custom, per-request middleware or adapter options\n\n# Returns:\n`{:ok, %Tesla.Env{}}` or `{:error, error}`","ref":"ActivityPub.Federator.HTTP.html#http_request/5"},{"type":"function","title":"ActivityPub.Federator.HTTP.post/4","doc":"Makes a POST request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#post/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.put/4","doc":"Makes a PUT request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#put/4"},{"type":"type","title":"ActivityPub.Federator.HTTP.t/0","doc":"","ref":"ActivityPub.Federator.HTTP.html#t:t/0"},{"type":"module","title":"ActivityPub.Federator.HTTP.Connection","doc":"Specifies connection options for HTTP requests","ref":"ActivityPub.Federator.HTTP.Connection.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.Connection.adapter_options/2","doc":"","ref":"ActivityPub.Federator.HTTP.Connection.html#adapter_options/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.Connection.new/1","doc":"","ref":"ActivityPub.Federator.HTTP.Connection.html#new/1"},{"type":"module","title":"ActivityPub.Federator.HTTP.RateLimit","doc":"Rate limit middleware for Tesla using Hammer\nBased on `TeslaExtra.RateLimit` and `TeslaExtra.RetryAfter`","ref":"ActivityPub.Federator.HTTP.RateLimit.html"},{"type":"module","title":"ActivityPub.Federator.HTTP.RequestBuilder","doc":"Helper functions for building HTTP requests","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.add_param/4","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#add_param/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.headers/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#headers/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.method/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#method/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.opts/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#opts/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.url/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#url/2"},{"type":"module","title":"ActivityPub.Federator.HTTP.RetryAfter","doc":"Takes into account the Retry-After header returned by the server when the rate limit is exceeded.\n\nBased on `TeslaExtra.RetryAfter`","ref":"ActivityPub.Federator.HTTP.RetryAfter.html"},{"type":"module","title":"ActivityPub.Federator.HTTP.Tesla","doc":"","ref":"ActivityPub.Federator.HTTP.Tesla.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#delete/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#delete!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#get/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#get!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#head/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#head!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#options/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#options!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#patch/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#patch!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#post/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#post!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#put/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#put!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.request/2","doc":"Perform a request.","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2"},{"type":"function","title":"Options - ActivityPub.Federator.HTTP.Tesla.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2-options"},{"type":"function","title":"Examples - ActivityPub.Federator.HTTP.Tesla.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2-examples"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"ActivityPub.Federator.HTTP.Tesla.html#request!/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#trace/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#trace!/3"},{"type":"type","title":"ActivityPub.Federator.HTTP.Tesla.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"ActivityPub.Federator.HTTP.Tesla.html#t:option/0"},{"type":"behaviour","title":"ActivityPub.Federator.Publisher","doc":"Defines the contract used by federation implementations to publish messages to\ntheir peers.\n# TODO: why not use `APPublisher` directly instead?","ref":"ActivityPub.Federator.Publisher.html"},{"type":"function","title":"ActivityPub.Federator.Publisher.enqueue_one/2","doc":"Enqueue publishing a single activity.","ref":"ActivityPub.Federator.Publisher.html#enqueue_one/2"},{"type":"function","title":"ActivityPub.Federator.Publisher.gather_webfinger_links/1","doc":"","ref":"ActivityPub.Federator.Publisher.html#gather_webfinger_links/1"},{"type":"callback","title":"ActivityPub.Federator.Publisher.gather_webfinger_links/1","doc":"Gathers links used by an outgoing federation module for WebFinger output.","ref":"ActivityPub.Federator.Publisher.html#c:gather_webfinger_links/1"},{"type":"callback","title":"ActivityPub.Federator.Publisher.is_representable?/1","doc":"Determine whether an activity can be relayed using the federation module.","ref":"ActivityPub.Federator.Publisher.html#c:is_representable?/1"},{"type":"function","title":"ActivityPub.Federator.Publisher.publish/2","doc":"","ref":"ActivityPub.Federator.Publisher.html#publish/2"},{"type":"callback","title":"ActivityPub.Federator.Publisher.publish/2","doc":"Relays an activity to all specified peers.","ref":"ActivityPub.Federator.Publisher.html#c:publish/2"},{"type":"callback","title":"ActivityPub.Federator.Publisher.publish_one/1","doc":"Relays an activity to a specified peer, determined by the parameters. The\nparameters used are controlled by the federation module.","ref":"ActivityPub.Federator.Publisher.html#c:publish_one/1"},{"type":"module","title":"ActivityPub.Federator.Transformer","doc":"This module normalises outgoing data to conform with AS2/AP specs\nand handles incoming objects and activities","ref":"ActivityPub.Federator.Transformer.html"},{"type":"function","title":"ActivityPub.Federator.Transformer.add_emoji_tags/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#add_emoji_tags/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_actor/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_actor/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_addressing/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_addressing/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_attachments/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_attachments/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_content_map/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_content_map/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_context/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_context/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_emoji/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_emoji/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_in_reply_to/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_in_reply_to/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_object/2","doc":"Modifies an incoming AP object (mastodon format) to our internal format.","ref":"ActivityPub.Federator.Transformer.html#fix_object/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_quote_url/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_quote_url/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_replies/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_replies/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_summary/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_summary/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_tag/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_tag/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_url/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_url/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.format_input/3","doc":"","ref":"ActivityPub.Federator.Transformer.html#format_input/3"},{"type":"function","title":"ActivityPub.Federator.Transformer.handle_incoming/2","doc":"Handles incoming data, inserts it into the database and triggers side effects if the data is a supported activity type.","ref":"ActivityPub.Federator.Transformer.html#handle_incoming/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.maybe_handle_other_activity/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#maybe_handle_other_activity/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.prepare_outgoing/1","doc":"Translates MN Entity to an AP compatible format","ref":"ActivityPub.Federator.Transformer.html#prepare_outgoing/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.preserve_privacy_of_outgoing/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#preserve_privacy_of_outgoing/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.replies/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#replies/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.set_replies/1","doc":"Serialized Mastodon-compatible `replies` collection containing _self-replies_.\nBased on Mastodon's ActivityPub::NoteSerializer#replies.","ref":"ActivityPub.Federator.Transformer.html#set_replies/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.take_emoji_tags/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#take_emoji_tags/1"},{"type":"module","title":"ActivityPub.Federator.WebFinger","doc":"Serves and fetches data (mainly actor URI) necessary for federation when only the username and host is known.","ref":"ActivityPub.Federator.WebFinger.html"},{"type":"function","title":"ActivityPub.Federator.WebFinger.base_url/1","doc":"","ref":"ActivityPub.Federator.WebFinger.html#base_url/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.finger/1","doc":"Fetches webfinger data for an account given in \"@username@domain.tld\" format.","ref":"ActivityPub.Federator.WebFinger.html#finger/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.output/1","doc":"Serves a webfinger response for the requested username.","ref":"ActivityPub.Federator.WebFinger.html#output/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.represent_user/1","doc":"Formats gathered data into a JRD format.","ref":"ActivityPub.Federator.WebFinger.html#represent_user/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.webfinger_from_json/1","doc":"","ref":"ActivityPub.Federator.WebFinger.html#webfinger_from_json/1"},{"type":"module","title":"ActivityPub.Federator.Worker","doc":"Helpers for workers to `use`","ref":"ActivityPub.Federator.Worker.html"},{"type":"function","title":"ActivityPub.Federator.Worker.worker_args/1","doc":"","ref":"ActivityPub.Federator.Worker.html#worker_args/1"},{"type":"module","title":"ActivityPub.Federator.Workers.PublisherWorker","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.PublisherWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.PublisherWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Federator.Workers.ReceiverWorker","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.ReceiverWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.ReceiverWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Fixtures","doc":"","ref":"ActivityPub.Fixtures.html"},{"type":"function","title":"ActivityPub.Fixtures.file/1","doc":"","ref":"ActivityPub.Fixtures.html#file/1"},{"type":"function","title":"ActivityPub.Fixtures.fixtures/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures/0"},{"type":"function","title":"ActivityPub.Fixtures.fixtures_generic/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures_generic/0"},{"type":"function","title":"ActivityPub.Fixtures.fixtures_get/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures_get/0"},{"type":"function","title":"ActivityPub.Fixtures.get/4","doc":"","ref":"ActivityPub.Fixtures.html#get/4"},{"type":"function","title":"ActivityPub.Fixtures.head/4","doc":"","ref":"ActivityPub.Fixtures.html#head/4"},{"type":"function","title":"ActivityPub.Fixtures.insert/1","doc":"","ref":"ActivityPub.Fixtures.html#insert/1"},{"type":"function","title":"ActivityPub.Fixtures.insert_all/0","doc":"","ref":"ActivityPub.Fixtures.html#insert_all/0"},{"type":"function","title":"ActivityPub.Fixtures.insert_file/1","doc":"","ref":"ActivityPub.Fixtures.html#insert_file/1"},{"type":"function","title":"ActivityPub.Fixtures.insert_json/1","doc":"","ref":"ActivityPub.Fixtures.html#insert_json/1"},{"type":"function","title":"ActivityPub.Fixtures.maybe_get_local/4","doc":"","ref":"ActivityPub.Fixtures.html#maybe_get_local/4"},{"type":"function","title":"ActivityPub.Fixtures.mock_global/1","doc":"","ref":"ActivityPub.Fixtures.html#mock_global/1"},{"type":"function","title":"ActivityPub.Fixtures.none/4","doc":"","ref":"ActivityPub.Fixtures.html#none/4"},{"type":"function","title":"ActivityPub.Fixtures.post/4","doc":"","ref":"ActivityPub.Fixtures.html#post/4"},{"type":"function","title":"ActivityPub.Fixtures.request/1","doc":"","ref":"ActivityPub.Fixtures.html#request/1"},{"type":"module","title":"ActivityPub.Instances","doc":"Instances context.","ref":"ActivityPub.Instances.html"},{"type":"function","title":"ActivityPub.Instances.filter_reachable/1","doc":"","ref":"ActivityPub.Instances.html#filter_reachable/1"},{"type":"function","title":"ActivityPub.Instances.host/1","doc":"","ref":"ActivityPub.Instances.html#host/1"},{"type":"function","title":"ActivityPub.Instances.reachability_datetime_threshold/0","doc":"","ref":"ActivityPub.Instances.html#reachability_datetime_threshold/0"},{"type":"function","title":"ActivityPub.Instances.reachable?/1","doc":"","ref":"ActivityPub.Instances.html#reachable?/1"},{"type":"function","title":"ActivityPub.Instances.set_consistently_unreachable/1","doc":"","ref":"ActivityPub.Instances.html#set_consistently_unreachable/1"},{"type":"function","title":"ActivityPub.Instances.set_reachable/1","doc":"","ref":"ActivityPub.Instances.html#set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.set_unreachable/2","doc":"","ref":"ActivityPub.Instances.html#set_unreachable/2"},{"type":"module","title":"ActivityPub.Instances.Instance","doc":"Instance.","ref":"ActivityPub.Instances.Instance.html"},{"type":"function","title":"ActivityPub.Instances.Instance.changeset/2","doc":"","ref":"ActivityPub.Instances.Instance.html#changeset/2"},{"type":"function","title":"ActivityPub.Instances.Instance.do_set_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#do_set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.filter_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#filter_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.host/1","doc":"","ref":"ActivityPub.Instances.Instance.html#host/1"},{"type":"function","title":"ActivityPub.Instances.Instance.reachable?/1","doc":"","ref":"ActivityPub.Instances.Instance.html#reachable?/1"},{"type":"function","title":"ActivityPub.Instances.Instance.set_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.set_unreachable/2","doc":"","ref":"ActivityPub.Instances.Instance.html#set_unreachable/2"},{"type":"behaviour","title":"ActivityPub.MRF","doc":"Message Rewrite Facility\n\n**WARNING: Due to how this app currently handles its configuration, MRF is only usable if you're building your own docker image.**\n\nThe Message Rewrite Facility (MRF) is a subsystem that is implemented as a series of hooks that allows the administrator to rewrite or discard messages.\n\nPossible uses include:\n\n- marking incoming messages with media from a given account or instance as sensitive\n- rejecting messages from a specific instance\n- rejecting reports (flags) from a specific instance\n- removing/unlisting messages from the public timelines\n- removing media from messages\n- sending only public messages to a specific instance\n\nThe MRF provides user-configurable policies. The default policy is `NoOpPolicy`, which disables the MRF functionality. Bonfire also includes an easy to use policy called `SimplePolicy` which maps messages matching certain pre-defined criterion to actions built into the policy module. It is possible to use multiple, active MRF policies at the same time.\n\n> See the docs of `ActivityPub.MRF.SimplePolicy` for details about how to use it.","ref":"ActivityPub.MRF.html"},{"type":"behaviour","title":"Use with Care - ActivityPub.MRF","doc":"The effects of MRF policies can be very drastic. It is important to use this functionality carefully. Always try to talk to an admin before writing an MRF policy concerning their instance.","ref":"ActivityPub.MRF.html#module-use-with-care"},{"type":"behaviour","title":"Writing your own MRF Policy - ActivityPub.MRF","doc":"As discussed above, the MRF system is a modular system that supports pluggable policies. This means that an admin may write a custom MRF policy in Elixir or any other language that runs on the Erlang VM, by specifying the module name in the `rewrite_policy` config setting.\n\nFor example, here is a sample policy module which rewrites all messages to \"new message content\":\n\n```elixir\n# This is a sample MRF policy which rewrites all Notes to have \"new message\n# content.\"\ndefmodule Site.RewritePolicy do\n @behavior ActivityPub.MRF\n\n # Catch messages which contain Note objects with actual data to filter.\n # Capture the object as `object`, the message content as `content` and the\n # entire activity itself as `activity`.\n @impl true\n def filter(%{\"type\" => \"Create\", \"object\" => %{\"type\" => \"Note\", \"content\" => content} = object} = message)\n when is_binary(content) do\n # Subject / CW is stored as summary instead of `name` like other AS2 objects\n # because of Mastodon doing it that way.\n summary = object[\"summary\"]\n\n # edits go here.\n content = \"new message content\"\n\n # Assemble the mutated object.\n object =\n object\n |> Map.put(\"content\", content)\n |> Map.put(\"summary\", summary)\n\n # Assemble the mutated activity.\n {:ok, Map.put(activity, \"object\", object)}\n end\n\n # Let all other messages through without modifying them.\n @impl true\n def filter(message), do: {:ok, message}\nend\n```\n\nIf you save this file as `lib/site/mrf/rewrite_policy.ex`, it will be included when you next rebuild Bonfire. You can enable it in the configuration like so:\n\n```\nconfig :activity_pub, :instance,\n rewrite_policy: [\n ActivityPub.MRF.SimplePolicy,\n Site.RewritePolicy\n ]\n```","ref":"ActivityPub.MRF.html#module-writing-your-own-mrf-policy"},{"type":"function","title":"ActivityPub.MRF.filter/2","doc":"","ref":"ActivityPub.MRF.html#filter/2"},{"type":"callback","title":"ActivityPub.MRF.filter/2","doc":"","ref":"ActivityPub.MRF.html#c:filter/2"},{"type":"function","title":"ActivityPub.MRF.filter/3","doc":"","ref":"ActivityPub.MRF.html#filter/3"},{"type":"function","title":"ActivityPub.MRF.get_policies/0","doc":"","ref":"ActivityPub.MRF.html#get_policies/0"},{"type":"function","title":"ActivityPub.MRF.subdomain_match?/2","doc":"","ref":"ActivityPub.MRF.html#subdomain_match?/2"},{"type":"function","title":"ActivityPub.MRF.subdomains_regex/1","doc":"","ref":"ActivityPub.MRF.html#subdomains_regex/1"},{"type":"module","title":"ActivityPub.MRF.SimplePolicy","doc":"Filter activities depending on their origin instance or other criteria.\n\n`SimplePolicy` is capable of handling most common admin tasks.\n\nTo use `SimplePolicy`, you must enable it. Do so by adding the following to your `:instance` config object, so that it looks like this:\n\n```\nconfig :bonfire, :instance,\n [...]\n rewrite_policy: ActivityPub.MRF.SimplePolicy\n```\n\nOnce `SimplePolicy` is enabled, you can configure various groups in the `:mrf_simple` config object. These groups are:\n\n- `media_removal`: Servers in this group will have media stripped from incoming messages.\n- `media_nsfw`: Servers in this group will have the #nsfw tag and sensitive setting injected into incoming messages which contain media.\n- `reject`: Servers in this group will have their messages rejected.\n- `report_removal`: Servers in this group will have their reports (flags) rejected.\n\nServers should be configured as lists.","ref":"ActivityPub.MRF.SimplePolicy.html"},{"type":"module","title":"Example - ActivityPub.MRF.SimplePolicy","doc":"This example will enable `SimplePolicy`, block media from `illegalporn.biz`, mark media as NSFW from `porn.biz` and `porn.business`, reject messages from `spam.com` and block reports (flags) from `troll.mob`:\n\n```\nconfig :activity_pub, :instance,\n rewrite_policy: [ActivityPub.MRF.SimplePolicy]\n\nconfig :activity_pub, :mrf_simple,\n media_removal: [\"illegalporn.biz\"],\n media_nsfw: [\"porn.biz\", \"porn.business\"],\n reject: [\"spam.com\"],\n report_removal: [\"troll.mob\"]\n\n```","ref":"ActivityPub.MRF.SimplePolicy.html#module-example"},{"type":"function","title":"ActivityPub.MRF.SimplePolicy.check_reject/2","doc":"","ref":"ActivityPub.MRF.SimplePolicy.html#check_reject/2"},{"type":"module","title":"ActivityPub.Object","doc":"","ref":"ActivityPub.Object.html"},{"type":"function","title":"ActivityPub.Object.actor_from_data/1","doc":"","ref":"ActivityPub.Object.html#actor_from_data/1"},{"type":"function","title":"ActivityPub.Object.actor_id_from_data/1","doc":"","ref":"ActivityPub.Object.html#actor_id_from_data/1"},{"type":"function","title":"ActivityPub.Object.all/1","doc":"","ref":"ActivityPub.Object.html#all/1"},{"type":"function","title":"ActivityPub.Object.changeset/1","doc":"","ref":"ActivityPub.Object.html#changeset/1"},{"type":"function","title":"ActivityPub.Object.changeset/2","doc":"","ref":"ActivityPub.Object.html#changeset/2"},{"type":"function","title":"ActivityPub.Object.common_changeset/1","doc":"","ref":"ActivityPub.Object.html#common_changeset/1"},{"type":"function","title":"ActivityPub.Object.delete/1","doc":"","ref":"ActivityPub.Object.html#delete/1"},{"type":"function","title":"ActivityPub.Object.do_insert/1","doc":"","ref":"ActivityPub.Object.html#do_insert/1"},{"type":"function","title":"ActivityPub.Object.do_update_existing/2","doc":"","ref":"ActivityPub.Object.html#do_update_existing/2"},{"type":"function","title":"ActivityPub.Object.fetch_latest_block/2","doc":"","ref":"ActivityPub.Object.html#fetch_latest_block/2"},{"type":"function","title":"ActivityPub.Object.fetch_latest_follow/2","doc":"","ref":"ActivityPub.Object.html#fetch_latest_follow/2"},{"type":"function","title":"ActivityPub.Object.get_activity_for_object_ap_id/2","doc":"","ref":"ActivityPub.Object.html#get_activity_for_object_ap_id/2"},{"type":"function","title":"ActivityPub.Object.get_ap_id/1","doc":"","ref":"ActivityPub.Object.html#get_ap_id/1"},{"type":"function","title":"ActivityPub.Object.get_cached/1","doc":"","ref":"ActivityPub.Object.html#get_cached/1"},{"type":"function","title":"ActivityPub.Object.get_cached!/1","doc":"","ref":"ActivityPub.Object.html#get_cached!/1"},{"type":"function","title":"ActivityPub.Object.get_existing_announce/2","doc":"Retruns an existing announce activity if the notice has already been announced","ref":"ActivityPub.Object.html#get_existing_announce/2"},{"type":"function","title":"ActivityPub.Object.get_existing_like/2","doc":"Returns an existing like if a user already liked an object","ref":"ActivityPub.Object.html#get_existing_like/2"},{"type":"function","title":"ActivityPub.Object.get_follow_activity/2","doc":"","ref":"ActivityPub.Object.html#get_follow_activity/2"},{"type":"function","title":"ActivityPub.Object.get_inbox/2","doc":"","ref":"ActivityPub.Object.html#get_inbox/2"},{"type":"function","title":"ActivityPub.Object.get_outbox_for_actor/2","doc":"","ref":"ActivityPub.Object.html#get_outbox_for_actor/2"},{"type":"function","title":"ActivityPub.Object.get_outbox_for_instance/1","doc":"","ref":"ActivityPub.Object.html#get_outbox_for_instance/1"},{"type":"function","title":"ActivityPub.Object.get_uncached/1","doc":"","ref":"ActivityPub.Object.html#get_uncached/1"},{"type":"function","title":"ActivityPub.Object.hard_delete/1","doc":"","ref":"ActivityPub.Object.html#hard_delete/1"},{"type":"function","title":"ActivityPub.Object.hashtags/1","doc":"","ref":"ActivityPub.Object.html#hashtags/1"},{"type":"function","title":"ActivityPub.Object.invalidate_cache/1","doc":"","ref":"ActivityPub.Object.html#invalidate_cache/1"},{"type":"function","title":"ActivityPub.Object.is_deleted?/1","doc":"","ref":"ActivityPub.Object.html#is_deleted?/1"},{"type":"function","title":"ActivityPub.Object.make_tombstone/2","doc":"","ref":"ActivityPub.Object.html#make_tombstone/2"},{"type":"function","title":"ActivityPub.Object.maybe_fetch/2","doc":"","ref":"ActivityPub.Object.html#maybe_fetch/2"},{"type":"function","title":"ActivityPub.Object.maybe_upsert/3","doc":"","ref":"ActivityPub.Object.html#maybe_upsert/3"},{"type":"function","title":"ActivityPub.Object.normalise_tos/1","doc":"","ref":"ActivityPub.Object.html#normalise_tos/1"},{"type":"function","title":"ActivityPub.Object.normalize/3","doc":"","ref":"ActivityPub.Object.html#normalize/3"},{"type":"function","title":"ActivityPub.Object.normalize_actors/1","doc":"","ref":"ActivityPub.Object.html#normalize_actors/1"},{"type":"function","title":"ActivityPub.Object.normalize_params/3","doc":"","ref":"ActivityPub.Object.html#normalize_params/3"},{"type":"function","title":"ActivityPub.Object.object_url/1","doc":"","ref":"ActivityPub.Object.html#object_url/1"},{"type":"function","title":"ActivityPub.Object.prepare_data/4","doc":"Prepares a struct to be inserted into the objects table","ref":"ActivityPub.Object.html#prepare_data/4"},{"type":"function","title":"ActivityPub.Object.query/1","doc":"","ref":"ActivityPub.Object.html#query/1"},{"type":"function","title":"ActivityPub.Object.self_replies_ids/2","doc":"","ref":"ActivityPub.Object.html#self_replies_ids/2"},{"type":"function","title":"ActivityPub.Object.set_cache/1","doc":"","ref":"ActivityPub.Object.html#set_cache/1"},{"type":"function","title":"ActivityPub.Object.swap_object_with_tombstone/1","doc":"","ref":"ActivityPub.Object.html#swap_object_with_tombstone/1"},{"type":"function","title":"ActivityPub.Object.update_and_set_cache/1","doc":"","ref":"ActivityPub.Object.html#update_and_set_cache/1"},{"type":"function","title":"ActivityPub.Object.update_changeset/2","doc":"","ref":"ActivityPub.Object.html#update_changeset/2"},{"type":"function","title":"ActivityPub.Object.update_existing/2","doc":"","ref":"ActivityPub.Object.html#update_existing/2"},{"type":"function","title":"ActivityPub.Object.update_state/3","doc":"Updates a follow activity's state (for locked accounts).","ref":"ActivityPub.Object.html#update_state/3"},{"type":"type","title":"ActivityPub.Object.t/0","doc":"","ref":"ActivityPub.Object.html#t:t/0"},{"type":"module","title":"ActivityPub.Pruner","doc":"Prunes objects from the database.","ref":"ActivityPub.Pruner.html"},{"type":"function","title":"ActivityPub.Pruner.prune_all/1","doc":"","ref":"ActivityPub.Pruner.html#prune_all/1"},{"type":"function","title":"ActivityPub.Pruner.prune_deletes/1","doc":"","ref":"ActivityPub.Pruner.html#prune_deletes/1"},{"type":"function","title":"ActivityPub.Pruner.prune_objects/1","doc":"","ref":"ActivityPub.Pruner.html#prune_objects/1"},{"type":"function","title":"ActivityPub.Pruner.prune_orphaned_activities/0","doc":"","ref":"ActivityPub.Pruner.html#prune_orphaned_activities/0"},{"type":"function","title":"ActivityPub.Pruner.prune_removes/1","doc":"","ref":"ActivityPub.Pruner.html#prune_removes/1"},{"type":"function","title":"ActivityPub.Pruner.prune_stale_follow_requests/1","doc":"","ref":"ActivityPub.Pruner.html#prune_stale_follow_requests/1"},{"type":"function","title":"ActivityPub.Pruner.prune_tombstones/1","doc":"","ref":"ActivityPub.Pruner.html#prune_tombstones/1"},{"type":"function","title":"ActivityPub.Pruner.prune_undos/1","doc":"","ref":"ActivityPub.Pruner.html#prune_undos/1"},{"type":"function","title":"ActivityPub.Pruner.remove_embedded_objects/0","doc":"","ref":"ActivityPub.Pruner.html#remove_embedded_objects/0"},{"type":"module","title":"ActivityPub.Pruner.PruneDatabaseWorker","doc":"The worker to prune old data from the database.","ref":"ActivityPub.Pruner.PruneDatabaseWorker.html"},{"type":"module","title":"ActivityPub.Queries","doc":"Contains queries for Object.","ref":"ActivityPub.Queries.html"},{"type":"function","title":"ActivityPub.Queries.activity_by_object_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#activity_by_object_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.by_actor/2","doc":"","ref":"ActivityPub.Queries.html#by_actor/2"},{"type":"function","title":"ActivityPub.Queries.by_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#by_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.by_id/2","doc":"","ref":"ActivityPub.Queries.html#by_id/2"},{"type":"function","title":"ActivityPub.Queries.by_object_id/2","doc":"","ref":"ActivityPub.Queries.html#by_object_id/2"},{"type":"function","title":"ActivityPub.Queries.by_object_in_reply_to_id/3","doc":"","ref":"ActivityPub.Queries.html#by_object_in_reply_to_id/3"},{"type":"function","title":"ActivityPub.Queries.by_type/2","doc":"","ref":"ActivityPub.Queries.html#by_type/2"},{"type":"function","title":"ActivityPub.Queries.exclude_type/2","doc":"","ref":"ActivityPub.Queries.html#exclude_type/2"},{"type":"function","title":"ActivityPub.Queries.find_by_object_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#find_by_object_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.last_follow/2","doc":"","ref":"ActivityPub.Queries.html#last_follow/2"},{"type":"function","title":"ActivityPub.Queries.ordered/1","doc":"","ref":"ActivityPub.Queries.html#ordered/1"},{"type":"function","title":"ActivityPub.Queries.replies/2","doc":"","ref":"ActivityPub.Queries.html#replies/2"},{"type":"function","title":"ActivityPub.Queries.self_replies/1","doc":"","ref":"ActivityPub.Queries.html#self_replies/1"},{"type":"function","title":"ActivityPub.Queries.with_joined_activity/3","doc":"","ref":"ActivityPub.Queries.html#with_joined_activity/3"},{"type":"function","title":"ActivityPub.Queries.with_joined_object/2","doc":"","ref":"ActivityPub.Queries.html#with_joined_object/2"},{"type":"function","title":"ActivityPub.Queries.with_preloaded_object/2","doc":"","ref":"ActivityPub.Queries.html#with_preloaded_object/2"},{"type":"type","title":"ActivityPub.Queries.query/0","doc":"","ref":"ActivityPub.Queries.html#t:query/0"},{"type":"module","title":"ActivityPub.Safety.Containment","doc":"This module contains some useful functions for containing objects to specific\norigins and determining those origins. They previously lived in the\nActivityPub `Transformer` module.\n\nObject containment is an important step in validating remote objects to prevent\nspoofing, therefore removal of object containment functions is NOT recommended.","ref":"ActivityPub.Safety.Containment.html"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_child/1","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_child/1"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_origin/2","doc":"Checks that an imported AP object's actor matches the host it came from.","ref":"ActivityPub.Safety.Containment.html#contain_origin/2"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_origin_from_id/2","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_origin_from_id/2"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_uri/2","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_uri/2"},{"type":"function","title":"ActivityPub.Safety.Containment.get_object/1","doc":"","ref":"ActivityPub.Safety.Containment.html#get_object/1"},{"type":"function","title":"ActivityPub.Safety.Containment.restrict_unauthenticated_access?/1","doc":"","ref":"ActivityPub.Safety.Containment.html#restrict_unauthenticated_access?/1"},{"type":"function","title":"ActivityPub.Safety.Containment.restrict_unauthenticated_access?/2","doc":"","ref":"ActivityPub.Safety.Containment.html#restrict_unauthenticated_access?/2"},{"type":"function","title":"ActivityPub.Safety.Containment.visible_for_user?/2","doc":"","ref":"ActivityPub.Safety.Containment.html#visible_for_user?/2"},{"type":"module","title":"ActivityPub.Safety.Keys","doc":"Handles RSA keys for Actors & helpers for HTTP signatures","ref":"ActivityPub.Safety.Keys.html"},{"type":"function","title":"ActivityPub.Safety.Keys.add_public_key/2","doc":"","ref":"ActivityPub.Safety.Keys.html#add_public_key/2"},{"type":"function","title":"ActivityPub.Safety.Keys.cast_uri/1","doc":"","ref":"ActivityPub.Safety.Keys.html#cast_uri/1"},{"type":"function","title":"ActivityPub.Safety.Keys.ensure_keys_present/1","doc":"Checks if an actor struct has a non-nil keys field and generates a PEM if it doesn't.","ref":"ActivityPub.Safety.Keys.html#ensure_keys_present/1"},{"type":"function","title":"ActivityPub.Safety.Keys.fetch_public_key_for_ap_id/1","doc":"Fetches the remote public key for given actor AP ID.","ref":"ActivityPub.Safety.Keys.html#fetch_public_key_for_ap_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.generate_rsa_pem/0","doc":"","ref":"ActivityPub.Safety.Keys.html#generate_rsa_pem/0"},{"type":"function","title":"ActivityPub.Safety.Keys.get_public_key_for_ap_id/1","doc":"Get the public key for given actor AP ID.","ref":"ActivityPub.Safety.Keys.html#get_public_key_for_ap_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.http_host/1","doc":"","ref":"ActivityPub.Safety.Keys.html#http_host/1"},{"type":"function","title":"ActivityPub.Safety.Keys.key_id_to_actor_id/1","doc":"","ref":"ActivityPub.Safety.Keys.html#key_id_to_actor_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.keypair_from_pem/1","doc":"","ref":"ActivityPub.Safety.Keys.html#keypair_from_pem/1"},{"type":"function","title":"ActivityPub.Safety.Keys.maybe_add_fetch_signature_headers/3","doc":"","ref":"ActivityPub.Safety.Keys.html#maybe_add_fetch_signature_headers/3"},{"type":"function","title":"ActivityPub.Safety.Keys.public_key_decode/1","doc":"","ref":"ActivityPub.Safety.Keys.html#public_key_decode/1"},{"type":"function","title":"ActivityPub.Safety.Keys.public_key_from_data/1","doc":"","ref":"ActivityPub.Safety.Keys.html#public_key_from_data/1"},{"type":"function","title":"ActivityPub.Safety.Keys.sign/2","doc":"","ref":"ActivityPub.Safety.Keys.html#sign/2"},{"type":"module","title":"ActivityPub.Safety.Signatures","doc":"Implementation for behaviour from `HTTPSignatures` library","ref":"ActivityPub.Safety.Signatures.html"},{"type":"function","title":"ActivityPub.Safety.Signatures.fetch_fresh_public_key/1","doc":"Fetch public key from remote actor","ref":"ActivityPub.Safety.Signatures.html#fetch_fresh_public_key/1"},{"type":"function","title":"ActivityPub.Safety.Signatures.fetch_public_key/1","doc":"Get or fetch public key from local cache/DB","ref":"ActivityPub.Safety.Signatures.html#fetch_public_key/1"},{"type":"function","title":"ActivityPub.Safety.Signatures.get_public_key/1","doc":"Get public key from local cache/DB","ref":"ActivityPub.Safety.Signatures.html#get_public_key/1"},{"type":"module","title":"ActivityPub.Utils","doc":"Misc functions used for federation","ref":"ActivityPub.Utils.html"},{"type":"function","title":"ActivityPub.Utils.activitypub_object_headers/0","doc":"","ref":"ActivityPub.Utils.html#activitypub_object_headers/0"},{"type":"function","title":"ActivityPub.Utils.adapter_fallback/0","doc":"","ref":"ActivityPub.Utils.html#adapter_fallback/0"},{"type":"function","title":"ActivityPub.Utils.ap_base_url/0","doc":"","ref":"ActivityPub.Utils.html#ap_base_url/0"},{"type":"function","title":"ActivityPub.Utils.ap_id/1","doc":"","ref":"ActivityPub.Utils.html#ap_id/1"},{"type":"function","title":"ActivityPub.Utils.as_local_public/0","doc":"","ref":"ActivityPub.Utils.html#as_local_public/0"},{"type":"function","title":"ActivityPub.Utils.cache_clear/0","doc":"","ref":"ActivityPub.Utils.html#cache_clear/0"},{"type":"function","title":"ActivityPub.Utils.cachex_fetch/4","doc":"","ref":"ActivityPub.Utils.html#cachex_fetch/4"},{"type":"function","title":"ActivityPub.Utils.error_json/3","doc":"","ref":"ActivityPub.Utils.html#error_json/3"},{"type":"function","title":"ActivityPub.Utils.format_date/1","doc":"","ref":"ActivityPub.Utils.html#format_date/1"},{"type":"function","title":"ActivityPub.Utils.generate_id/1","doc":"","ref":"ActivityPub.Utils.html#generate_id/1"},{"type":"function","title":"ActivityPub.Utils.generate_object_id/0","doc":"","ref":"ActivityPub.Utils.html#generate_object_id/0"},{"type":"function","title":"ActivityPub.Utils.get_with_cache/4","doc":"","ref":"ActivityPub.Utils.html#get_with_cache/4"},{"type":"function","title":"ActivityPub.Utils.has_as_public?/1","doc":"","ref":"ActivityPub.Utils.html#has_as_public?/1"},{"type":"function","title":"ActivityPub.Utils.is_uid?/1","doc":"","ref":"ActivityPub.Utils.html#is_uid?/1"},{"type":"function","title":"ActivityPub.Utils.is_ulid?/1","doc":"","ref":"ActivityPub.Utils.html#is_ulid?/1"},{"type":"function","title":"ActivityPub.Utils.is_uuid?/1","doc":"Takes a string and returns true if it is a valid UUID (Universally Unique Identifier)","ref":"ActivityPub.Utils.html#is_uuid?/1"},{"type":"function","title":"ActivityPub.Utils.json_with_cache/6","doc":"","ref":"ActivityPub.Utils.html#json_with_cache/6"},{"type":"function","title":"ActivityPub.Utils.label_in_collection?/2","doc":"","ref":"ActivityPub.Utils.html#label_in_collection?/2"},{"type":"function","title":"ActivityPub.Utils.make_date/0","doc":"","ref":"ActivityPub.Utils.html#make_date/0"},{"type":"function","title":"ActivityPub.Utils.make_json_ld_header/1","doc":"","ref":"ActivityPub.Utils.html#make_json_ld_header/1"},{"type":"function","title":"ActivityPub.Utils.maybe_put/3","doc":"conditionally update a map","ref":"ActivityPub.Utils.html#maybe_put/3"},{"type":"function","title":"ActivityPub.Utils.maybe_to_atom/1","doc":"","ref":"ActivityPub.Utils.html#maybe_to_atom/1"},{"type":"function","title":"ActivityPub.Utils.maybe_to_string/1","doc":"Handles multiple cases where the input value is of a different type (atom, list, tuple, etc.) and returns a string representation of it.","ref":"ActivityPub.Utils.html#maybe_to_string/1"},{"type":"function","title":"ActivityPub.Utils.ok_unwrap/2","doc":"","ref":"ActivityPub.Utils.html#ok_unwrap/2"},{"type":"function","title":"ActivityPub.Utils.public?/1","doc":"","ref":"ActivityPub.Utils.html#public?/1"},{"type":"function","title":"ActivityPub.Utils.public?/2","doc":"Determines if an object or an activity is public.","ref":"ActivityPub.Utils.html#public?/2"},{"type":"function","title":"ActivityPub.Utils.put_if_present/4","doc":"","ref":"ActivityPub.Utils.html#put_if_present/4"},{"type":"function","title":"ActivityPub.Utils.repo/0","doc":"","ref":"ActivityPub.Utils.html#repo/0"},{"type":"function","title":"ActivityPub.Utils.request_ip/1","doc":"","ref":"ActivityPub.Utils.html#request_ip/1"},{"type":"function","title":"ActivityPub.Utils.return_json/4","doc":"","ref":"ActivityPub.Utils.html#return_json/4"},{"type":"function","title":"ActivityPub.Utils.safe_put_in/3","doc":"","ref":"ActivityPub.Utils.html#safe_put_in/3"},{"type":"function","title":"ActivityPub.Utils.service_actor/0","doc":"","ref":"ActivityPub.Utils.html#service_actor/0"},{"type":"function","title":"ActivityPub.Utils.service_actor!/0","doc":"","ref":"ActivityPub.Utils.html#service_actor!/0"},{"type":"function","title":"ActivityPub.Utils.set_repo/1","doc":"","ref":"ActivityPub.Utils.html#set_repo/1"},{"type":"function","title":"ActivityPub.Utils.single_ap_id/1","doc":"","ref":"ActivityPub.Utils.html#single_ap_id/1"},{"type":"function","title":"ActivityPub.Utils.single_ap_id_or_object/1","doc":"","ref":"ActivityPub.Utils.html#single_ap_id_or_object/1"},{"type":"function","title":"ActivityPub.Utils.stringify_keys/2","doc":"Takes a map or keyword list, and returns a map with any atom keys converted to string keys. It can optionally do so recursively.","ref":"ActivityPub.Utils.html#stringify_keys/2"},{"type":"function","title":"ActivityPub.Utils.uid/1","doc":"","ref":"ActivityPub.Utils.html#uid/1"},{"type":"module","title":"ActivityPub.Web","doc":"The entrypoint for defining your web interface, such\nas controllers, views, channels and so on.\n\nThis can be used in your application as:\n\n use ActivityPub.Web, :controller\n use ActivityPub.Web, :view\n\nThe definitions below will be executed for every view,\ncontroller, etc, so keep them short and clean, focused\non imports, uses and aliases.\n\nDo NOT define functions inside the quoted expressions\nbelow. Instead, define any helper function in modules\nand import those modules here.","ref":"ActivityPub.Web.html"},{"type":"macro","title":"ActivityPub.Web.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"ActivityPub.Web.html#__using__/1"},{"type":"function","title":"ActivityPub.Web.base_url/0","doc":"","ref":"ActivityPub.Web.html#base_url/0"},{"type":"function","title":"ActivityPub.Web.channel/0","doc":"","ref":"ActivityPub.Web.html#channel/0"},{"type":"function","title":"ActivityPub.Web.controller/0","doc":"","ref":"ActivityPub.Web.html#controller/0"},{"type":"function","title":"ActivityPub.Web.rate_limit_reached/2","doc":"","ref":"ActivityPub.Web.html#rate_limit_reached/2"},{"type":"function","title":"ActivityPub.Web.router/0","doc":"","ref":"ActivityPub.Web.html#router/0"},{"type":"function","title":"ActivityPub.Web.view/0","doc":"","ref":"ActivityPub.Web.html#view/0"},{"type":"module","title":"ActivityPub.Web.ActivityPubController","doc":"Endpoints for serving objects and collections, so the ActivityPub API can be used to read information from the server.\n\nEven though we store the data in AS format, some changes need to be applied to the entity before serving it in the AP REST response. This is done in `ActivityPub.Web.ActivityPubView`.","ref":"ActivityPub.Web.ActivityPubController.html"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.actor/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#actor/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.ap_route_helper/1","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#ap_route_helper/1"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.followers/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#followers/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.following/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#following/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.json_object_with_cache/3","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#json_object_with_cache/3"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.maybe_inbox/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#maybe_inbox/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.object/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#object/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.outbox/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#outbox/2"},{"type":"module","title":"ActivityPub.Web.ActorView","doc":"","ref":"ActivityPub.Web.ActorView.html"},{"type":"function","title":"ActivityPub.Web.ActorView.actor_json/1","doc":"","ref":"ActivityPub.Web.ActorView.html#actor_json/1"},{"type":"function","title":"ActivityPub.Web.ActorView.collection/4","doc":"","ref":"ActivityPub.Web.ActorView.html#collection/4"},{"type":"function","title":"ActivityPub.Web.ActorView.render/2","doc":"","ref":"ActivityPub.Web.ActorView.html#render/2"},{"type":"module","title":"ActivityPub.Web.Endpoint","doc":"","ref":"ActivityPub.Web.Endpoint.html"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast!/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast!/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast_from/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast_from/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast_from!/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.call/2","doc":"","ref":"ActivityPub.Web.Endpoint.html#call/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"ActivityPub.Web.Endpoint.html#child_spec/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"ActivityPub.Web.Endpoint.html#config/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"ActivityPub.Web.Endpoint.html#config_change/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"ActivityPub.Web.Endpoint.html#host/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.init/1","doc":"","ref":"ActivityPub.Web.Endpoint.html#init/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.local_broadcast/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#local_broadcast/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.local_broadcast_from/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"ActivityPub.Web.Endpoint.html#path/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.script_name/0","doc":"Generates the script name.","ref":"ActivityPub.Web.Endpoint.html#script_name/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"ActivityPub.Web.Endpoint.html#server_info/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"ActivityPub.Web.Endpoint.html#start_link/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_integrity/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_lookup/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"ActivityPub.Web.Endpoint.html#static_path/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_url/0"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#struct_url/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.subscribe/2","doc":"","ref":"ActivityPub.Web.Endpoint.html#subscribe/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.unsubscribe/1","doc":"","ref":"ActivityPub.Web.Endpoint.html#unsubscribe/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"ActivityPub.Web.Endpoint.html#url/0"},{"type":"module","title":"ActivityPub.Web.ErrorHelpers","doc":"Conveniences for translating and building error messages.","ref":"ActivityPub.Web.ErrorHelpers.html"},{"type":"function","title":"ActivityPub.Web.ErrorHelpers.error_tag/2","doc":"Generates tag for inlined form input errors.","ref":"ActivityPub.Web.ErrorHelpers.html#error_tag/2"},{"type":"module","title":"ActivityPub.Web.ErrorView","doc":"Standard error view","ref":"ActivityPub.Web.ErrorView.html"},{"type":"function","title":"ActivityPub.Web.ErrorView.render/2","doc":"","ref":"ActivityPub.Web.ErrorView.html#render/2"},{"type":"function","title":"ActivityPub.Web.ErrorView.template_not_found/2","doc":"By default, Phoenix returns the status message from the template name. For example, \"404.html\" becomes \"Not Found\".","ref":"ActivityPub.Web.ErrorView.html#template_not_found/2"},{"type":"module","title":"ActivityPub.Web.IncomingActivityPubController","doc":"Endpoints for the ActivityPub inbox","ref":"ActivityPub.Web.IncomingActivityPubController.html"},{"type":"function","title":"ActivityPub.Web.IncomingActivityPubController.inbox/2","doc":"","ref":"ActivityPub.Web.IncomingActivityPubController.html#inbox/2"},{"type":"function","title":"ActivityPub.Web.IncomingActivityPubController.outbox_info/2","doc":"","ref":"ActivityPub.Web.IncomingActivityPubController.html#outbox_info/2"},{"type":"module","title":"ActivityPub.Web.LayoutView","doc":"","ref":"ActivityPub.Web.LayoutView.html"},{"type":"function","title":"ActivityPub.Web.LayoutView.render/2","doc":"","ref":"ActivityPub.Web.LayoutView.html#render/2"},{"type":"module","title":"ActivityPub.Web.ObjectView","doc":"","ref":"ActivityPub.Web.ObjectView.html"},{"type":"function","title":"ActivityPub.Web.ObjectView.collection/4","doc":"","ref":"ActivityPub.Web.ObjectView.html#collection/4"},{"type":"function","title":"ActivityPub.Web.ObjectView.render/2","doc":"","ref":"ActivityPub.Web.ObjectView.html#render/2"},{"type":"module","title":"ActivityPub.Web.Plugs.DigestPlug","doc":"","ref":"ActivityPub.Web.Plugs.DigestPlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.DigestPlug.read_body/2","doc":"","ref":"ActivityPub.Web.Plugs.DigestPlug.html#read_body/2"},{"type":"module","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","doc":"Ensures HTTP signature has been validated by previous plugs on ActivityPub requests.","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.ignore/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#ignore/1"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#init/1"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.maybe_reject!/2","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#maybe_reject!/2"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.unauthorized/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#unauthorized/1"},{"type":"module","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.RedirectController","doc":"","ref":"ActivityPub.Web.RedirectController.html"},{"type":"function","title":"ActivityPub.Web.RedirectController.actor/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#actor/2"},{"type":"function","title":"ActivityPub.Web.RedirectController.object/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#object/2"},{"type":"function","title":"ActivityPub.Web.RedirectController.remote_interaction/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#remote_interaction/2"},{"type":"module","title":"ActivityPub.Web.Router","doc":"","ref":"ActivityPub.Web.Router.html"},{"type":"module","title":"ActivityPub.Web.Telemetry","doc":"","ref":"ActivityPub.Web.Telemetry.html"},{"type":"function","title":"ActivityPub.Web.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"ActivityPub.Web.Telemetry.html#child_spec/1"},{"type":"function","title":"ActivityPub.Web.Telemetry.metrics/0","doc":"","ref":"ActivityPub.Web.Telemetry.html#metrics/0"},{"type":"function","title":"ActivityPub.Web.Telemetry.start_link/1","doc":"","ref":"ActivityPub.Web.Telemetry.html#start_link/1"},{"type":"module","title":"ActivityPub.Web.UserSocket","doc":"","ref":"ActivityPub.Web.UserSocket.html"},{"type":"module","title":"ActivityPub.Web.WebFingerController","doc":"","ref":"ActivityPub.Web.WebFingerController.html"},{"type":"function","title":"ActivityPub.Web.WebFingerController.webfinger/2","doc":"","ref":"ActivityPub.Web.WebFingerController.html#webfinger/2"},{"type":"module","title":"Iconify","doc":"Phoenix helpers for using 100,000+ SVG icons from 100+ icon sets compiled by [Iconify](https://icon-sets.iconify.design) (visit that site to browse the sets available and preview the icons)\n\nIt copies only the icons you use from the iconify library into your project, preparing them on-the-fly when you first use an icon in a view or component (either at compile time if using the Surface component, or on the first run during development).\n\nIt can be configured to embed the icons one of three ways:\n- `css` (default): generate a single CSS file containing SVGs of all the icons used \n- `img` (default for emojis): to create SVG files in your static assets, used to be included with `img` tags and loaded over HTTP (you may want to include [svg-inject](https://github.com/iconfu/svg-inject) on your site to enable styling of the SVGs, e.g. to change their colour)\n- `inline`: to generate a Phoenix Component for each icon used, used to embed the icons as `svg` tags inline in the HTML of your views (meaning the SVG will be included in LiveView diffs)\n- `set`: to generate an SVG sprite set for each family, and reference icons with a `use` tag inside of inline SVGs.\n\nThere is also an optional integration of [phoenix_live_favicon](https://github.com/BartOtten/phoenix_live_favicon) so you can set an icon (or emoji) as favicon on a page with `Iconify.maybe_set_favicon(socket, icon_name_or_emoji)`.","ref":"Iconify.html"},{"type":"module","title":"Installation - Iconify","doc":"```elixir\ndef deps do\n [\n {:iconify_ex, \"~> 0.1.0\"}\n ]\nend\n```\n\nAfter running `mix deps.get` you need to fetch the latest [iconify icon sets](https://github.com/iconify/icon-sets) by running something like:\n```bash\ncd deps/iconify_ex/assets && yarn && cd -\n```","ref":"Iconify.html#module-installation"},{"type":"module","title":"Usage - Iconify","doc":"1. Add `import Iconify` in your Phoenix or LiveView module where you want to use it (or just once in the macros in your Web module). \n\n2. Set one of these options in config to choose which approach you want to use (see above for explanations):\n- `config :iconify_ex, :mode, :css` \n- `config :iconify_ex, :mode, :img` \n- `config :iconify_ex, :mode, :inline` \n- `config :iconify_ex, :mode, :set` \n\nIf using CSS mode, you'll need to include the CSS file in your layout (e.g. ` ` in your app's equivalent of `lib/my_app_web/components/layouts/root.html.heex`) and set some default styles that will be applied to all icons, by adding something like this to your app's main CSS (e.g. `assets/css/app.css`):\n```css\n[iconify] {\n background-color: currentColor;\n -webkit-mask-size: cover;\n mask-size: cover;\n min-width: 0.5rem;\n min-height: 0.5rem;\n}\n```\n\nOther configurations include:\n\n```elixir\nconfig :iconify_ex, :fallback_icon, \"heroicons-solid:question-mark-circle\" # when an icon is not found\nconfig :iconify_ex, :generated_icon_modules_path, \"./lib/web/icons\" # for :inline mode\nconfig :iconify_ex, :generated_icon_static_path, \"./priv/static/images/icons\" # where CSS and images are stored\nconfig :iconify_ex, :generated_icon_static_url, \"/images/icons/\" # where CSS and images are served from\n```\n\n3. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:\n\nEmbed an icon using default classes (copy the icon name from the [iconify website](https://icon-sets.iconify.design)):\n```html\n<.iconify icon=\"heroicons-solid:collection\" />\n```\n\nSpecify custom classes:\n```html\n<.iconify icon=\"heroicons-solid:collection\" class=\"w-8 h-8 text-base-content\" /> \n```\n\nOr if you use [Surface](https://surface-ui.org), it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:\n\nAdd `alias Iconify.Icon` to your Web module, and then:\n\n```html\n<#Icon iconify=\"heroicons-solid:collection\" />\n```\n\nIf your icon is dynamic, you'll still want to use the first form:\n```html\n<.iconify icon={@my_icon} />\n```\n\nNote: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like `sort -u -o icons_dir/icons.css icons_dir/icons.css` to clean up the CSS file.","ref":"Iconify.html#module-usage"},{"type":"function","title":"Iconify.add_icon_to_css/2","doc":"","ref":"Iconify.html#add_icon_to_css/2"},{"type":"function","title":"Iconify.dev_env?/0","doc":"","ref":"Iconify.html#dev_env?/0"},{"type":"function","title":"Iconify.emoji?/1","doc":"Checks if the icon is part of a known emoji set or any set that doesn't support CSS mode.","ref":"Iconify.html#emoji?/1"},{"type":"function","title":"Examples - Iconify.emoji?/1","doc":"iex> Iconify.emoji?(\"twemoji:smile\")\n true\n iex> Iconify.emoji?(\"heroicons-solid:user\")\n false","ref":"Iconify.html#emoji?/1-examples"},{"type":"function","title":"Iconify.fallback_icon/0","doc":"Returns the fallback icon name.","ref":"Iconify.html#fallback_icon/0"},{"type":"function","title":"Examples - Iconify.fallback_icon/0","doc":"iex> Iconify.fallback_icon()\n \"heroicons-solid:question-mark-circle\"","ref":"Iconify.html#fallback_icon/0-examples"},{"type":"function","title":"Iconify.generate_css_from_components/0","doc":"Generates CSS icons from existing components.","ref":"Iconify.html#generate_css_from_components/0"},{"type":"function","title":"Examples - Iconify.generate_css_from_components/0","doc":"iex> Iconify.generate_css_from_components()\n :ok","ref":"Iconify.html#generate_css_from_components/0-examples"},{"type":"function","title":"Iconify.generate_css_from_static_files/0","doc":"Generates CSS icons from existing static files.","ref":"Iconify.html#generate_css_from_static_files/0"},{"type":"function","title":"Examples - Iconify.generate_css_from_static_files/0","doc":"iex> Iconify.generate_css_from_static_files()\n :ok","ref":"Iconify.html#generate_css_from_static_files/0-examples"},{"type":"function","title":"Iconify.generate_sets_from_components/0","doc":"Generates icon sets from existing components.","ref":"Iconify.html#generate_sets_from_components/0"},{"type":"function","title":"Examples - Iconify.generate_sets_from_components/0","doc":"iex> Iconify.generate_sets_from_components()\n [:ok, :ok, ...]","ref":"Iconify.html#generate_sets_from_components/0-examples"},{"type":"function","title":"Iconify.iconify/1","doc":"Renders an icon as a `Phoenix.Component` based on the given assigns.","ref":"Iconify.html#iconify/1"},{"type":"function","title":"Examples - Iconify.iconify/1","doc":"iex> assigns = %{icon: \"heroicons-solid:user\", class: \"w-6 h-6\"}\n iex> Iconify.iconify(assigns)\n # Returns rendered icon HTML","ref":"Iconify.html#iconify/1-examples"},{"type":"function","title":"Iconify.list_all_existing/0","doc":"Lists all existing icons (components and CSS).","ref":"Iconify.html#list_all_existing/0"},{"type":"function","title":"Examples - Iconify.list_all_existing/0","doc":"iex> Iconify.list_all_existing()\n %{\n \"HeroiconsSolid\" => [Iconify.HeroiconsSolid.User, \"user\", ...],\n \"HeroiconsOutline\" => [Iconify.HeroiconsOutline.User, \"user\", ...]\n }","ref":"Iconify.html#list_all_existing/0-examples"},{"type":"function","title":"Iconify.list_components/0","doc":"Lists all available icon components.","ref":"Iconify.html#list_components/0"},{"type":"function","title":"Examples - Iconify.list_components/0","doc":"iex> Iconify.list_components()\n %{\n \"HeroiconsSolid\" => [Iconify.HeroiconsSolid.User, Iconify.HeroiconsSolid.Star, ...],\n \"HeroiconsOutline\" => [Iconify.HeroiconsOutline.User, Iconify.HeroiconsOutline.Star, ...]\n }","ref":"Iconify.html#list_components/0-examples"},{"type":"function","title":"Iconify.list_icons_in_css/0","doc":"Lists all icons defined in the CSS file.","ref":"Iconify.html#list_icons_in_css/0"},{"type":"function","title":"Examples - Iconify.list_icons_in_css/0","doc":"iex> Iconify.list_icons_in_css()\n %{\n \"HeroiconsSolid\" => [\"user\", \"star\", ...],\n \"HeroiconsOutline\" => [\"user\", \"star\", ...]\n }","ref":"Iconify.html#list_icons_in_css/0-examples"},{"type":"function","title":"Iconify.manual/2","doc":"Prepares and renders an icon.","ref":"Iconify.html#manual/2"},{"type":"function","title":"Examples - Iconify.manual/2","doc":"iex> Iconify.manual(\"heroicons-solid:user\", mode: :css)\n # Returns rendered icon HTML or data","ref":"Iconify.html#manual/2-examples"},{"type":"function","title":"Iconify.maybe_phx_live_set_dynamic/3","doc":"","ref":"Iconify.html#maybe_phx_live_set_dynamic/3"},{"type":"function","title":"Iconify.maybe_set_favicon/2","doc":"Sets the favicon for a Phoenix LiveView socket.","ref":"Iconify.html#maybe_set_favicon/2"},{"type":"function","title":"Examples - Iconify.maybe_set_favicon/2","doc":"iex> socket = %Phoenix.LiveView.Socket{}\n iex> Iconify.maybe_set_favicon(socket, \"heroicons-solid:star\")\n %Phoenix.LiveView.Socket{}","ref":"Iconify.html#maybe_set_favicon/2-examples"},{"type":"function","title":"Iconify.path/0","doc":"Returns the configured path for generated icon modules.","ref":"Iconify.html#path/0"},{"type":"function","title":"Examples - Iconify.path/0","doc":"iex> Iconify.path()\n \"./lib/web/icons\"","ref":"Iconify.html#path/0-examples"},{"type":"function","title":"Iconify.prepare/2","doc":"Prepares an icon based on the given assigns and mode (such as CSS, inline SVG, or image URL).","ref":"Iconify.html#prepare/2"},{"type":"function","title":"Examples - Iconify.prepare/2","doc":"iex> {:css, _function, %{\n icon: \"heroicons-solid:user\",\n class: \"w-4 h-4\",\n icon_name: \"heroicons-solid:user\"\n }} = Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :css)\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :inline)\n {:inline, _fun, %{icon: \"heroicons-solid:user\"}}\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :img)\n {:img, _fun, %{src: \"/images/icons/heroicons-solid/user.svg\"}}\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :set)\n {:set, _fun, %{href: \"/images/icons/heroicons-solid.svg#user\"}}\n\n iex> Iconify.prepare(%{icon: \"twemoji:rabbit\"})\n {:img, _fun, %{src: \"/images/icons/twemoji/rabbit.svg\"}}\n\n iex> Iconify.prepare(%{icon: \"non-existent-icon\"})\n {:css, _fun, %{icon_name: \"heroicons-solid:question-mark-circle\"}}\n\n > Iconify.prepare(%{icon: \" ... \"})\n {:inline, _fun, %{icon: \" ... \"}}","ref":"Iconify.html#prepare/2-examples"},{"type":"function","title":"Iconify.prepare_entire_icon_family/2","doc":"Prepares an entire icon family for a particular mode.","ref":"Iconify.html#prepare_entire_icon_family/2"},{"type":"function","title":"Examples - Iconify.prepare_entire_icon_family/2","doc":"iex> Iconify.prepare_entire_icon_family(\"heroicons-solid\", :inline)\n # creates a Phoenix.Component module file for each icon in the set","ref":"Iconify.html#prepare_entire_icon_family/2-examples"},{"type":"function","title":"Iconify.static_path/0","doc":"Returns the configured path for generated static icon assets.","ref":"Iconify.html#static_path/0"},{"type":"function","title":"Examples - Iconify.static_path/0","doc":"iex> Iconify.static_path()\n \"./assets/static/images/icons\"","ref":"Iconify.html#static_path/0-examples"},{"type":"function","title":"Iconify.static_url/0","doc":"Returns the configured URL for generated static icon assets.","ref":"Iconify.html#static_url/0"},{"type":"function","title":"Examples - Iconify.static_url/0","doc":"iex> Iconify.static_url()\n \"/images/icons\"","ref":"Iconify.html#static_url/0-examples"},{"type":"function","title":"Iconify.using_svg_inject?/0","doc":"Checks if SVG injection is enabled in config.","ref":"Iconify.html#using_svg_inject?/0"},{"type":"function","title":"Examples - Iconify.using_svg_inject?/0","doc":"iex> Iconify.using_svg_inject?()\n false","ref":"Iconify.html#using_svg_inject?/0-examples"},{"type":"module","title":"Iconify.Icon","doc":"A `Surface` component for rendering icons using various methods.","ref":"Iconify.Icon.html"},{"type":"module","title":"Specifying what icon to use - Iconify.Icon","doc":"- `iconify` or `icon`: Any icon from Iconify (https://icones.js.org)\n- `solid`: Shorthand for Heroicons solid icons\n- `outline`: Shorthand for Heroicons outline icons","ref":"Iconify.Icon.html#module-specifying-what-icon-to-use"},{"type":"module","title":"Extra Properties - Iconify.Icon","doc":"- `svg`: Optionally pass SVG markup directly\n- `mode`: Sets what rendering mode to use (see `Iconify` docs)\n- `class`: Any CSS classes to apply to the icon","ref":"Iconify.Icon.html#module-extra-properties"},{"type":"module","title":"Examples - Iconify.Icon","doc":"iex> alias Iconify.Icon\n iex> ~F\"<#Icon iconify=\"heroicons-solid:user\" class=\"w-6 h-6\" />\"\n # Returns rendered icon HTML\n\n iex> ~F\"<#Icon solid=\"user\" class=\"w-6 h-6\" />\"\n \n iex> ~F\"<#Icon svg=\" ... \" class=\"w-6 h-6\" />\"","ref":"Iconify.Icon.html#module-examples"},{"type":"module","title":"Properties - Iconify.Icon","doc":"* **iconify** *:string, required: false, static: true*\n* **icon** *:string, required: false, static: true*\n* **solid** *:string, required: false, static: true*\n* **outline** *:string, required: false, static: true*\n* **svg** *:string, default: nil, required: false, static: true*\n* **mode** *:atom, required: false, static: true*\n* **class** *:css_class, default: nil*","ref":"Iconify.Icon.html#module-properties"},{"type":"function","title":"Iconify.Icon.class_to_string/1","doc":"","ref":"Iconify.Icon.html#class_to_string/1"},{"type":"function","title":"Iconify.Icon.expand/3","doc":"","ref":"Iconify.Icon.html#expand/3"},{"type":"macro","title":"Iconify.Icon.icon_name/1","doc":"","ref":"Iconify.Icon.html#icon_name/1"},{"type":"module","title":"Iconify.MaterialSymbols.CalendarMonth","doc":"","ref":"Iconify.MaterialSymbols.CalendarMonth.html"},{"type":"function","title":"Iconify.MaterialSymbols.CalendarMonth.render/1","doc":"","ref":"Iconify.MaterialSymbols.CalendarMonth.html#render/1"},{"type":"behaviour","title":"AbsintheClient","doc":"Supports use of GraphQL documents from with app containing the Absinthe schema","ref":"AbsintheClient.html"},{"type":"behaviour","title":"Example - AbsintheClient","doc":"First, `use AbsintheClient`, passing your `schema` and\nnotifying Absinthe to operate in `internal` mode:\n\n```elixir\ndefmodule MyAppWeb.UserController do\n use MyAppWeb, :controller\n use AbsintheClient, schema: MyAppWeb.Schema, action: [mode: :internal]\n\n # ... actions\n\nend\n```\n\nFor each action you want Absinthe to process, provide a GraphQL document using\nthe `@graphql` module attribute (before the action):\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10)\n }\n\"\"\"\ndef index(conn_or_socket, %{data: data}) do\n render conn_or_socket, \"index.html\", data\nend\n```\n\nThe params for the action will be intercepted by the\n`AbsintheClient.Action` plug, and used as variables for\nthe GraphQL document you've specified.\n\nFor instance, given a definition for a `:user_filter` input object\ntype like this:\n\n```\ninput_object :user_filter do\n field :name_matches, :string\n field :age_above, :integer\n field :age_below, :integer\nend\n```\n\nAnd a query that looks like this (assuming you have the normal\n`Plug.Parsers` configuration for param parsing):\n\n```\n?filter[name_matches]=joe&filter[age_above]=42\n```\n\nThen Absinthe will receive variable definitions of:\n\n```\n%{\"filter\" => %{\"name_matches\" => \"joe\", \"age_above\" => 42}}\n```\n\n(For how the string `\"42\"` was converted into `42`, see `cast_param/3`).\n\nThe params on the `conn_or_socket` will then be replaced by the result of the\nexecution by Absinthe. The action function can then match against\nthat result to respond correctly to the user:\n\nIt's up to you to handle the three possible results:\n\n- When there's `:data` but no `:errors`, everything went perfectly.\n- When there's `:errors` but no `:data`, a validation error occurred and the document could not be\n executed.\n- When there's `:data` and `:errors`, partial data is available but some fields reported errors\n during execution.\n\nNotice the keys are atoms, not strings as in normal Phoenix action invocations.","ref":"AbsintheClient.html#module-example"},{"type":"behaviour","title":"Differences with the GraphQL Specification - AbsintheClient","doc":"There are some important differences between GraphQL documents as\nprocessed in an HTTP API and the GraphQL documents that this module\nsupports.\n\nIn an effort to make use of GraphQL ergonomic in Elixir,\nAbsinthe supports some slight structural modifications to\nthe GraphQL documents provided using the `@graphql` module attribute\nin controller modules.\n\nIn a way, you can think of these changes as a specialized GraphQL\ndialect. The following are the differences you need to keep in mind.","ref":"AbsintheClient.html#module-differences-with-the-graphql-specification"},{"type":"behaviour","title":"Objects can be leaf nodes - AbsintheClient","doc":"Let's look at the `users` example mentioned before:\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10)\n }\n\"\"\"\n```\n\nYou'll notice that in the above example, `users` doesn't have an\naccompanying _selection set_ (that is, a set of child fields bounded\nby `{ ... }`). The GraphQL specification dictates that only scalar\nvalues can be \"leaf nodes\" in a GraphQL document... but to support\nunmodified struct values being returned (for example, Ecto schemas),\nif no selection set is provided for an object value (or list\nthereof), the entire value is returned.\n\nThe template can then use `users` as needed:\n\n```\n \n <%= for user <- @users do %>\n <%= link user.full_name, to: user_path(@conn_or_socket, :show, user) %> \n <% end %>\n \n```\n\nThis is useful for `Phoenix.HTML` helper functions that expect\nstructs with specific fields (especially `form_for`).\n\nOne way to think of this change is that, for objects, no selection\nset is equivalent to a \"splat\" operator (except, of course, even\nfields not defined in your GraphQL schema are returned as part of\nthe value).\n\nBut, never fear, nothing is stopping you from ignoring this behavior\nand providing a selection set if you want a traditionally narrow set\nof fields:\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10) {\n id\n full_name\n }\n }\n\"\"\"\n```","ref":"AbsintheClient.html#module-objects-can-be-leaf-nodes"},{"type":"behaviour","title":"Scalar values aren't serialized - AbsintheClient","doc":"To remove the need for reparsing values, scalar values aren't serialized;\nPhoenix actions receive the original, unserialized values of GraphQL fields.\n\nThis is especially useful for custom scalar types. Using a couple of the\nadditional types packaged in `Absinthe.Type.Custom`, for example:\n\n- `:decimal` values are returned as `%Decimal{}` structs, not strings.\n- `:datetime` values are returned as `%DateTime{}` structs, not strings.\n\nIn short, GraphQL used in controllers is a query language to retrieve the values requested---there's no need to serialize the\nvalues to send them across HTTP.","ref":"AbsintheClient.html#module-scalar-values-aren-t-serialized"},{"type":"behaviour","title":"Fields use snake_case - AbsintheClient","doc":"Unlike in the GraphQL notation scheme we prefer for GraphQL APIs (that is,\n`camelCase` fields, which better match up with the expectations of JavaScript\nclients), fields used in documents provided as `@graphql` should use\n`snake_case` naming, as Elixir conventions use that notation style for atoms,\netc.","ref":"AbsintheClient.html#module-fields-use-snake_case"},{"type":"behaviour","title":"Atom keys - AbsintheClient","doc":"Because you are writing the GraphQL document in your controller and Absinthe\nis validating the document against your schema, atom keys are returned for\nfield names.","ref":"AbsintheClient.html#module-atom-keys"},{"type":"callback","title":"AbsintheClient.absinthe_pipeline/2","doc":"Customize the Absinthe processing pipeline.\n\nOnly implement this function if you need to change the pipeline used\nto process documents.","ref":"AbsintheClient.html#c:absinthe_pipeline/2"},{"type":"callback","title":"AbsintheClient.cast_param/3","doc":"Cast string param values to values Absinthe expects for variable input.\n\nSome scalar types, like `:integer` (GraphQL `Int`) require that raw,\nincoming value be a non-string type. This isn't a problem in\nGraphQL-over-HTTP because the variable values are provided as a JSON\npayload (which supports, i.e., integer values).\n\nTo support converting incoming param values to the format that\ncertain scalars expect, we support a `cast_param/3` callback\nfunction that takes a raw value, target type (e.g., the scalar\ntype), and the schema, and returns the transformed\nvalue. `cast_param/3` is overridable and the implementation already\nsupports `:integer` and `:float` types.\n\nIf you override `cast_param/3`, make sure you super or handle lists,\nnon-nulls, and input object values yourself; they're also processed\nusing the function.\n\nImportant: In the event that a value is _invalid_, just return it\nunchanged so that Absinthe's usual validation logic can report it as\ninvalid.","ref":"AbsintheClient.html#c:cast_param/3"},{"type":"function","title":"AbsintheClient.default_pipeline/2","doc":"","ref":"AbsintheClient.html#default_pipeline/2"},{"type":"function","title":"AbsintheClient.variables/1","doc":"","ref":"AbsintheClient.html#variables/1"},{"type":"module","title":"AbsintheClient.Helpers","doc":"","ref":"AbsintheClient.Helpers.html"},{"type":"function","title":"AbsintheClient.Helpers.assign/3","doc":"","ref":"AbsintheClient.Helpers.html#assign/3"},{"type":"function","title":"AbsintheClient.Helpers.error/2","doc":"","ref":"AbsintheClient.Helpers.html#error/2"},{"type":"function","title":"AbsintheClient.Helpers.maybe_to_atom/1","doc":"","ref":"AbsintheClient.Helpers.html#maybe_to_atom/1"},{"type":"module","title":"ConsoleHelpers","doc":"Handy aliases and imports to add to your iex CLI session","ref":"ConsoleHelpers.html"},{"type":"module","title":"DaisyTheme","doc":"","ref":"DaisyTheme.html"},{"type":"function","title":"DaisyTheme.adjust/5","doc":"","ref":"DaisyTheme.html#adjust/5"},{"type":"function","title":"DaisyTheme.clamp/3","doc":"","ref":"DaisyTheme.html#clamp/3"},{"type":"function","title":"DaisyTheme.darken/2","doc":"","ref":"DaisyTheme.html#darken/2"},{"type":"function","title":"DaisyTheme.darker/5","doc":"","ref":"DaisyTheme.html#darker/5"},{"type":"function","title":"DaisyTheme.default_theme/0","doc":"","ref":"DaisyTheme.html#default_theme/0"},{"type":"function","title":"DaisyTheme.generate/1","doc":"","ref":"DaisyTheme.html#generate/1"},{"type":"function","title":"DaisyTheme.is_dark?/1","doc":"","ref":"DaisyTheme.html#is_dark?/1"},{"type":"function","title":"DaisyTheme.keys/0","doc":"","ref":"DaisyTheme.html#keys/0"},{"type":"function","title":"DaisyTheme.lighten/2","doc":"","ref":"DaisyTheme.html#lighten/2"},{"type":"function","title":"DaisyTheme.style_attr/1","doc":"","ref":"DaisyTheme.html#style_attr/1"},{"type":"function","title":"DaisyTheme.theme/1","doc":"","ref":"DaisyTheme.html#theme/1"},{"type":"module","title":"DummyAdapter","doc":"","ref":"DummyAdapter.html"},{"type":"module","title":"Entrepot","doc":"Minimal, composable file upload, storage, and streamed data migrations for Elixir apps, flexibly and with minimal dependencies.\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot.svg)](https://hex.pm/packages/entrepot)\n[![CI status](https://github.com/bonfire-networks/entrepot/workflows/CI/badge.svg)](https://github.com/bonfire-networks/entrepot/actions)\n\n:warning: Although it's been used in production for over a year without issue, Entrepôt is experimental and still in active development. Accepting file uploads introduces specific security vulnerabilities. Use at your own risk.","ref":"Entrepot.html"},{"type":"module","title":"Concepts - Entrepot","doc":"Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: [storage](#storage), [upload](#upload), [locator](#locator), and optionally, [uploader](#uploader), which provides a more ergonomic API for the other 3.\n\nIt is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.\n\nSo what does it do? Here's a theoretical example of a use case with an Ecto 1 schema, which stores the file retrieved from a URL, along with some additional metadata:\n\n```\n def create_attachment(upload, user) do\n Multi.new()\n |> Multi.run(:upload, fn _, _ ->\n YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())\n end)\n |> Multi.insert(:attachment, fn %{upload: file_id} ->\n %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: \"document\"})\n end)\n |> Repo.transaction()\n end\n```\n\nThen to access the file:\n\n```\n%Attachment{file_data: file} = attachment\n\n{:ok, contents} = Disk.read(file.id)\n```\n\n 1 *See [integrations](#integrations) for streamlined use with Ecto.*","ref":"Entrepot.html#module-concepts"},{"type":"module","title":"Storage - Entrepot","doc":"A \"storage\" is a [behaviour](https://elixirschool.com/en/lessons/advanced/behaviours/) that implements the following \"file-like\" callbacks:\n\n* read\n* put\n* delete\n\nImplementing your own storage is as easy as creating a module that quacks this way. Each callback should accept an optional list of options as the last arg. Which options are supported is up to the module that implements the callbacks.","ref":"Entrepot.html#module-storage"},{"type":"module","title":"Upload - Entrepot","doc":"Upload is a [protocol](https://elixir-lang.org/getting-started/protocols.html) consisting of the following two functions:\n\n* contents\n* name\n\nA storage uses this interface to figure how to extract the file data from a given struct and how to identify it. See `Entrepot.Locator` for an example of how this protocol can be implemented.","ref":"Entrepot.html#module-upload"},{"type":"module","title":"Locator - Entrepot","doc":"Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.\n\nLocator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for \"promoting\" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage 2 :\n\n```\nold_file_data = %Locator{id: \"/path/to/file.jpg\", storage: Disk, metadata: %{}}\n{:ok, new_id} = S3.put(old_file_data)`\n```\n\nNote: always remember to take care of cleaning up the old file as Entrepot *never* automatically removes files:\n\n`Disk.delete(old_file_data.id)`","ref":"Entrepot.html#module-locator"},{"type":"module","title":"Uploader - Entrepot","doc":"This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can `use` the uploader to codify the handling for specific types of assets.\n\n```\ndefmodule AvatarUploader do\n use Entrepot.Uploader, storages: [cache: Disk, store: S3]\n\n def build_options(upload, :cache, opts) do\n Keyword.put(opts, :prefix, \"cache/#{Date.utc_today()}\")\n end\n\n def build_options(upload, :store, opts) do\n opts\n |> Keyword.put(:prefix, \"users/#{opts[:user_id]}/avatar\")\n |> Keyword.drop([:user_id])\n end\n\n def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()]\nend\n```\n\nThen you can get the files where they need to be without constructing all the options everywhere they might be uploaded: `AvatarUploader.store(upload, :store, user_id: 1)`\n\nNote: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.","ref":"Entrepot.html#module-uploader"},{"type":"module","title":"Built-in Integrations - Entrepot","doc":"Entrepôt's module design is intended to make it easy to implement your own custom utilities for handling files in the way you need. However, anticipating the most common use cases, that is facilitated with the following optional modules and add-on library.\n\nThere are several implementations some common file storages (including S3/Digital Ocean) and uploads (including `Plug.Upload`).","ref":"Entrepot.html#module-built-in-integrations"},{"type":"module","title":"Storages - Entrepot","doc":"Entrepôt ships with the following storage implementations:\n\n- [Disk](#Disk)\n- [S3](#S3)\n- [RAM](#RAM)","ref":"Entrepot.html#module-storages"},{"type":"module","title":"Disk - Entrepot","doc":"This saves uploaded files to a local disk. It is useful for caching uploads while you validate other data, and/or perform some file processing.\n\n#### configuration\n\n- To set the root directory where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.Disk, root_dir: \"tmp\")`\n\n#### options\n\n- `prefix`: This should be a valid system path that will be appended to the root. If it does not exist, Disk will create it.\n- `force`: If this option is set to a truthy value, Disk will overwrite any existing file at the derived path. Use with caution!\n\n#### notes\n\nSince it is possible for files with the same name to be uploaded multiple times, Disk needs some additional info to uniquely identify the file. Disk _does not_ overwrite files with the same name by default. To ensure an upload can be stored, the combination of the `Upload.name` and `prefix` should be unique.","ref":"Entrepot.html#module-disk"},{"type":"module","title":"S3 - Entrepot","doc":"This storage uploads files to [AWS's S3](https://aws.amazon.com/s3/) service. It also works with [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/).\n\n#### configuration\n\n- To set the bucket where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: \"whatever\")`\n\n#### options\n\n- prefix: A string to prepend to the upload's key\n- s3_options: Keyword list of option that will passed directly to ex_aws_s3\n\n#### dependencies\n\nSome of the implementations might require further dependencies (currently only [S3](#s3)-compatible storage) that you will also need to add to your project's deps\n```\n{:ex_aws, \"~> 2.0\"}\n{:ex_aws_s3, \"~> 2.0\"}\n```","ref":"Entrepot.html#module-s3"},{"type":"module","title":"RAM - Entrepot","doc":"Uses Elixir's [StringIO](https://hexdocs.pm/elixir/StringIO.html) module to store file contents in memory. Since the \"files\" are essentially just strings, they will not be persisted and will error if they are read back from a database, for example. However, operations are correspondingly very fast and thus suitable for tests or other temporary file operations.","ref":"Entrepot.html#module-ram"},{"type":"module","title":"uploads - Entrepot","doc":"There are implementation of the `Entrepot.Upload` protocol for the following modules:\n\n- [URI](#URI)\n- [Plug.Upload](#plugupload)","ref":"Entrepot.html#module-uploads"},{"type":"module","title":"URI - Entrepot","doc":"This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a [TUS server](https://tus.io/).\n\nYou can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:\n\n```\ndef attach(conn, %{\"attachment\" => %{\"url\" => url}}) when url != \"\" do\n URI.parse(url)\n |> Disk.put(upload)\n\n # ...redirect, etc\nend\n```\n\n#### notes\n\nThis implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.","ref":"Entrepot.html#module-uri"},{"type":"module","title":"Plug.Upload - Entrepot","doc":"This supports multi-part form submissions handled by [Plug](https://hexdocs.pm/plug/Plug.Upload.html#content).\n\n## [EntrepôtEcto](https://github.com/bonfire-networks/entrepot_ecto)\n\nThere is an external library (because it needs Ecto as a dependency) which provides `Entrepot.Ecto.Type` for Ecto schema fields to easily handle persisting Locator data in your repository.\n\n---\n\nThat's it! Happy uploading.","ref":"Entrepot.html#module-plug-upload"},{"type":"function","title":"Entrepot.add_metadata/2","doc":"","ref":"Entrepot.html#add_metadata/2"},{"type":"function","title":"Entrepot.add_metadata/3","doc":"Adds metadata to a Locator.","ref":"Entrepot.html#add_metadata/3"},{"type":"function","title":"Parameters - Entrepot.add_metadata/3","doc":"- `locator`: A `Locator` struct to which metadata will be added.\n- `key`: A key for the metadata (when adding a single key-value pair).\n- `val`: A value for the metadata (when adding a single key-value pair).\n- `data`: A map or keyword list of metadata to be added.","ref":"Entrepot.html#add_metadata/3-parameters"},{"type":"function","title":"Returns - Entrepot.add_metadata/3","doc":"- `{:ok, Locator.t()}`: An updated `Locator` struct with the new metadata.\n- `{:error, term()}`: The original error tuple if given an error tuple.","ref":"Entrepot.html#add_metadata/3-returns"},{"type":"function","title":"Examples - Entrepot.add_metadata/3","doc":"iex> Entrepot.add_metadata(%Locator{}, :key, \"value\")\n {:ok, %Locator{metadata: %{key: \"value\"}}}\n\n iex> Entrepot.add_metadata(%Locator{key: \"value\"}, %{key2: \"value2\"})\n {:ok, %Locator{metadata: %{key: \"value1\", key2: \"value2\"}}}","ref":"Entrepot.html#add_metadata/3-examples"},{"type":"function","title":"Entrepot.copy/3","doc":"Copies a file from one storage to another.","ref":"Entrepot.html#copy/3"},{"type":"function","title":"Parameters - Entrepot.copy/3","doc":"- `locator`: A `Locator` struct representing the file to be copied.\n- `dest_storage`: The destination storage module.\n- `opts`: Optional keyword list of options to be passed to the storage modules.","ref":"Entrepot.html#copy/3-parameters"},{"type":"function","title":"Returns - Entrepot.copy/3","doc":"- `{:ok, Locator.t()}`: A new `Locator` struct for the copied file.\n- `{:error, term()}`: An error tuple if the copy operation fails.","ref":"Entrepot.html#copy/3-returns"},{"type":"function","title":"Raises - Entrepot.copy/3","doc":"- Raises an error if attempting to copy a file to the same storage.","ref":"Entrepot.html#copy/3-raises"},{"type":"function","title":"Examples - Entrepot.copy/3","doc":"iex> Entrepot.copy(%Locator{id: \"file.txt\", storage: Disk}, S3)\n {:ok, %Locator{id: \"new_id\", storage: S3, metadata: %{copied_from: Disk}}}","ref":"Entrepot.html#copy/3-examples"},{"type":"function","title":"Entrepot.storage!/1","doc":"Resolves the storage module from a Locator.","ref":"Entrepot.html#storage!/1"},{"type":"function","title":"Parameters - Entrepot.storage!/1","doc":"- `locator`: A `Locator` struct containing the storage information.","ref":"Entrepot.html#storage!/1-parameters"},{"type":"function","title":"Returns - Entrepot.storage!/1","doc":"- The resolved storage module as an atom.","ref":"Entrepot.html#storage!/1-returns"},{"type":"function","title":"Raises - Entrepot.storage!/1","doc":"- `InvalidStorage`: If the storage module cannot be resolved.","ref":"Entrepot.html#storage!/1-raises"},{"type":"function","title":"Examples - Entrepot.storage!/1","doc":"iex> Entrepot.storage!(%Locator{storage: Disk})\n Disk\n\n iex> Entrepot.storage!(%Locator{storage: \"Elixir.Disk\"})\n Disk","ref":"Entrepot.html#storage!/1-examples"},{"type":"module","title":"Entrepot.Ecto","doc":"Ecto integration for [Entrepôt](https://github.com/bonfire-networks/entrepot)\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot_ecto.svg)](https://hex.pm/packages/entrepot_ecto)\n[![CI status](https://github.com/bonfire-networks/entrepot_ecto/workflows/CI/badge.svg)](https://github.com/bonfire-networks/capsulei_ecto/actions)\n\nThis package adds the following two features to support the use of Entrepôt with Ecto:\n\n1. Custom Type\n2. Changeset helper\n\n## `Entrepot.Ecto.Type`\n\nIn your Ecto schema specify your file field with the following type to get serialization of uploads (`Entrepot.Locator`) to maps:\n\n```\ndefmodule Attachment\n use Ecto.Schema\n\n schema \"attachments\" do\n field :file_data, Entrepot.Ecto.Type\n end\nend\n```\n\n## `Entrepot.Ecto.upload`\n\nCast params to uploaded data with `Entrepot.Ecto.upload`. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.\n\nIt is expected to return either a success tuple with the `Locator` struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.\n\nEven if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], fn {_field, upload}, changeset ->\n case Entrepot.Storages.Disk.put(upload) do\n {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)\n error_tuple -> add_error(changeset, \"upload just...failed\")\n end\n end)\n |> validate_attachment\n\n ```\n\nHowever, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], MyApp.Attacher, :attach)\n ```\n---","ref":"Entrepot.Ecto.html"},{"type":"module","title":"Upload cleanup - Entrepot.Ecto","doc":"Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).\n\nOne good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:\n\n ```\n def create_attachment(user, attrs) do\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)\n |> Repo.insert()\n |> case do\n {:ok, attachment} = success_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Attachment.promote_upload(attachment) end\n )\n\n success_tuple\n\n {:error, %{changes: %{file_data: file_data}}} = error_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Disk.delete(file_data.id) end\n )\n\n error_tuple\n end\n ```\n\nIn this example, `Attachment.promote_upload(attachment)` would handle moving the file and updating the file data in the db. It uses `Multi` to ensure all operations succeed or fail together:\n\n ```\n def promote_upload(attachment) do\n Multi.new()\n |> Multi.run(:copy_file, fn _, _ ->\n NetworkStorage.put(attachment.file_data.id)\n end)\n |> Multi.update(:updated_schema, fn %{move_file: new_data} ->\n Attachment.changeset(attachment, %{file_data: new_data })\n end)\n |> Multi.run(:delete_old_file, fn _, _ ->\n Disk.delete(attachment.file_data.id)\n end)\n |> Repo.transaction()\n end\n ```","ref":"Entrepot.Ecto.html#module-upload-cleanup"},{"type":"module","title":"Testing - Entrepot.Ecto","doc":"Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:\n\n ```\n %Attachment{\n file_data: %{\n id: \"fake.jpg\",\n metadata: %{name: \"fake\"}, size: 100\n }\n }\n |> Repo.insert!()\n ```\n\nIf you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.\n\nYou can configure your test environment to use the RAM storage:\n\n ```\n {:ok, id} = Entrepot.Storages.RAM.put(some_upload)\n\n Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})\n ```\n\nOr, for maximum performance, you can a simple struct that implements the `Upload` protocol:\n\n ```\n defmodule Entrepot.MockUpload do\n defstruct content: \"Hi, I'm a file\", name: \"hi\"\n\n defimpl Entrepot.Upload do\n def contents(mock), do: {:ok, mock.content}\n\n def name(mock), do: mock.name\n end\n end\n ```","ref":"Entrepot.Ecto.html#module-testing"},{"type":"function","title":"Entrepot.Ecto.upload/4","doc":"Uploads data with `Entrepot` using a function.","ref":"Entrepot.Ecto.html#upload/4"},{"type":"function","title":"Parameters - Entrepot.Ecto.upload/4","doc":"- `changeset`: The changeset to update.\n- `params`: Parameters to upload.\n- `permitted`: List of permitted fields.\n- `function`: A function with arity 2 that handles the upload.","ref":"Entrepot.Ecto.html#upload/4-parameters"},{"type":"function","title":"Examples - Entrepot.Ecto.upload/4","doc":"iex> changeset = %Ecto.Changeset{}\n iex> fun = fn (_params, _changeset) -> %Entrepot.Locator{} end\n iex> Entrepot.Ecto.upload(changeset, %{\"field\" => \"value\"}, [\"field\"], fun)\n %Ecto.Changeset{}","ref":"Entrepot.Ecto.html#upload/4-examples"},{"type":"function","title":"Entrepot.Ecto.upload/5","doc":"Uploads data with `Entrepot` using a module and function name.","ref":"Entrepot.Ecto.html#upload/5"},{"type":"function","title":"Parameters - Entrepot.Ecto.upload/5","doc":"- `changeset`: The changeset to update.\n- `params`: Parameters to upload.\n- `permitted`: List of permitted fields.\n- `module`: The module containing the function.\n- `function`: The function name within the module.","ref":"Entrepot.Ecto.html#upload/5-parameters"},{"type":"function","title":"Examples - Entrepot.Ecto.upload/5","doc":"iex> changeset = %Ecto.Changeset{}\n iex> Entrepot.Ecto.upload(changeset, %{\"field\" => \"value\"}, [\"field\"], SomeModule, :some_function)\n %Ecto.Changeset{}","ref":"Entrepot.Ecto.html#upload/5-examples"},{"type":"module","title":"Entrepot.Ecto.Type","doc":"","ref":"Entrepot.Ecto.Type.html"},{"type":"function","title":"Entrepot.Ecto.Type.cast/1","doc":"","ref":"Entrepot.Ecto.Type.html#cast/1"},{"type":"function","title":"Entrepot.Ecto.Type.dump/1","doc":"","ref":"Entrepot.Ecto.Type.html#dump/1"},{"type":"function","title":"Entrepot.Ecto.Type.embed_as/1","doc":"","ref":"Entrepot.Ecto.Type.html#embed_as/1"},{"type":"function","title":"Entrepot.Ecto.Type.equal?/2","doc":"","ref":"Entrepot.Ecto.Type.html#equal?/2"},{"type":"function","title":"Entrepot.Ecto.Type.load/1","doc":"","ref":"Entrepot.Ecto.Type.html#load/1"},{"type":"function","title":"Entrepot.Ecto.Type.type/0","doc":"","ref":"Entrepot.Ecto.Type.html#type/0"},{"type":"exception","title":"Entrepot.Errors.InvalidLocator","doc":"","ref":"Entrepot.Errors.InvalidLocator.html"},{"type":"exception","title":"Entrepot.Errors.InvalidStorage","doc":"","ref":"Entrepot.Errors.InvalidStorage.html"},{"type":"module","title":"Entrepot.Locator","doc":"A struct representing a stored file's location and metadata.\n\nThe `Locator` struct contains information about where a file is stored,\nincluding its unique identifier, the storage backend used, and any\nadditional metadata.","ref":"Entrepot.Locator.html"},{"type":"function","title":"Entrepot.Locator.new/1","doc":"Creates a new Locator struct.","ref":"Entrepot.Locator.html#new/1"},{"type":"function","title":"Parameters - Entrepot.Locator.new/1","doc":"- `attrs`: A map or keyword list of attributes for the Locator.","ref":"Entrepot.Locator.html#new/1-parameters"},{"type":"function","title":"Returns - Entrepot.Locator.new/1","doc":"- `{:ok, Locator.t()}`: A new `Locator` struct.\n- `{:error, String.t()}`: An error message if the input is invalid.","ref":"Entrepot.Locator.html#new/1-returns"},{"type":"function","title":"Examples - Entrepot.Locator.new/1","doc":"iex> Entrepot.Locator.new(id: \"file.txt\", storage: Disk)\n {:ok, %Entrepot.Locator{id: \"file.txt\", storage: Disk, metadata: %{}}}\n\n iex> Entrepot.Locator.new(id: 123, storage: Disk)\n {:error, \"id must be binary\"}","ref":"Entrepot.Locator.html#new/1-examples"},{"type":"function","title":"Entrepot.Locator.new!/1","doc":"Creates a new Locator struct, raising an error if the input is invalid.","ref":"Entrepot.Locator.html#new!/1"},{"type":"function","title":"Parameters - Entrepot.Locator.new!/1","doc":"- `attrs`: A map or keyword list of attributes for the Locator.","ref":"Entrepot.Locator.html#new!/1-parameters"},{"type":"function","title":"Returns - Entrepot.Locator.new!/1","doc":"- A new `Locator` struct.","ref":"Entrepot.Locator.html#new!/1-returns"},{"type":"function","title":"Raises - Entrepot.Locator.new!/1","doc":"- `Entrepot.Errors.InvalidLocator`: If the input is invalid.","ref":"Entrepot.Locator.html#new!/1-raises"},{"type":"function","title":"Examples - Entrepot.Locator.new!/1","doc":"iex> Entrepot.Locator.new!(id: \"file.txt\", storage: Disk)\n %Entrepot.Locator{id: \"file.txt\", storage: Disk, metadata: %{}}\n\n iex> Entrepot.Locator.new!(id: 123, storage: Disk)\n ** (Entrepot.Errors.InvalidLocator) id must be binary","ref":"Entrepot.Locator.html#new!/1-examples"},{"type":"type","title":"Entrepot.Locator.t/0","doc":"","ref":"Entrepot.Locator.html#t:t/0"},{"type":"behaviour","title":"Entrepot.Storage","doc":"A behaviour module defining the interface for storage backends.\n\nThis module specifies the callbacks that must be implemented by any storage backend\nused with Entrepôt.","ref":"Entrepot.Storage.html"},{"type":"callback","title":"Entrepot.Storage.delete/1","doc":"","ref":"Entrepot.Storage.html#c:delete/1"},{"type":"callback","title":"Entrepot.Storage.delete/2","doc":"Deletes a file from the storage backend.","ref":"Entrepot.Storage.html#c:delete/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.delete/2","doc":"- `locator_id`: The unique identifier of the file to be deleted.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:delete/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.delete/2","doc":"- `:ok`: If the file was successfully deleted.\n- `{:error, String.t()}`: An error message if the file cannot be deleted.","ref":"Entrepot.Storage.html#c:delete/2-returns"},{"type":"callback","title":"Entrepot.Storage.path/1","doc":"","ref":"Entrepot.Storage.html#c:path/1"},{"type":"callback","title":"Entrepot.Storage.path/2","doc":"Retrieves the local filesystem path of the stored file, if applicable.","ref":"Entrepot.Storage.html#c:path/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.path/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:path/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.path/2","doc":"- `binary()`: The local filesystem path of the file.\n- `nil`: If a local path is not applicable or available.","ref":"Entrepot.Storage.html#c:path/2-returns"},{"type":"callback","title":"Entrepot.Storage.put/1","doc":"","ref":"Entrepot.Storage.html#c:put/1"},{"type":"callback","title":"Entrepot.Storage.put/2","doc":"Stores a file in the storage backend.","ref":"Entrepot.Storage.html#c:put/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.put/2","doc":"- `upload`: An `Upload` struct representing the file to be stored.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:put/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.put/2","doc":"- `{:ok, locator_id}`: The unique identifier of the stored file.\n- `{:error, String.t()}`: An error message if the file cannot be stored.","ref":"Entrepot.Storage.html#c:put/2-returns"},{"type":"callback","title":"Entrepot.Storage.read/1","doc":"","ref":"Entrepot.Storage.html#c:read/1"},{"type":"callback","title":"Entrepot.Storage.read/2","doc":"Reads the contents of the stored file.","ref":"Entrepot.Storage.html#c:read/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.read/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:read/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.read/2","doc":"- `{:ok, binary()}`: The contents of the file.\n- `{:error, String.t()}`: An error message if the file cannot be read.","ref":"Entrepot.Storage.html#c:read/2-returns"},{"type":"callback","title":"Entrepot.Storage.stream/1","doc":"","ref":"Entrepot.Storage.html#c:stream/1"},{"type":"callback","title":"Entrepot.Storage.stream/2","doc":"Creates a stream for reading the contents of the stored file.","ref":"Entrepot.Storage.html#c:stream/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.stream/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:stream/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.stream/2","doc":"- `IO.Stream.t()` | `File.Stream.t()` | `Stream.t()`: A stream for reading the file contents.","ref":"Entrepot.Storage.html#c:stream/2-returns"},{"type":"callback","title":"Entrepot.Storage.url/1","doc":"","ref":"Entrepot.Storage.html#c:url/1"},{"type":"callback","title":"Entrepot.Storage.url/2","doc":"Generates a URL for accessing the stored file.","ref":"Entrepot.Storage.html#c:url/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.url/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:url/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.url/2","doc":"- `binary()`: The URL for accessing the file.\n- `nil`: If a URL cannot be generated.","ref":"Entrepot.Storage.html#c:url/2-returns"},{"type":"type","title":"Entrepot.Storage.locator_id/0","doc":"","ref":"Entrepot.Storage.html#t:locator_id/0"},{"type":"type","title":"Entrepot.Storage.option/0","doc":"","ref":"Entrepot.Storage.html#t:option/0"},{"type":"module","title":"Entrepot.Storages.Disk","doc":"","ref":"Entrepot.Storages.Disk.html"},{"type":"function","title":"Entrepot.Storages.Disk.clone/3","doc":"","ref":"Entrepot.Storages.Disk.html#clone/3"},{"type":"module","title":"Entrepot.Storages.RAM","doc":"","ref":"Entrepot.Storages.RAM.html"},{"type":"function","title":"Entrepot.Storages.RAM.clone/3","doc":"","ref":"Entrepot.Storages.RAM.html#clone/3"},{"type":"module","title":"Entrepot.Storages.S3","doc":"","ref":"Entrepot.Storages.S3.html"},{"type":"function","title":"Entrepot.Storages.S3.clone/3","doc":"","ref":"Entrepot.Storages.S3.html#clone/3"},{"type":"protocol","title":"Entrepot.Upload","doc":"A protocol defining the interface for file uploads.\n\nThis protocol should be implemented by any struct that represents an uploadable file.\n\nThere are built-in implementations for `Plug.Upload`, `File.Stream, `Stream`, `URI` and `Entrepot.Locator`.","ref":"Entrepot.Upload.html"},{"type":"function","title":"Entrepot.Upload.contents/1","doc":"Retrieves the contents of the upload.","ref":"Entrepot.Upload.html#contents/1"},{"type":"function","title":"Returns - Entrepot.Upload.contents/1","doc":"- `{:ok, iodata()}`: The contents of the upload.\n- `{:error, String.t()}`: An error message if the contents cannot be retrieved.","ref":"Entrepot.Upload.html#contents/1-returns"},{"type":"function","title":"Entrepot.Upload.name/1","doc":"Retrieves the name of the upload.","ref":"Entrepot.Upload.html#name/1"},{"type":"function","title":"Returns - Entrepot.Upload.name/1","doc":"- `String.t()`: The name of the upload.","ref":"Entrepot.Upload.html#name/1-returns"},{"type":"function","title":"Entrepot.Upload.path/1","doc":"Retrieves the path of the upload, if available.","ref":"Entrepot.Upload.html#path/1"},{"type":"function","title":"Returns - Entrepot.Upload.path/1","doc":"- `String.t()`: The path of the upload.\n- `nil`: If no path is available.","ref":"Entrepot.Upload.html#path/1-returns"},{"type":"type","title":"Entrepot.Upload.t/0","doc":"All the types that implement this protocol.","ref":"Entrepot.Upload.html#t:t/0"},{"type":"behaviour","title":"Entrepot.Uploader","doc":"A behaviour module for implementing custom uploaders.\n\nThis module provides a set of callbacks and a macro for easily defining uploaders\nthat work with different storage backends.","ref":"Entrepot.Uploader.html"},{"type":"callback","title":"Entrepot.Uploader.build_metadata/3","doc":"Builds metadata for the stored file.","ref":"Entrepot.Uploader.html#c:build_metadata/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.build_metadata/3","doc":"- `locator`: The `Locator` struct representing the stored file.\n- `storage`: The storage backend used.\n- `opts`: The options used in the storage operation.","ref":"Entrepot.Uploader.html#c:build_metadata/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.build_metadata/3","doc":"- A keyword list or map of metadata to be added to the `Locator`.","ref":"Entrepot.Uploader.html#c:build_metadata/3-returns"},{"type":"callback","title":"Entrepot.Uploader.build_options/3","doc":"Builds options for the storage operation.","ref":"Entrepot.Uploader.html#c:build_options/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.build_options/3","doc":"- `upload`: The upload to be stored.\n- `storage`: The storage backend to use.\n- `opts`: Initial list of options.","ref":"Entrepot.Uploader.html#c:build_options/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.build_options/3","doc":"- A list of options to be used in the storage operation.","ref":"Entrepot.Uploader.html#c:build_options/3-returns"},{"type":"callback","title":"Entrepot.Uploader.store/3","doc":"Stores an upload in the specified storage.","ref":"Entrepot.Uploader.html#c:store/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.store/3","doc":"- `upload`: The upload to be stored.\n- `storage`: The storage backend to use.\n- `opts`: Optional list of options for the storage operation.","ref":"Entrepot.Uploader.html#c:store/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.store/3","doc":"- `{:ok, Locator.t()}`: A `Locator` struct representing the stored file.\n- `{:error, any()}`: An error tuple if the storage operation fails.","ref":"Entrepot.Uploader.html#c:store/3-returns"},{"type":"type","title":"Entrepot.Uploader.option/0","doc":"","ref":"Entrepot.Uploader.html#t:option/0"},{"type":"type","title":"Entrepot.Uploader.storage/0","doc":"","ref":"Entrepot.Uploader.html#t:storage/0"},{"type":"module","title":"Import2Alias","doc":"","ref":"Import2Alias.html"},{"type":"function","title":"Import2Alias.import2alias/2","doc":"","ref":"Import2Alias.html#import2alias/2"},{"type":"module","title":"Import2Alias.CallerTracer","doc":"","ref":"Import2Alias.CallerTracer.html"},{"type":"function","title":"Import2Alias.CallerTracer.trace/2","doc":"","ref":"Import2Alias.CallerTracer.html#trace/2"},{"type":"module","title":"Import2Alias.Server","doc":"","ref":"Import2Alias.Server.html"},{"type":"function","title":"Import2Alias.Server.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Import2Alias.Server.html#child_spec/1"},{"type":"function","title":"Import2Alias.Server.entries/0","doc":"","ref":"Import2Alias.Server.html#entries/0"},{"type":"function","title":"Import2Alias.Server.record/6","doc":"","ref":"Import2Alias.Server.html#record/6"},{"type":"function","title":"Import2Alias.Server.start_link/1","doc":"","ref":"Import2Alias.Server.html#start_link/1"},{"type":"task","title":"mix bonfire.account.new","doc":"Creates an account in the database, automatically activated","ref":"Mix.Tasks.Bonfire.Account.New.html"},{"type":"task","title":"Usage - mix bonfire.account.new","doc":"```\njust mix bonfire.account.new [email@address]\n```\n\nYou will be prompted for a password and an email if it was not provided.","ref":"Mix.Tasks.Bonfire.Account.New.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.get/4","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#get/4"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.password/1","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#password/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.password/3","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#password/3"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#run/1"},{"type":"task","title":"mix bonfire.extension.compile","doc":"(re)compiles dependencies.\n\nTODO: check if we still need this now that we treat extensions as umbrella apps in dev...\n\nThis is a modified version of Elixir's `Mix.Tasks.Deps.Compile` which was needed to compile dependencies and extract localisable strings in `Mix.Tasks.Bonfire.Localise.Extract`\n\nBy default, compile all dependencies. A list of dependencies\ncan be given compile multiple dependencies in order.\n\nThis task attempts to detect if the project contains one of\nthe following files and act accordingly:\n\n * `mix.exs` - invokes `mix compile`\n * otherwise skip\n\nIf a list of dependencies is given, Mix will attempt to compile\nthem as is. For example, if project `a` depends on `b`, calling\n`mix deps.compile a` will compile `a` even if `b` is out of\ndate. This is to allow parts of the dependency tree to be\nrecompiled without propagating those changes upstream. To ensure\n`b` is included in the compilation step, pass `--include-children`.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.force_compile/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#force_compile/2"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.loaded_by_name/3","doc":"Receives a list of dependency names and returns loaded `Mix.Dep`s.\nLogs a message if the dependency could not be found.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#loaded_by_name/3"},{"type":"function","title":"Exceptions - Mix.Tasks.Bonfire.Extension.Compile.loaded_by_name/3","doc":"This function raises an exception if any of the dependencies\nprovided in the project are in the wrong format.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#loaded_by_name/3-exceptions"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#run/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.touch_manifests/0","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#touch_manifests/0"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.try_compile/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#try_compile/2"},{"type":"task","title":"mix bonfire.extension.copy_migrations","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.copy/3","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#copy/3"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.maybe_copy/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#maybe_copy/2"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.run/1","doc":"Usage:\n`just mix bonfire.extension.copy_migrations my_extension`\nor\n`just mix bonfire.extension.copy_migrations` \n\nNOTE: if you don't specify what extension(s) to include, it will automatically include all extensions which:\n- start with `bonfire_`\n- and are included in the top-level app (not dependencies of dependencies)\n\nOptional args:\n\n--force (to not ask for confirmation before copying, or to overwrite existing migration files)\n--from priv/repo/migrations (to change the source repo paths, relative to each extension path)\n--to priv/repo/migrations (to change the target repo path (defaults to current flavour's migrations) relative to working directory)\n--repo MyRepo (to specify what repo to migrate after)","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#run/1"},{"type":"task","title":"mix bonfire.extension.new","doc":"","ref":"Mix.Tasks.Bonfire.Extension.New.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Extension.New.html#run/1"},{"type":"task","title":"mix bonfire.full_docs","doc":"Generates docs for your app and *all* of its deps","ref":"Mix.Tasks.Bonfire.FullDocs.html"},{"type":"task","title":"Command line options - mix bonfire.full_docs","doc":"* `--only` - the environment to include dependencies for\n * `--target` - the target to include dependencies for\n * `--exclude` - exclude dependencies which you do not want to see in docs.\n * any arguments supported by `mix docs` will be passed along","ref":"Mix.Tasks.Bonfire.FullDocs.html#module-command-line-options"},{"type":"task","title":"mix bonfire.load_testing","doc":"","ref":"Mix.Tasks.Bonfire.LoadTesting.html"},{"type":"function","title":"Mix.Tasks.Bonfire.LoadTesting.run/1","doc":"","ref":"Mix.Tasks.Bonfire.LoadTesting.html#run/1"},{"type":"task","title":"mix bonfire.localise.extract","doc":"Extracts translations by recompiling the Elixir source code.\n\n mix gettext.extract [OPTIONS]\n\nTranslations are extracted into POT (Portable Object Template) files (with a\n`.pot` extension). The location of these files is determined by the `:otp_app`\nand `:priv` options given by Gettext modules when they call `use Gettext`. One\nPOT file is generated for each translation domain.\n\nIt is possible to give the `--merge` option to perform merging\nfor every Gettext backend updated during merge:\n\n mix gettext.extract --merge\n\nAll other options passed to `gettext.extract` are forwarded to the\n`gettext.merge` task (`Mix.Tasks.Gettext.Merge`), which is called internally\nby this task. For example:\n\n mix gettext.extract --merge --no-fuzzy","ref":"Mix.Tasks.Bonfire.Localise.Extract.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Localise.Extract.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Localise.Extract.html#run/1"},{"type":"task","title":"mix bonfire.release","doc":"","ref":"Mix.Tasks.Bonfire.Release.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Release.main/1","doc":"","ref":"Mix.Tasks.Bonfire.Release.html#main/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Release.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Release.html#run/1"},{"type":"task","title":"mix bonfire.secrets","doc":"Generates secrets and prints to the terminal.\n mix bonfire.secrets [length]\nBy default, it generates keys 64 characters long.\nThe minimum value for `length` is 32.","ref":"Mix.Tasks.Bonfire.Secrets.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Secrets.main/1","doc":"","ref":"Mix.Tasks.Bonfire.Secrets.html#main/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Secrets.print/1","doc":"","ref":"Mix.Tasks.Bonfire.Secrets.html#print/1"},{"type":"task","title":"mix bonfire.user.admin.promote","doc":"Promotes a user to an administrator","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html"},{"type":"task","title":"Usage - mix bonfire.user.admin.promote","doc":"```\nmix bonfire.user.admin.promote username\n```","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.User.Admin.Promote.run/1","doc":"","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html#run/1"},{"type":"task","title":"mix bonfire.user.new","doc":"Creates an user in the database (and an account, automatically activated)","ref":"Mix.Tasks.Bonfire.User.New.html"},{"type":"task","title":"Usage - mix bonfire.user.new","doc":"```\njust mix bonfire.user.new [username] [email@address]\n```\n\nYou will be prompted for a password, and username/email if not provided.","ref":"Mix.Tasks.Bonfire.User.New.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.User.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.User.New.html#run/1"},{"type":"task","title":"mix bonfire.widget.new","doc":"`just mix bonfire.widget.new Bonfire.MyUIExtension.MyWidget`\n\nwill present you with a diff and create new files","ref":"Mix.Tasks.Bonfire.Widget.New.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Widget.New.ext_path_for_module/4","doc":"","ref":"Mix.Tasks.Bonfire.Widget.New.html#ext_path_for_module/4"},{"type":"function","title":"Mix.Tasks.Bonfire.Widget.New.igniter/2","doc":"","ref":"Mix.Tasks.Bonfire.Widget.New.html#igniter/2"},{"type":"task","title":"mix import2alias","doc":"","ref":"Mix.Tasks.Import2alias.html"},{"type":"task","title":"mix papertrail.install","doc":"","ref":"Mix.Tasks.Papertrail.Install.html"},{"type":"function","title":"Mix.Tasks.Papertrail.Install.run/1","doc":"","ref":"Mix.Tasks.Papertrail.Install.html#run/1"},{"type":"module","title":"Nebulex.DiskAdapter","doc":"WIP: Nebulex disk adapter based on https://hexdocs.pm/nebulex/creating-new-adapter.html and https://hexdocs.pm/cachex/Cachex.Disk.html","ref":"Nebulex.DiskAdapter.html"},{"type":"module","title":"Nebulex.DiskAdapter.DiskCacheHelper","doc":"WIP: Nebulex disk adapter based on https://hexdocs.pm/nebulex/creating-new-adapter.html and https://hexdocs.pm/cachex/Cachex.Disk.html","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.cache_path/3","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#cache_path/3"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#child_spec/1"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_clear/2","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_clear/2"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_delete/3","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_delete/3"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_get/4","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_get/4"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_list/2","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_list/2"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_put/4","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_put/4"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.start_link/1","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#start_link/1"},{"type":"behaviour","title":"Paginator","doc":"Defines a paginator.\n\nThis module adds a `paginate/3` function to your `Ecto.Repo` so that you can\npaginate through results using opaque cursors.","ref":"Paginator.html"},{"type":"behaviour","title":"Usage - Paginator","doc":"defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n use Paginator\n end","ref":"Paginator.html#module-usage"},{"type":"behaviour","title":"Options - Paginator","doc":"`Paginator` can take any options accepted by `paginate/3`. This is useful when\nyou want to enforce some options globally across your project.","ref":"Paginator.html#module-options"},{"type":"behaviour","title":"Example - Paginator","doc":"defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n use Paginator,\n limit: 10, # sets the default limit to 10\n maximum_limit: 100, # sets the maximum limit to 100\n include_total_count: true, # include total count by default\n total_count_primary_key_field: :uuid # sets the total_count_primary_key_field to uuid for calculate total_count\n end\n\nNote that these values can be still be overriden when `paginate/3` is called.","ref":"Paginator.html#module-example"},{"type":"behaviour","title":"Use without macros - Paginator","doc":"If you wish to avoid use of macros or you wish to use a different name for\nthe pagination function you can define your own function like so:\n\n defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n\n def my_paginate_function(queryable, opts \\ [], repo_opts \\ []) do\n defaults = [limit: 10] # Default options of your choice here\n opts = Keyword.merge(defaults, opts)\n Paginator.paginate(queryable, opts, __MODULE__, repo_opts)\n end\n end","ref":"Paginator.html#module-use-without-macros"},{"type":"function","title":"Paginator.cursor_for_record/3","doc":"Generate a cursor for the supplied record, in the same manner as the\n`before` and `after` cursors generated by `paginate/3`.\n\nFor the cursor to be compatible with `paginate/3`, `cursor_fields`\nmust have the same value as the `cursor_fields` option passed to it.","ref":"Paginator.html#cursor_for_record/3"},{"type":"function","title":"Example - Paginator.cursor_for_record/3","doc":"iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])\n \"g3QAAAABZAACaWRhAQ==\"\n\n iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: \"Alice\"}, [id: :asc, name: :desc])\n \"g3QAAAACZAACaWRhAWQABG5hbWVtAAAABUFsaWNl\"","ref":"Paginator.html#cursor_for_record/3-example"},{"type":"function","title":"Paginator.default_fetch_cursor_value/2","doc":"Default function used to get the value of a cursor field from the supplied\nmap. This function can be overriden in the `Paginator.Config` using the\n`fetch_cursor_value_fun` key.\n\nWhen using named bindings to sort on joined columns it will attempt to get\nthe value of joined column by using the named binding as the name of the\nrelationship on the original Ecto.Schema.","ref":"Paginator.html#default_fetch_cursor_value/2"},{"type":"function","title":"Example - Paginator.default_fetch_cursor_value/2","doc":"iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)\n 1\n\n iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: \"London\"}}, {:address, :city})\n \"London\"","ref":"Paginator.html#default_fetch_cursor_value/2-example"},{"type":"callback","title":"Paginator.paginate/3","doc":"Fetches all the results matching the query within the cursors.","ref":"Paginator.html#c:paginate/3"},{"type":"callback","title":"Options - Paginator.paginate/3","doc":"* `:after` - Fetch the records after this cursor.\n * `:before` - Fetch the records before this cursor.\n * `:cursor_fields` - The fields with sorting direction used to determine the\n cursor. In most cases, this should be the same fields as the ones used for sorting in the query.\n When you use named bindings in your query they can also be provided.\n * `:fetch_cursor_value_fun` function of arity 2 to lookup cursor values on returned records.\n Defaults to `Paginator.default_fetch_cursor_value/2`\n * `:include_total_count` - Set this to true to return the total number of\n records matching the query. Note that this number will be capped by\n `:total_count_limit`. Defaults to `false`.\n * `:total_count_primary_key_field` - Running count queries on specified column of the table\n * `:limit` - Limits the number of records returned per page. Note that this\n number will be capped by `:maximum_limit`. Defaults to `50`.\n * `:maximum_limit` - Sets a maximum cap for `:limit`. This option can be useful when `:limit`\n is set dynamically (e.g from a URL param set by a user) but you still want to\n enforce a maximum. Defaults to `500`.\n * `:total_count_limit` - Running count queries on tables with a large number\n of records is expensive so it is capped by default. Can be set to `:infinity`\n in order to count all the records. Defaults to `10,000`.","ref":"Paginator.html#c:paginate/3-options"},{"type":"callback","title":"Repo options - Paginator.paginate/3","doc":"This will be passed directly to `Ecto.Repo.all/2`, as such any option supported\nby this function can be used here.","ref":"Paginator.html#c:paginate/3-repo-options"},{"type":"callback","title":"Simple example - Paginator.paginate/3","doc":"query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)\n\n Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)","ref":"Paginator.html#c:paginate/3-simple-example"},{"type":"callback","title":"Example with using custom sort directions per field - Paginator.paginate/3","doc":"query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)\n\n Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)","ref":"Paginator.html#c:paginate/3-example-with-using-custom-sort-directions-per-field"},{"type":"callback","title":"Example with sorting on columns in joined tables - Paginator.paginate/3","doc":"from(\n p in Post,\n as: :posts,\n join: a in assoc(p, :author),\n as: :author,\n preload: [author: a],\n select: p,\n order_by: [\n {:asc, a.name},\n {:asc, p.id}\n ]\n )\n\n Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)\n\nWhen sorting on columns in joined tables it is necessary to use named bindings. In\nthis case we name it `author`. In the `cursor_fields` we refer to this named binding\nand its column name.\n\nTo build the cursor Paginator uses the returned Ecto.Schema. When using a joined\ncolumn the returned Ecto.Schema won't have the value of the joined column\nunless we preload it. E.g. in this case the cursor will be build up from\n`post.id` and `post.author.name`. This presupposes that the named of the\nbinding is the same as the name of the relationship on the original struct.\n\nOne level deep joins are supported out of the box but if we join on a second\nlevel, e.g. `post.author.company.name` a custom function can be supplied to\nhandle the cursor value retrieval. This also applies when the named binding\ndoes not map to the name of the relationship.","ref":"Paginator.html#c:paginate/3-example-with-sorting-on-columns-in-joined-tables"},{"type":"callback","title":"Example - Paginator.paginate/3","doc":"from(\n p in Post,\n as: :posts,\n join: a in assoc(p, :author),\n as: :author,\n join: c in assoc(a, :company),\n as: :company,\n preload: [author: a],\n select: p,\n order_by: [\n {:asc, a.name},\n {:asc, p.id}\n ]\n )\n\n Repo.paginate(query,\n cursor_fields: [{{:company, :name}, :asc}, id: :asc],\n fetch_cursor_value_fun: fn\n post, {{:company, name}, _} ->\n post.author.company.name\n\n post, field ->\n Paginator.default_fetch_cursor_value(post, field)\n end,\n limit: 50\n )","ref":"Paginator.html#c:paginate/3-example"},{"type":"function","title":"Paginator.paginated_query/2","doc":"","ref":"Paginator.html#paginated_query/2"},{"type":"module","title":"Paginator.Page","doc":"Defines a page.","ref":"Paginator.Page.html"},{"type":"module","title":"Fields - Paginator.Page","doc":"* `edges` - a list of entries contained in this page.\n* `page_info` - meta-data attached to this page.","ref":"Paginator.Page.html#module-fields"},{"type":"type","title":"Paginator.Page.t/0","doc":"","ref":"Paginator.Page.html#t:t/0"},{"type":"module","title":"Paginator.PageInfo","doc":"Defines page page_info.","ref":"Paginator.PageInfo.html"},{"type":"module","title":"Fields - Paginator.PageInfo","doc":"* `start_cursor` - an opaque cursor representing the first row of the current page, to be used with the `before` query parameter.\n* `end_cursor` - an opaque cursor representing the last row of the current page, to be used with the `after` query parameter.\n* `limit` - the maximum number of edges that can be contained in this page.\n* `page_count` - the number of edges on the current page.\n* `total_count` - the total number of edges matching the query.\n* `total_count_cap_exceeded` - a boolean indicating whether the `:total_count_limit` was exceeded.","ref":"Paginator.PageInfo.html#module-fields"},{"type":"type","title":"Paginator.PageInfo.opaque_cursor/0","doc":"","ref":"Paginator.PageInfo.html#t:opaque_cursor/0"},{"type":"type","title":"Paginator.PageInfo.t/0","doc":"","ref":"Paginator.PageInfo.html#t:t/0"},{"type":"module","title":"PaperTrail","doc":"Track and record all the changes in your database. Revert back to anytime in history.\n\n[![Hex Version](http://img.shields.io/hexpm/v/paper_trail.svg?style=flat)](https://hex.pm/packages/paper_trail) [![Hex docs](http://img.shields.io/badge/hex.pm-docs-green.svg?style=flat)](https://hexdocs.pm/paper_trail/PaperTrail.html)\n[![Total Download](https://img.shields.io/hexpm/dt/paper_trail.svg)](https://hex.pm/packages/paper_trail)\n[![License](https://img.shields.io/hexpm/l/paper_trail.svg)](https://github.com/izelnakri/paper_trail/blob/master/LICENSE)\n[![Last Updated](https://img.shields.io/github/last-commit/izelnakri/paper_trail.svg)](https://github.com/izelnakri/paper_trail/commits/master)\n\n# How does it work?\n\nPaperTrail lets you record every change in your database in a separate database table called ```versions```. Library generates a new version record with associated data every time you run ```PaperTrail.insert/2```, ```PaperTrail.update/2``` or ```PaperTrail.delete/2``` functions. Simply these functions wrap your Repo insert, update or destroy actions in a database transaction, so if your database action fails you won't get a new version.\n\nPaperTrail is assailed with hundreds of test assertions for each release. Data integrity is an important aim of this project, please refer to the `strict_mode` if you want to ensure data correctness and integrity of your versions. For simpler use cases the default mode of PaperTrail should suffice.","ref":"PaperTrail.html"},{"type":"module","title":"Example - PaperTrail","doc":"```elixir\nchangeset = Post.changeset(%Post{}, %{\n title: \"Word on the street is Elixir got its own database versioning library\",\n content: \"You should try it now!\"\n})\n\nPaperTrail.insert(changeset)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# item_changes: %{title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\n# => on error(it matches Repo.insert/2):\n# {:error, Ecto.Changeset ,\n# valid?: false>, %{}}\n\npost = Repo.get!(Post, 1)\nedit_changeset = Post.changeset(post, %{\n title: \"Elixir matures fast\",\n content: \"Future is already here, Elixir is the next step!\"\n})\n\nPaperTrail.update(edit_changeset)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil\n# meta: nil}}}\n\n# => on error(it matches Repo.update/2):\n# {:error, Ecto.Changeset ,\n# valid?: false>, %{}}\n\nPaperTrail.get_version(post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\nupdated_post = Repo.get!(Post, 1)\n\nPaperTrail.delete(updated_post)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:deleted, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\nRepo.aggregate(Post, :count, :id) # => 0\nPaperTrail.Version.count() # => 3\n# same as Repo.aggregate(PaperTrail.Version, :count, :id)\n\nPaperTrail.Version.last() # returns the last version in the db by inserted_at\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{\"title\" => \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\", \"id\" => 1,\n# \"inserted_at\" => \"2016-09-15T21:42:38\",\n# \"updated_at\" => \"2016-09-15T22:00:59\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n```\n\nPaperTrail is inspired by the ruby gem ```paper_trail```. However, unlike the ```paper_trail``` gem this library actually results in less data duplication, faster and more explicit programming model to version your record changes.\n\nThe library source code is minimal and well tested. It is suggested to read the source code.","ref":"PaperTrail.html#module-example"},{"type":"module","title":"Installation - PaperTrail","doc":"1. Add paper_trail to your list of dependencies in `mix.exs`:\n\n ```elixir\n def deps do\n [{:paper_trail, \"~> 0.14.3\"}]\n end\n ```\n\n2. Configure paper_trail to use your application repo in `config/config.exs`:\n\n ```elixir\n config :paper_trail, repo: YourApplicationName.Repo\n # if you don't specify this PaperTrail will assume your repo name is Repo\n ```\n\n3. Install and compile your dependency:\n\n ```mix deps.get && mix compile```\n\n4. Run this command to generate the migration:\n\n ```mix papertrail.install```\n\n You might want to edit the types for `:item_id` or `:originator_id` if you're\n using UUID or other types for your primary keys before you execute\n `mix ecto.migrate`.\n\n5. Run the migration:\n\n ```mix ecto.migrate```\n\nYour application is now ready to collect some history!\n\n#### Does this work with phoenix?\n\nYES! Make sure you do the steps above.\n\n### %PaperTrail.Version{} fields:\n\n| Column Name | Type | Description | Entry Method |\n| ------------- | ------- | -------------------------- | ------------------------ |\n| event | String | either \"insert\", \"update\" or \"delete\" | Library generates |\n| item_type | String | model name of the reference record | Library generates |\n| item_id | configurable (Integer by default) | model id of the reference record | Library generates |\n| item_changes | Map | all the changes in this version as a map | Library generates |\n| originator_id | configurable (Integer by default) | foreign key reference to the creator/owner of this change | Optionally set |\n| origin | String | short reference to origin(eg. worker:activity-checker, migration, admin:33) | Optionally set |\n| meta | Map | any extra optional meta information about the version(eg. %{slug: \"ausername\", important: true}) | Optionally set |\n| inserted_at | Date | inserted_at timestamp | Ecto generates |\n\n#### Configuring the types\n\nIf you are using UUID or another type for your primary keys, you can configure\nthe PaperTrail.Version schema to use it.\n\n##### Example Config\n\n```elixir\nconfig :paper_trail, item_type: Ecto.UUID,\n originator_type: Ecto.UUID,\n originator_relationship_options: [references: :uuid]\n```\n\n###### Example User\n\n```elixir\ndefmodule Acme.User do\n use Ecto.Schema\n\n @primary_key {:uuid, :binary_id, autogenerate: true}\n schema \"users\" do\n field :email, :string\n\n timestamps()\n end\n```\n\nRemember to edit the types accordingly in the generated migration.","ref":"PaperTrail.html#module-installation"},{"type":"module","title":"Version origin references: - PaperTrail","doc":"PaperTrail records have a string field called ```origin```. ```PaperTrail.insert/2```, ```PaperTrail.update/2```, ```PaperTrail.delete/2``` functions accept a second argument to describe the origin of this version:\n```elixir\nPaperTrail.update(changeset, origin: \"migration\")\n# or:\nPaperTrail.update(changeset, origin: \"user:1234\")\n# or:\nPaperTrail.delete(changeset, origin: \"worker:delete_inactive_users\")\n# or:\nPaperTrail.insert(new_user_changeset, origin: \"password_registration\")\n# or:\nPaperTrail.insert(new_user_changeset, origin: \"facebook_registration\")\n```","ref":"PaperTrail.html#module-version-origin-references"},{"type":"module","title":"Version originator relationships - PaperTrail","doc":"You can specify setter/originator relationship to paper_trail versions with ```originator``` assignment. This feature is only possible by specifying `:originator` keyword list for your application configuration:\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, originator: [name: :user, model: YourApp.User]\n# For most applications originator should be the user since models can be updated/created/deleted by several users.\n```\n\nNote: You will need to recompile your deps after you have added the config for originator.\n\nThen originator name could be used for querying and preloading. Originator setting must be done via ```:originator``` or originator name that is defined in the paper_trail configuration:\n\n```elixir\nuser = create_user()\n# all these set originator_id's for the version records\nPaperTrail.insert(changeset, originator: user)\n{:ok, result} = PaperTrail.update(edit_changeset, originator: user)\n# or you can use :user in the params instead of :originator if this is your config:\n# config :paper_trail, originator: [name: :user, model: YourApplication.User]\n{:ok, result} = PaperTrail.update(edit_changeset, user: user)\nresult[:version] |> Repo.preload(:user) |> Map.get(:user) # we can access the user who made the change from the version thanks to originator relationships!\nPaperTrail.delete(edit_changeset, user: user)\n```\n\nAlso make sure you have the foreign-key constraint in the database and in your version migration file.","ref":"PaperTrail.html#module-version-originator-relationships"},{"type":"module","title":"Storing version meta data - PaperTrail","doc":"You might want to add some meta data that doesn't belong to ``originator`` and ``origin`` fields. Such data could be stored in one object named ```meta``` in paper_trail versions. Meta field could be passed as the second optional parameter to PaperTrail.insert/2, PaperTrail.update/2, PaperTrail.delete/2 functions:\n\n```elixir\ncompany = Company.changeset(%Company{}, %{name: \"Acme Inc.\"})\n |> PaperTrail.insert(meta: %{slug: \"acme-llc\"})\n\n# You can also combine this with an origin:\nedited_company = Company.changeset(company, %{name: \"Acme LLC\"})\n |> PaperTrail.update(origin: \"documentation\", meta: %{slug: \"acme-llc\"})\n\n# Or even with an originator:\nuser = create_user()\ndeleted_company = Company.changeset(edited_company, %{})\n |> PaperTrail.delete(origin: \"worker:github\", originator: user, meta: %{slug: \"acme-llc\", important: true})\n```\n\n# Strict mode\nThis is a feature more suitable for larger applications. Models can keep their version references via foreign key constraints. Therefore it would be impossible to delete the first and current version of a model if the model exists in the database, it also makes querying easier and the whole design more relational database/SQL friendly. In order to enable strict mode:\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, strict_mode: true\n```\n\nStrict mode expects tracked models to have foreign-key reference to their first_version and current_version. These columns must be named ```first_version_id```, and ```current_version_id``` in their respective model tables. A tracked model example with a migration file:\n\n```elixir\n# In the migration file: priv/repo/migrations/create_company.exs\ndefmodule Repo.Migrations.CreateCompany do\n def change do\n create table(:companies) do\n add :name, :string, null: false\n add :founded_in, :date\n\n # null constraints are highly suggested:\n add :first_version_id, references(:versions), null: false\n add :current_version_id, references(:versions), null: false\n\n timestamps()\n end\n\n create unique_index(:companies, [:first_version_id])\n create unique_index(:companies, [:current_version_id])\n end\nend\n\n# In the model definition:\ndefmodule Company do\n use Ecto.Schema\n\n import Ecto.Changeset\n\n schema \"companies\" do\n field :name, :string\n field :founded_in, :date\n\n belongs_to :first_version, PaperTrail.Version\n belongs_to :current_version, PaperTrail.Version, on_replace: :update # on_replace: is important!\n\n timestamps()\n end\n\n def changeset(struct, params \\\\ %{}) do\n struct\n |> cast(params, [:name, :founded_in])\n end\nend\n```\n\nWhen you run PaperTrail.insert/2 transaction, ```first_version_id``` and ```current_version_id``` automagically gets assigned for the model. Example:\n\n```elixir\ncompany = Company.changeset(%Company{}, %{name: \"Acme LLC\"}) |> PaperTrail.insert\n# {:ok,\n# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, \"companies\">,\n# name: \"Acme LLC\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38], first_version_id: 1, current_version_id: 1},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{name: \"Acme LLC\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38]},\n# originator_id: nil, origin: \"unknown\", meta: nil}}}\n```\n\nWhen you PaperTrail.update/2 a model, ```current_version_id``` gets updated during the transaction:\n\n```elixir\nedited_company = Company.changeset(company, %{name: \"Acme Inc.\"}) |> PaperTrail.update(origin: \"documentation\")\n# {:ok,\n# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, \"companies\">,\n# name: \"Acme Inc.\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 23:22:12], first_version_id: 1, current_version_id: 2},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 23:22:12],\n# item_changes: %{name: \"Acme Inc.\"}, originator_id: nil, origin: \"documentation\", meta: nil}}}\n```\n\nAdditionally, you can put a null constraint on ```origin``` column, you should always put an ```origin``` reference to describe who makes the change. This is important for big applications because a model can change from many sources.","ref":"PaperTrail.html#module-storing-version-meta-data"},{"type":"module","title":"Bang(!) functions: - PaperTrail","doc":"PaperTrail also supports ```PaperTrail.insert!```, ```PaperTrail.update!```, ```PaperTrail.delete!```. Naming of these functions intentionally match ```Repo.insert!```, ```Repo.update!```, ```Repo.delete!``` functions. If PaperTrail is on strict_mode these bang functions will update the version references of the model just like the normal PaperTrail operations.\n\nBang functions assume the operation will always be successful, otherwise functions will raise ```Ecto.InvalidChangesetError``` just like ```Repo.insert!```, ```Repo.update!``` and ```Repo.delete!```:\n\n```elixir\nchangeset = Post.changeset(%Post{}, %{\n title: \"Word on the street is Elixir got its own database versioning library\",\n content: \"You should try it now!\"\n})\n\ninserted_post = PaperTrail.insert!(changeset)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]\n# }\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\ninserted_post_version = PaperTrail.get_version(inserted_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# item_changes: %{title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n\nedit_changeset = Post.changeset(inserted_post, %{\n title: \"Elixir matures fast\",\n content: \"Future is already here, Elixir is the next step!\"\n})\n\nupdated_post = PaperTrail.update!(edit_changeset)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, you deserve to be awesome!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]}\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\nupdated_post_version = PaperTrail.get_version(updated_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil\n# meta: nil}\n\nPaperTrail.delete!(updated_post)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:deleted, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]}\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\nPaperTrail.get_version(updated_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n\nRepo.aggregate(Post, :count, :id) # => 0\nPaperTrail.Version.count() # => 3\n# same as Repo.aggregate(PaperTrail.Version, :count, :id)\n\nPaperTrail.Version.last() # returns the last version in the db by inserted_at\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{\"title\" => \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\", \"id\" => 1,\n# \"inserted_at\" => \"2016-09-15T21:42:38\",\n# \"updated_at\" => \"2016-09-15T22:00:59\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n```","ref":"PaperTrail.html#module-bang-functions"},{"type":"module","title":"Working with multi tenancy - PaperTrail","doc":"Sometimes you have to deal with applications where you need multi tenancy capabilities,\nand you want to keep tracking of the versions of your data on different schemas (PostgreSQL)\nor databases (MySQL).\n\nYou can use the [Ecto.Query prefix](https://hexdocs.pm/ecto/Ecto.Query.html#module-query-prefix)\nin order to switch between different schemas/databases for your own data, so\nyou can specify in your changeset where to store your record. Example:\n\n```elixir\ntenant = \"tenant_id\"\nchangeset = User.changeset(%User{}, %{first_name: \"Izel\", last_name: \"Nakri\"})\n\nchangeset\n|> Ecto.Queryable.to_query()\n|> Map.put(:prefix, tenant)\n|> Repo.insert()\n```\n\nPaperTrail also allows you to store the `Version` entries generated by your activity in\ndifferent schemas/databases by using the value of the element `:prefix` on the options\nof the functions. Example:\n\n```elixir\ntenant = \"tenant_id\"\n\nchangeset =\n User.changeset(%User{}, %{first_name: \"Izel\", last_name: \"Nakri\"})\n |> Ecto.Queryable.to_query()\n |> Map.put(:prefix, tenant)\n\nPaperTrail.insert(changeset, [prefix: tenant])\n```\n\nBy doing this, you're storing the new `User` entry into the schema/database\nspecified by the `:prefix` value (`tenant_id`).\n\nNote that the `User`'s changeset it's sent with the `:prefix`, so PaperTrail **will take care of the\nstorage of the generated `Version` entry in the desired schema/database**. Make sure\nto add this prefix to your changeset before the execution of the PaperTrail function if you want to do versioning on a separate schema.\n\nPaperTrail can also get versions of records or models from different schemas/databases as well\nby using the `:prefix` option. Example:\n\n```elixir\ntenant = \"tenant_id\"\nid = 1\n\nPaperTrail.get_versions(User, id, [prefix: tenant])\n```","ref":"PaperTrail.html#module-working-with-multi-tenancy"},{"type":"module","title":"Version timestamps - PaperTrail","doc":"PaperTrail can be configured to use `utc_datetime` or `utc_datetime_usec` for Version timestamps.\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, timestamps_type: :utc_datetime\n```\n\nNote: You will need to recompile your deps after you have added the config for timestamps.","ref":"PaperTrail.html#module-version-timestamps"},{"type":"module","title":"Suggestions - PaperTrail","doc":"- PaperTrail.Version(s) order matter,\n- Don't delete your paper_trail versions, instead you can merge them\n- If you have a question or a problem, do not hesitate to create an issue or submit a pull request","ref":"PaperTrail.html#module-suggestions"},{"type":"module","title":"Contributing - PaperTrail","doc":"```\nset -a\nsource .env\nmix test --trace\n```\n\n# Credits\nMany thanks to:\n- [Jose Pablo Castro](https://github.com/josepablocastro) - Built the repo configuration for paper_trail\n- [Harold Tafur](https://github.com/hdtafur) - Built the `:ecto_options` option for PaperTrail inserts\n- [Florian Gerhardt](https://github.com/FlorianGerhardt) - Fixed rare compile errors for PaperTrail repos\n- [Alex Antonov](https://github.com/asiniy) - Original inventor of the originator feature\n- [Moritz Schmale](https://github.com/narrowtux) - UUID primary keys feature\n- [Jason Draper](https://github.com/drapergeek) - UUID primary keys feature\n- [Jonatan Männchen](https://github.com/maennchen) - Added non-regular :binary_id UUID support for originator\n- [Josh Taylor](https://github.com/joshuataylor) - Maintenance and new feature suggestions\n- [Mitchell Henke](https://github.com/mitchellhenke) - Fixed weird elixir compiler warnings\n- [Iván González](https://github.com/dreamingechoes) - Multi tenancy feature and some minor refactors\n- [Teo Choong Ping](https://github.com/seymores) - Fixed paper_trail references for newer Elixir versions\n- [devvit](https://github.com/devvit) - Added non-regular primary key tracking support\n- [rustamtolipov](https://github.com/rustamtolipov) - Added support for Ecto v3\n- [gabrielpra1](https://github.com/gabrielpra1) - Added enhanced support for Ecto.Changeset\n- [Darren Thompson](https://github.com/DiscoStarslayer) - Added PaperTrail.Multi which makes paper trail transactions more usable\n- [Harold Tafur](https://github.com/hdtafur) - Made PaperTrail.insert accept :ecto_options params(ie. upsert options)\n- [Attila Szabo](https://github.com/szaboat) - Made %Version[:inserted_at] accept different ecto datetime options\n- [Rafael Scheffer](https://github.com/rschef) - Built PaperTrail.Serializer that unifies %Version{} serialization\n- [Kian Meng Ang](https://github.com/kianmeng) - Improved documentation\n- [Francisco Correia](https://github.com/fv316) - Made PaperTrail transaction keys and ecto transactions more customizable\n- [Don Barlow](https://github.com/ottobar) - Made :initial_version_key configurable for `strict_mode` inserts\n- [Christoph Schmatzler](https://github.com/cschmatzler) - Built PaperTrail.insert_or_update feature\n- [Izel Nakri](https://github.com/izelnakri) - The Originator of this library. See what I did there ;)\n\nAdditional thanks to:\n- [Ruby paper_trail gem](https://github.com/airblade/paper_trail) - Initial inspiration of this project.\n- [Ecto](https://github.com/elixir-ecto/ecto) - For the great API.","ref":"PaperTrail.html#module-contributing"},{"type":"module","title":"License - PaperTrail","doc":"This source code is licensed under the MIT license. Copyright (c) 2016-present Izel Nakri.","ref":"PaperTrail.html#module-license"},{"type":"function","title":"PaperTrail.add_prefix/2","doc":"","ref":"PaperTrail.html#add_prefix/2"},{"type":"function","title":"PaperTrail.delete/2","doc":"Deletes a record from the database with a related version insertion in one transaction","ref":"PaperTrail.html#delete/2"},{"type":"function","title":"PaperTrail.delete!/2","doc":"Same as delete/2 but returns only the model struct or raises if the changeset is invalid.","ref":"PaperTrail.html#delete!/2"},{"type":"function","title":"PaperTrail.get_current_model/1","doc":"","ref":"PaperTrail.html#get_current_model/1"},{"type":"function","title":"PaperTrail.get_item_type/1","doc":"","ref":"PaperTrail.html#get_item_type/1"},{"type":"function","title":"PaperTrail.get_model_id/1","doc":"","ref":"PaperTrail.html#get_model_id/1"},{"type":"function","title":"PaperTrail.get_sequence_id/1","doc":"","ref":"PaperTrail.html#get_sequence_id/1"},{"type":"function","title":"PaperTrail.get_version/1","doc":"","ref":"PaperTrail.html#get_version/1"},{"type":"function","title":"PaperTrail.get_version/2","doc":"","ref":"PaperTrail.html#get_version/2"},{"type":"function","title":"PaperTrail.get_version/3","doc":"","ref":"PaperTrail.html#get_version/3"},{"type":"function","title":"PaperTrail.get_versions/1","doc":"","ref":"PaperTrail.html#get_versions/1"},{"type":"function","title":"PaperTrail.get_versions/2","doc":"","ref":"PaperTrail.html#get_versions/2"},{"type":"function","title":"PaperTrail.get_versions/3","doc":"","ref":"PaperTrail.html#get_versions/3"},{"type":"function","title":"PaperTrail.has_version?/1","doc":"","ref":"PaperTrail.html#has_version?/1"},{"type":"function","title":"PaperTrail.has_version?/2","doc":"","ref":"PaperTrail.html#has_version?/2"},{"type":"function","title":"PaperTrail.has_version?/3","doc":"","ref":"PaperTrail.html#has_version?/3"},{"type":"function","title":"PaperTrail.initialise/2","doc":"Explicitly inserts a non-versioned already existing record into the Versions table","ref":"PaperTrail.html#initialise/2"},{"type":"function","title":"PaperTrail.insert/2","doc":"Inserts a record to the database with a related version insertion in one transaction","ref":"PaperTrail.html#insert/2"},{"type":"function","title":"PaperTrail.insert!/2","doc":"Same as insert/2 but returns only the model struct or raises if the changeset is invalid.","ref":"PaperTrail.html#insert!/2"},{"type":"function","title":"PaperTrail.insert_or_update/2","doc":"Upserts a record to the database with a related version insertion in one transaction.","ref":"PaperTrail.html#insert_or_update/2"},{"type":"function","title":"PaperTrail.insert_or_update!/2","doc":"Same as insert_or_update/2 but returns only the model struct or raises if the changeset is invalid.","ref":"PaperTrail.html#insert_or_update!/2"},{"type":"function","title":"PaperTrail.make_version_struct/3","doc":"","ref":"PaperTrail.html#make_version_struct/3"},{"type":"function","title":"PaperTrail.serialize/1","doc":"","ref":"PaperTrail.html#serialize/1"},{"type":"function","title":"PaperTrail.update/2","doc":"Updates a record from the database with a related version insertion in one transaction","ref":"PaperTrail.html#update/2"},{"type":"function","title":"PaperTrail.update!/2","doc":"Same as update/2 but returns only the model struct or raises if the changeset is invalid.","ref":"PaperTrail.html#update!/2"},{"type":"module","title":"PaperTrail.Multi","doc":"","ref":"PaperTrail.Multi.html"},{"type":"function","title":"PaperTrail.Multi.add_prefix/2","doc":"","ref":"PaperTrail.Multi.html#add_prefix/2"},{"type":"function","title":"PaperTrail.Multi.append/2","doc":"","ref":"PaperTrail.Multi.html#append/2"},{"type":"function","title":"PaperTrail.Multi.commit/1","doc":"","ref":"PaperTrail.Multi.html#commit/1"},{"type":"function","title":"PaperTrail.Multi.delete/3","doc":"","ref":"PaperTrail.Multi.html#delete/3"},{"type":"function","title":"PaperTrail.Multi.error/3","doc":"","ref":"PaperTrail.Multi.html#error/3"},{"type":"function","title":"PaperTrail.Multi.get_item_type/1","doc":"","ref":"PaperTrail.Multi.html#get_item_type/1"},{"type":"function","title":"PaperTrail.Multi.get_model_id/1","doc":"","ref":"PaperTrail.Multi.html#get_model_id/1"},{"type":"function","title":"PaperTrail.Multi.get_sequence_id/1","doc":"","ref":"PaperTrail.Multi.html#get_sequence_id/1"},{"type":"function","title":"PaperTrail.Multi.insert/3","doc":"","ref":"PaperTrail.Multi.html#insert/3"},{"type":"function","title":"PaperTrail.Multi.insert_or_update/3","doc":"","ref":"PaperTrail.Multi.html#insert_or_update/3"},{"type":"function","title":"PaperTrail.Multi.make_version_struct/3","doc":"","ref":"PaperTrail.Multi.html#make_version_struct/3"},{"type":"function","title":"PaperTrail.Multi.merge/2","doc":"","ref":"PaperTrail.Multi.html#merge/2"},{"type":"function","title":"PaperTrail.Multi.merge/4","doc":"","ref":"PaperTrail.Multi.html#merge/4"},{"type":"function","title":"PaperTrail.Multi.new/0","doc":"","ref":"PaperTrail.Multi.html#new/0"},{"type":"function","title":"PaperTrail.Multi.prepend/2","doc":"","ref":"PaperTrail.Multi.html#prepend/2"},{"type":"function","title":"PaperTrail.Multi.run/3","doc":"","ref":"PaperTrail.Multi.html#run/3"},{"type":"function","title":"PaperTrail.Multi.run/5","doc":"","ref":"PaperTrail.Multi.html#run/5"},{"type":"function","title":"PaperTrail.Multi.serialize/1","doc":"","ref":"PaperTrail.Multi.html#serialize/1"},{"type":"function","title":"PaperTrail.Multi.to_list/1","doc":"","ref":"PaperTrail.Multi.html#to_list/1"},{"type":"function","title":"PaperTrail.Multi.update/3","doc":"","ref":"PaperTrail.Multi.html#update/3"},{"type":"module","title":"PaperTrail.RepoClient","doc":"","ref":"PaperTrail.RepoClient.html"},{"type":"function","title":"PaperTrail.RepoClient.item_type/0","doc":"","ref":"PaperTrail.RepoClient.html#item_type/0"},{"type":"function","title":"PaperTrail.RepoClient.origin_read_after_writes/0","doc":"","ref":"PaperTrail.RepoClient.html#origin_read_after_writes/0"},{"type":"function","title":"PaperTrail.RepoClient.originator/0","doc":"","ref":"PaperTrail.RepoClient.html#originator/0"},{"type":"function","title":"PaperTrail.RepoClient.originator_relationship_opts/0","doc":"","ref":"PaperTrail.RepoClient.html#originator_relationship_opts/0"},{"type":"function","title":"PaperTrail.RepoClient.originator_type/0","doc":"","ref":"PaperTrail.RepoClient.html#originator_type/0"},{"type":"function","title":"PaperTrail.RepoClient.repo/0","doc":"Gets the configured repo module or defaults to Repo if none configured","ref":"PaperTrail.RepoClient.html#repo/0"},{"type":"function","title":"PaperTrail.RepoClient.strict_mode/0","doc":"","ref":"PaperTrail.RepoClient.html#strict_mode/0"},{"type":"function","title":"PaperTrail.RepoClient.timestamps_type/0","doc":"","ref":"PaperTrail.RepoClient.html#timestamps_type/0"},{"type":"module","title":"PaperTrail.Serializer","doc":"Serialization functions to create a version struct","ref":"PaperTrail.Serializer.html"},{"type":"function","title":"PaperTrail.Serializer.add_prefix/2","doc":"Adds a prefix to the Ecto schema","ref":"PaperTrail.Serializer.html#add_prefix/2"},{"type":"function","title":"PaperTrail.Serializer.get_item_type/1","doc":"Returns the model type, which is the last module name","ref":"PaperTrail.Serializer.html#get_item_type/1"},{"type":"function","title":"PaperTrail.Serializer.get_model_id/1","doc":"Returns the model primary id","ref":"PaperTrail.Serializer.html#get_model_id/1"},{"type":"function","title":"PaperTrail.Serializer.get_sequence_id/1","doc":"Returns the last primary key value of a table","ref":"PaperTrail.Serializer.html#get_sequence_id/1"},{"type":"function","title":"PaperTrail.Serializer.make_version_struct/3","doc":"Creates a version struct for a model and a specific changeset action","ref":"PaperTrail.Serializer.html#make_version_struct/3"},{"type":"function","title":"PaperTrail.Serializer.serialize/1","doc":"Shows DB representation of an Ecto model, filters relationships and virtual attributes from an Ecto.Changeset or %ModelStruct{}","ref":"PaperTrail.Serializer.html#serialize/1"},{"type":"function","title":"PaperTrail.Serializer.serialize_changes/1","doc":"Dumps changes using Ecto fields","ref":"PaperTrail.Serializer.html#serialize_changes/1"},{"type":"type","title":"PaperTrail.Serializer.model/0","doc":"","ref":"PaperTrail.Serializer.html#t:model/0"},{"type":"type","title":"PaperTrail.Serializer.options/0","doc":"","ref":"PaperTrail.Serializer.html#t:options/0"},{"type":"type","title":"PaperTrail.Serializer.primary_key/0","doc":"","ref":"PaperTrail.Serializer.html#t:primary_key/0"},{"type":"module","title":"PaperTrail.Version","doc":"","ref":"PaperTrail.Version.html"},{"type":"function","title":"PaperTrail.Version.changeset/2","doc":"","ref":"PaperTrail.Version.html#changeset/2"},{"type":"function","title":"PaperTrail.Version.count/0","doc":"Returns the count of all version records in the database","ref":"PaperTrail.Version.html#count/0"},{"type":"function","title":"PaperTrail.Version.count/1","doc":"","ref":"PaperTrail.Version.html#count/1"},{"type":"function","title":"PaperTrail.Version.first/0","doc":"Returns the first version record in the database by :inserted_at","ref":"PaperTrail.Version.html#first/0"},{"type":"function","title":"PaperTrail.Version.first/1","doc":"","ref":"PaperTrail.Version.html#first/1"},{"type":"function","title":"PaperTrail.Version.last/0","doc":"Returns the last version record in the database by :inserted_at","ref":"PaperTrail.Version.html#last/0"},{"type":"function","title":"PaperTrail.Version.last/1","doc":"","ref":"PaperTrail.Version.html#last/1"},{"type":"type","title":"PaperTrail.Version.t/0","doc":"","ref":"PaperTrail.Version.html#t:t/0"},{"type":"module","title":"PaperTrail.VersionQueries","doc":"","ref":"PaperTrail.VersionQueries.html"},{"type":"function","title":"PaperTrail.VersionQueries.get_current_model/1","doc":"Gets the current model record/struct of a version","ref":"PaperTrail.VersionQueries.html#get_current_model/1"},{"type":"function","title":"PaperTrail.VersionQueries.get_version/1","doc":"Gets the last version of a record.\n\nA list of options is optional, so you can set for example the :prefix of the query,\nwich allows you to change between different tenants.\n\n# Usage examples:\n\n iex(1)> PaperTrail.VersionQueries.get_version(record, id)\n iex(1)> PaperTrail.VersionQueries.get_version(record, [prefix: \"tenant_id\"])\n iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id)\n iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id, [prefix: \"tenant_id\"])","ref":"PaperTrail.VersionQueries.html#get_version/1"},{"type":"function","title":"PaperTrail.VersionQueries.get_version/2","doc":"","ref":"PaperTrail.VersionQueries.html#get_version/2"},{"type":"function","title":"PaperTrail.VersionQueries.get_version/3","doc":"","ref":"PaperTrail.VersionQueries.html#get_version/3"},{"type":"function","title":"PaperTrail.VersionQueries.get_versions/1","doc":"Gets all the versions of a record.\n\nA list of options is optional, so you can set for example the :prefix of the query,\nwich allows you to change between different tenants.\n\n# Usage examples:\n\n iex(1)> PaperTrail.VersionQueries.get_versions(record)\n iex(1)> PaperTrail.VersionQueries.get_versions(record, [prefix: \"tenant_id\"])\n iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id)\n iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id, [prefix: \"tenant_id\"])","ref":"PaperTrail.VersionQueries.html#get_versions/1"},{"type":"function","title":"PaperTrail.VersionQueries.get_versions/2","doc":"Gets all the versions of a record given a module and its id","ref":"PaperTrail.VersionQueries.html#get_versions/2"},{"type":"function","title":"PaperTrail.VersionQueries.get_versions/3","doc":"","ref":"PaperTrail.VersionQueries.html#get_versions/3"},{"type":"function","title":"PaperTrail.VersionQueries.has_version?/1","doc":"","ref":"PaperTrail.VersionQueries.html#has_version?/1"},{"type":"function","title":"PaperTrail.VersionQueries.has_version?/2","doc":"","ref":"PaperTrail.VersionQueries.html#has_version?/2"},{"type":"function","title":"PaperTrail.VersionQueries.has_version?/3","doc":"","ref":"PaperTrail.VersionQueries.html#has_version?/3"},{"type":"module","title":"UserAuthLiveMount","doc":"","ref":"UserAuthLiveMount.html"},{"type":"function","title":"UserAuthLiveMount.on_mount/4","doc":"","ref":"UserAuthLiveMount.html#on_mount/4"},{"type":"extras","title":"Bonfire Networks","doc":"\n\n\n# Bonfire Networks \n\n[Bonfire](https://bonfirenetworks.org/) is an open-source framework for building federated digital spaces where people can gather, interact, and form communities online.\n\n![Bonfire wallpaper](https://i.imgur.com/dbRT0Z1.png)\n\n> #### Info {: .info}\n>\n> This project is in the beta stage - you're welcome to try out it out (specifically the social features in the classic flavour), but APIs may still change and no guarantees are given about stability. You can keep track of progress [in our milestones](https://github.com/bonfire-networks/bonfire-app/milestones?direction=asc&sort=due_date&state=open)","ref":"readme.html"},{"type":"extras","title":"Main features - Bonfire Networks","doc":"1. **Modular architecture**: Bonfire consists of extensions that shape the functionality and user experience of each digital space. Communities can enable or disable these extensions to customize their space according to their needs and vision.\n2. **Extensibility**: Developers can create new extensions to expand the capabilities of digital spaces, such as adding new activities or introducing innovative user experiences for existing functions.\n3. **Federation**: Bonfire allows digital spaces to connect and communicate with each other, enabling users to interact across different communities while maintaining their unique identities and preferences.\n4. **Flexibility**: Whether you're an individual developer or part of a larger team, Bonfire provides a flexible framework for building and customizing digital spaces that cater to a wide range of communities and purposes.\n\nBonfire empowers developers and communities to create engaging, customizable, and interconnected digital spaces that foster collaboration, creativity, and social interaction online.","ref":"readme.html#main-features"},{"type":"extras","title":"🔥 Flavours - Bonfire Networks","doc":"This repo includes configurations to run a few main [flavours of Bonfire](https://bonfirenetworks.org/apps/) you can choose from:\n* [Classic](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/classic) for basic social networking (beta)\n* [Community](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/community) with groups and topics functionality (alpha)\n* [Open Science](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/open-science) building the next generation of open science platforms (pre-alpha)\n* [Coordination](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/coordination) for organising work and collaborating around projects and tasks (pre-alpha)\n* [Cooperation](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/cooperation) for cooperative production, distribution, and exchange of economic resources (pre-alpha)\n\n","ref":"readme.html#flavours"},{"type":"extras","title":"How to get the most out of the documentation - Bonfire Networks","doc":"- **Developers**: You'll probably be interested in understanding how to build on Bonfire. The [dev setup](/docs/DEPLOY.md) will guide you through the installation of bonfire on your local machine. In the [Just commands](/docs/topics/JUST.md) page you will gain familiarities with the basic Bonfire CLI commands. From there you may want to continue [developing a new extension](/docs/building/create-a-new-extension.md), or learning more about the internals and the [Bonfire architecture](/docs/topics/ARCHITECTURE.md).\n\n- **Users**: Whether you are a user who is looking for an existing digital place to join, or want to understand more about how Bonfire works and how to get the most out of it, the [Community Manual](https://bonfirenetworks.org/#TODO) is a good place to start. There you can learn about how to customize your experience, what boundaries are and how to experience a new and safer way to interact with federated social networks.\n\n- **Community organisers & sysadmins**: Ready to launch your digital space? We got you covered on our [hosting guide](/docs/DEPLOY.md).","ref":"readme.html#how-to-get-the-most-out-of-the-documentation"},{"type":"extras","title":"Prerequisite knowledge - Bonfire Networks","doc":"Bonfire aims to be beginner-friendly, but to keep the documentation focused on the framework's functionalities, we assume a basic understanding of the following technologies:\n\n- **Elixir**: If you're new to Elixir or need a refresher, start with the [Elixir guide](https://hexdocs.pm/elixir/introduction.html).\n- **Phoenix/LiveView** and **Surface**: Bonfire's official web UI is built with the Surface framework, which itself is based on Phoenix LiveView. If you're unfamiliar with them, check out the [Phoenix overview](https://hexdocs.pm/phoenix/overview.html), [Phoenix LiveView guide](https://hexdocs.pm/phoenix_live_view/welcome.html), and [Surface docs](https://surface-ui.org). You may also be interested in the [Phoenix LiveView video course by Pragmatic Studio](https://pragmaticstudio.com/phoenix-liveview).\n- **PostgreSQL**: Bonfire uses PostgreSQL as its primary database. Basic knowledge of SQL and PostgreSQL is helpful.\n\nBonfire also provides a [GraphQL API](/docs/topics/GRAPHQL.md) for developers who want to build custom frontends.\n\nThroughout the documentation, we'll make sure to provide links to relevant resources when introducing new concepts to help you along the way. We have a strong affinity for Elixir and believe it's a powerful language for building scalable and maintainable social networks.","ref":"readme.html#prerequisite-knowledge"},{"type":"extras","title":"Join our community - Bonfire Networks","doc":"If you have questions about anything related to Bonfire, you're always welcome to ask our community on [Matrix](https://matrix.to/#/#bonfire-networks:matrix.org), [Slack](https://join.slack.com/t/elixir-lang/shared_invite/zt-2ko4792lz-28XosraCTaYZKOyuZ80hrg), [Elixir Forum](https://elixirforum.com) and the [Fediverse](https://indieweb.social/@bonfire) or send us an email at team@bonfire.cafe.","ref":"readme.html#join-our-community"},{"type":"extras","title":"Copyright and License - Bonfire Networks","doc":"Copyright (c) 2020-2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"readme.html#copyright-and-license"},{"type":"extras","title":"Development setup","doc":"# Development setup\n\n> #### Info {: .info}\n>\n> These instructions are for hacking on Bonfire. If you wish to deploy in production, please refer to our deployment guide instead.\n\n\nHello, potential contributor! :-)\n\nThis is a work in progress guide to getting up and running as a developer. Please ask questions in the issue tracker if something is not clear and we'll try to improve it.\n\nHappy hacking!","ref":"hacking.html"},{"type":"extras","title":"Status: beta - have fun and provide feedback 🙏 - Development setup","doc":"Bonfire is currently beta software. While it's fun to play with it, we would not recommend running any production instances (meaning not using it for your primary fediverse identity) yet because it's not quite ready for that today.","ref":"hacking.html#status-beta-have-fun-and-provide-feedback"},{"type":"extras","title":"System Requirements - Development setup","doc":"- [Just](https://github.com/casey/just#packages): a handy tool (a `make` alternative) to run commands defined in `./justfile`.","ref":"hacking.html#system-requirements"},{"type":"extras","title":"Download - Development setup","doc":"Either way, you need to first clone this repository and change into the directory and then do some configuration:\n\n```sh\n$ git clone https://github.com/bonfire-networks/bonfire-app bonfire\n$ cd bonfire\n```","ref":"hacking.html#download"},{"type":"extras","title":"Configure - Development setup","doc":"","ref":"hacking.html#configure"},{"type":"extras","title":"Pick a flavour - Development setup","doc":"Bonfire is a flexible platform that powers a variety of social networks. The first thing you have to choose is which app (or \"flavour\") you want to hack on:\n\n- `classic` (\"Bonfire Social\", a basic social network that interoperates with the fediverse)\n- `community` (for topics and groups)\n- `open-science` (for next-gen scientific communities)\n- `coordination` (for coordinating around tasks and projects)\n- `cooperation` (for building cooperative economic networks)\n\nNote that at the current time, the core team are focusing most of their efforts on the `classic` flavour and this is where we **recommend** you start.\n\n\nSo for example if you want to run the `classic` flavour run:\n\n```sh\nexport FLAVOUR=classic\n``` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#pick-a-flavour"},{"type":"extras","title":"Choose your development environment - Development setup","doc":"You can choose to run bonfire in a variety of ways, from fully managed via docker-compose, to bare metal with local postgres and elixir, to a combination of the two, we also offer the possibility to run Bonfire with nix.\n\n","ref":"hacking.html#choose-your-development-environment"},{"type":"extras","title":"Easy - Development setup","doc":"The easy way consist in using bare-metal elixir, and docker-managed tooling, database & search index, recommended for active development.\n\n> #### Info {: .info}\n>\n> Note: the simplest way to handle dependencies is using a tool like [mise](https://mise.jdx.dev/) or asdf to setup the environment (simply run `mise install` in the root directory).\n\n#### Dependencies:\n - Recent versions of [Elixir](https://elixir-lang.org/install.html) (1.15+) and OTP/erlang (25+)\n - [yarn](https://yarnpkg.com)\n - Recent versions of Docker & [docker-compose](https://docs.docker.com/compose/install/)\n\n- Make sure you've set the env to indicate your choice\n\n```bash\nexport WITH_DOCKER=easy\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#easy"},{"type":"extras","title":"All containers - Development setup","doc":"Fully managed via docker-compose, recommended when you're first exploring and don't want to install Elixir.\n\n> NOTE: not recommended on MacOS, as it is significantly slower.\n\n#### Dependencies \n\n- Recent versions of Docker & [docker-compose](https://docs.docker.com/compose/install/)\n- Make sure you've set the environment variable to indicate your choice:\n\n```bash\nexport WITH_DOCKER=total\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n","ref":"hacking.html#partial"},{"type":"extras","title":"Bare-metal - Development setup","doc":"> #### Info {: .info}\n>\n> Note: you can use a tool like [mise](https://mise.jdx.dev/) or asdf to setup the environment (run `mise install` in the root directory). You will still need to install Postgres and Meili seperately though.\n\n- Dependencies:\n - Recent versions of [Elixir](https://elixir-lang.org/install.html) (1.15+) and OTP/erlang (25+)\n \n - [yarn](https://yarnpkg.com)\n - Postgres 12+ (or rather [Postgis](https://postgis.net/install/) if using the bonfire_geolocate extension)\n - [Meili Search](https://docs.meilisearch.com/learn/getting_started/installation.html) (optional)\n\n- If you want search capabilities, you'll also need to setup a Meili server and set the relevant env variables as well.\n\n- Make sure you've set the environment variable to indicate your choice\n\n```bash\nexport WITH_DOCKER=no\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#bare-metal"},{"type":"extras","title":"Nix - Development setup","doc":"You can also choose to use nix to setup your development environment.\n\n#### Dependencies:\n\n- Run a recent version of Nix or NixOS: https://nixos.org/download.html\n- Enable Flakes: https://nixos.wiki/wiki/Flakes#Installing_flakes\n- Install [direnv](https://direnv.net/) through nix if you don't have the tool already: `nix profile install nixpkgs#direnv` and add it to your shell: https://direnv.net/docs/hook.html\n- Clone the bonfire-app repo if you haven't already and allow direnv to use environment variables:\n ```bash\n git clone https://github.com/bonfire-networks/bonfire-app\n cd `bonfire-app`\n direnv allow\n ```\n\nThe tool direnv is necessary for the nix setup as the nix shell environment will use variables defined on `.envrc` to set itself up.\n\nNote: when you run `direnv allow` on the bonfire-app directory for the first time, nix will automatically fetch the dependencies for bonfire. The process will take a while as it's downloading everything needed to use the development environment. Afterwards you will be able to use just fine. Proceeding times you enter the directory, the shell with automatically set up for your use without downloading the packages again.\n\nYou will need to update the db directory which is automatically created by nix the first time you initialized the shell with `direnv allow`. You can do so with the following steps:\n- Update `props.nix` to the settings you want.\n- Run `just nix-db-init` to create the database and user for postgres defined on `props.nix`.\n- Modify the `.env` file to comment out all `POSTGRES_*` variables. These are populated automatically by nix. So if the variables are set here, you may get issues with overriding your settings in `props.nix` when using bonfire.\n- You can now proceed to Hello World!\n\nNote: if you ever want to shut off the postgres server in nix, simply run the nix-db targets in just:\n\n```\n# stop postgres server running locally\njust nix-db stop\n# start postgres server running locally\njust nix-db start\n```\n\n","ref":"hacking.html#nix"},{"type":"extras","title":"Configure - Development setup","doc":"Run `just config` to initialise the needed config.\n\n```sh\njust config\n```\n\nThen you can edit the config for the current flavour in `./.env`\n\n> For example, you can set `TEST_LOG_LEVEL=debug` in your `.env` to show full debug logs when running unit tests.\n\nThe only required config to startup bonfire are the secrets for sessions/cookies (`SECRET_KEY_BASE`, `SIGNING_SALT`, `ENCRYPTION_SALT`), you can generate strings for these by running:\n\n```sh\njust secrets\n```","ref":"hacking.html#configure"},{"type":"extras","title":"Light a fire! - Development setup","doc":"From a fresh checkout of this repository, this command will fetch the app's dependencies and setup the database (the same commands apply for all three options above):\n\n```\njust setup-dev\n```\n\nThis command will take a while to complete. Soon we will streamiline the setup process to be more lightway, bear with us for the moment.\n\nYou should now be able to run the app with:\n\n```\njust dev\n```\n\nRead more about the available `just` commands in the [`just` commands](./topics/JUST.md) page.","ref":"hacking.html#light-a-fire"},{"type":"extras","title":"Onboarding - Development setup","doc":"","ref":"hacking.html#onboarding"},{"type":"extras","title":"Getting Started - Development setup","doc":"The back-end server runs on port 4000 (TCP) by default. Access it by navigating to http://localhost:4000/ in your web browser.","ref":"hacking.html#getting-started"},{"type":"extras","title":"Creating an account - Development setup","doc":"To create an account, go to http://localhost:4000/signup and enter your email address and password.\nWhen running the server locally and signing up for the first time, you won't need a confirmation email. However, for any future signups know you can find the confirmation link in the server logs.\n\n> You can also sign up via CLI by entering something like this in your app's Elixir console: `Bonfire.Me.make_account_only(\"my@email.net\", \"my pw\")`","ref":"hacking.html#creating-an-account"},{"type":"extras","title":"Admin permissions - Development setup","doc":"The first user registered on the platform is automatically granted Admin permissions.","ref":"hacking.html#admin-permissions"},{"type":"extras","title":"Successful onboarding - Development setup","doc":"After successfully creating and confirming your account, you should see an empty dashboard.\n\nThat's it! You have now successfully onboarded and can start using the application.","ref":"hacking.html#successful-onboarding"},{"type":"extras","title":"The Bonfire environment - Development setup","doc":"We like to think of bonfire as a comfortable way of developing software - there are a lot of conveniences built in once you know how they all work. The gotcha is that while you don't know them, it can be a bit overwhelming. Don't worry, we've got your back.\n\n- [Architecture](./topics/ARCHITECTURE.md) - an overview of the stack and code structure.\n- [Bonfire-flavoured Elixir](./topics/BONFIRE-FLAVOURED-ELIXIR.md) - an introduction to the way we write Elixir.\n- [Bonfire's Database: an Introduction](./topics/DATABASE.md) - an overview of how our database is designed.\n- [Boundaries](./topics/BOUNDARIES.md) - an introduction to our access control system.\n\nNote: these are still at the early draft stage, we expect to gradually improve documentation over time.","ref":"hacking.html#the-bonfire-environment"},{"type":"extras","title":"Documentation - Development setup","doc":"The code is somewhat documented inline. You can generate HTML docs (using `Exdoc`) by running `just docs`.","ref":"hacking.html#documentation"},{"type":"extras","title":"Additional information - Development setup","doc":"\n\n- `./extensions/` is used to hack on local copies of Bonfire extensions. You can clone an extension from its git repo and use the local version during development, eg: `just dep-clone-local bonfire_me https://github.com/bonfire-networks/bonfire_me`\n\n- `./forks/` is used to hack on local copies of any other dependencies.\n\n- You can migrate the DB when the app is running (also runs automatically on startup): `Bonfire.Common.Repo.migrate`\n\n- You can generate a dependency graph using `just xref-graph` which will generate a DOT file at `docs/` (if Graphviz is installed it will also generate an SVG visualisation using `dot`).","ref":"hacking.html#additional-information"},{"type":"extras","title":"Usage under Windows (WSL, MSYS or CYGWIN) - Development setup","doc":"By default, the `justfile` requires symlinks, which can be enabled with the help of [this link](https://stackoverflow.com/a/59761201).\n\nSee the [pull request adding WSL support](https://github.com/bonfire-networks/bonfire-app/pull/111) for details about usage without symlinks.","ref":"hacking.html#usage-under-windows-wsl-msys-or-cygwin"},{"type":"extras","title":"Troubleshooting - Development setup","doc":"","ref":"hacking.html#troubleshooting"},{"type":"extras","title":"EACCES Permissions Error - Development setup","doc":"If you get a permissions error when following any of the steps, run the following command and it should be fixed:\n\n```shell\ncd bonfire && sudo chown -R yourusername:yourusername .\n```\n\nNote that the command should be modified so your shell is pointing to wherever you have bonfire installed. If you are already in the bonfire directory then you only need to worry about running the `chown` portion of the command.","ref":"hacking.html#eacces-permissions-error"},{"type":"extras","title":"Unable to access Postgres database - Development setup","doc":"If you are getting any `:nxdomain` errors, check if you have any firewalls that may be blocking the port on your system.\n\nFor example, if you are running UFW (a lot of Linux distros do), run the following command to allow access to port 4000:\n\n```shell\nsudo ufw allow 4000\n```\n\n### (Mix) Package fetch failed\n\nExample:\n\n```\n** (Mix) Package fetch failed and no cached copy available (https://repo.hex.pm/tarballs/distillery-2.0.12.tar)\n```\n\nIn this case, distillery (as an example of a dependency) made a new release and retired the old release from hex. The new version (`2.0.14`) is quite close to the version we were depending on (`2.0.12`), so we chose to upgrade:\n\n```shell\nmix deps.update distillery\n```\n\nThis respects the version bounds in `mix.exs` (`~> 2.0`), so increment that if required.\n\n### `(DBConnection.ConnectionError) tcp recv: closed`\n\nExample:\n\n```\n** (DBConnection.ConnectionError) tcp recv: closed (the connection was closed by the pool, possibly due to a timeout or because the pool has been terminated)\n```\n\nIn this case, the seeds were unable to complete because a query took too long to execute on your machine. You can configure the timeout to be larger in the `dev` environment:\n\n1. Open `config/dev.exs` in your editor.\n2. Find the database configuration (search for `Bonfire.Common.Repo`).\n3. Add `timeout: 60_000` to the list of options:\n\n```\nconfig :bonfire, Bonfire.Common.Repo,\n timeout: 60_000,\n [...]\n```","ref":"hacking.html#unable-to-access-postgres-database"},{"type":"extras","title":"Compilation errors like `(ArgumentError) could not load module Needle.ULID due to reason :unavailable` or `(ArgumentError) could not load module Poison.Encoder due to reason :unavailable` - Development setup","doc":"This seems to be an issue with the order of compilation, you can usually work around it by cleaning the deps it complains about, eg: `just deps-clean needle_ulid` or `just deps-clean poison` or `just deps-clean jason`","ref":"hacking.html#compilation-errors-like-argumenterror-could-not-load-module-needle-ulid-due-to-reason-unavailable-or-argumenterror-could-not-load-module-poison-encoder-due-to-reason-unavailable"},{"type":"extras","title":"Hosting guide","doc":"# Hosting guide\n\nA short guide to running Bonfire in a production environment and setting up a digital space connected to the fediverse.\n\n> #### Warning {: .warning}\n>\n> Bonfire is currently beta software. While it's fun to play with it, we would not recommend running any production instances yet (meaning not using it for your primary fediverse identity) because it's not quite ready for that today. \n\n\n_These instructions are for setting up Bonfire in production. If you want to run the backend in development, please refer to our [Installation guide](./hacking) instead._","ref":"deploy.html"},{"type":"extras","title":"Security Warning - Hosting guide","doc":"We recommend only granting an account to people you trust to minimise the attack surface. Accordingly, Bonfire ships with public registration disabled. The admin panel has an `invite` facility. \n\n---","ref":"deploy.html#security-warning"},{"type":"extras","title":"Step 1 - Decide how you want to deploy and manage the app - Hosting guide","doc":"","ref":"deploy.html#step-1-decide-how-you-want-to-deploy-and-manage-the-app"},{"type":"extras","title":"Co-op Cloud - Hosting guide","doc":"Install using [Co-op Cloud](https://coopcloud.tech) (recommended) which is an alternative to corporate cloud services built by tech co-ops, and provides handy tools for setting up and managing many self-hosted free software tools using ready-to-use \"recipes\". Very useful if you'd like to host Bonfire alongside other open and/or federated projects. \n\n1. Install [Abra](https://docs.coopcloud.tech/abra/) on your machine\n2. [Set up a server with co-op cloud](https://docs.coopcloud.tech/operators/) \n3. Use the [Bonfire recipe](https://recipes.coopcloud.tech/bonfire) and follow the instructions there, including editing the config in the env file at `~/.abra/servers/your_server/your_app.env` (see [prepare the config](#preparing-the-config-in-env) for details about what to edit)\n4. Run the abra deploy command and [done!](#running-the-app)","ref":"deploy.html#co-op-cloud"},{"type":"extras","title":"Docker containers - Hosting guide","doc":"1. Install dependencies. \n\nThe easiest way to manage the docker image is using just commands.\n\nThe `docker-compose.release.yml` uses `config/prod/.env` to launch a container with the necessary environment variables along with its dependencies, currently that means an extra postgres container, along with a reverse proxy (Caddy server, which you may want to replace with nginx or whatever you prefer).\n\nMake sure you have [Docker](https://www.docker.com/), with the [compose](https://docs.docker.com/compose/install/#install-compose) plugin, and [just](https://github.com/casey/just#packages) installed:\n\n```sh\n$ docker version\nDocker Engine - Community - 23.0.1\n\n$ docker compose version\nDocker Compose version v2.16.0\n\n$ just --version\njust 1.13.0\n...\n```\n\n2. Clone this repository and change into the directory:\n\n```sh\ngit clone --depth 1 https://github.com/bonfire-networks/bonfire-app.git bonfire && cd bonfire\n```\n\n3. Specify what flavour you want to run in production:\n\nThe first thing to do is choose what flavour of Bonfire (eg. classic, community, or cooperation) you want to deploy, as each flavour uses different Docker images and set of configs. For example if you want to run the `classic` flavour:\n\n- `export MIX_ENV=prod FLAVOUR=classic WITH_DOCKER=yes` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n4. Run `just config` to initialise some default config and then edit the config in the `./.env` file (see [prepare the config](#preparing-the-config-in-env) for details about what to edit).\n\n> Now that your tooling is set up, you have the choice of using pre-built images or building your own. For example if your flavour does not have a prebuilt image on Docker Hub, or if you want to customise any of the extensions, you can build one yourself. \n\n\n#### Using pre-built Docker images (easy mode)\n\n- The `image` entry in `docker-compose.release.yml` will by default use the image on Docker Hub which corresponds to your chosen flavour (see step 1 above for choosing your flavour).\n\nYou can see the images available per flavour, version (we currently recommend using the `latest` tag), and architecture at https://hub.docker.com/r/bonfirenetworks/bonfire/tags \n\n5. Try [running the app](#running-with-docker)!\n\n\n#### Custom Docker build\n\nBuilding your own Docker image is useful if you want to make code changes or add your own extensions.\n\n`Dockerfile.release` uses the [multistage build](https://docs.docker.com/develop/develop-images/multistage-build/) feature to just the image as small as possible. It generates the OTP release which is later copied into the final image packaged in an Alpine linux container.\n\nThere is a `justfile` with relevant commands (make sure set the `MIX_ENV=prod` env variable):\n\n- `just rel-build-locked` which builds the docker image of the latest release\n- `just rel-build` which builds the docker image, including local changes to any cloned extensions in `./extensions/` \n- `just rel-tag` adds the \"latest\" tag to your last build, so that it will be used when running\n\nOnce you've built and tagged your image, you may need to update the `image` name in `docker-compose.release.release.yml` to match (either your local image name if running on the same machine you used for the build, or a remote image on Docker Hub if you pushed it) and then follow the same steps as for option A1.\n\nFor production, we recommend to set up a CI workflow to automate this, for an example you can look at the one [we currently use](../github/workflows/release.yaml).\n\nFinally, try [running the app](#running-with-docker)!\n\n\n#### Running with Docker\n\n- Start the docker containers with docker-compose:\n\n```\njust rel-run\n```\n\nRun this at the prompt: \n\n`bin/bonfire remote` to enter Elixir's iex environment\n`Bonfire.Common.Repo.migrate` to initialise your database\n\nThe backend should now be running at [http://localhost:4000/](http://localhost:4000/). [Yay, you're up and running!](#running-the-app)\n\n- If that worked, start the app as a daemon next time:\n\n```\njust rel-run-bg\n```\n\n(Alternatively, `just rel-run-bg db` if you want to run the backend + db but not the web proxy, or `just rel-run-bg db search` if you want to run the full-text search index.)","ref":"deploy.html#docker-containers"},{"type":"extras","title":"Bare-metal - Hosting guide","doc":"Running a custom build without Docker.\n\n1. Install dependencies. \n\n- Postgres (or Postgis) version 12 or newer\n- [just](https://github.com/casey/just#packages)\n- Elixir version 1.15+ with OTP 25+ (see the `Dockerfile` to double check the versions we're currently using). If your distribution only has an old version available, check [Elixir's install page](https://elixir-lang.org/install.html) or use a tool like [mise](https://github.com/jdx/mise) (run `mise install` in this directory) or asdf.\n\n2. Clone this repository and change into the directory:\n\n```sh\ngit clone --depth 1 https://github.com/bonfire-networks/bonfire-app.git bonfire && cd bonfire\n```\n\n3. Specify what flavour you want to run in production:\n\nThe first thing to do is choose what flavour of Bonfire (eg. classic, community, or cooperation) you want to deploy, as each flavour uses different Docker images and set of configs. For example if you want to run the `classic` flavour:\n\n- `export FLAVOUR=classic MIX_ENV=prod WITH_DOCKER=no` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n4. Run `just config` to initialise some default config and then edit the config in the `./.env` file (see [prepare the config](#preparing-the-config-in-env) for details about what to edit).\n \n5. Run `just rel-build` to create an elixir release. This will create an executable in your `_build/prod/rel/bonfire` directory. Note that you will need `just` to pass in the `.env` file to the executable, like so: `just cmd _build/prod/rel/bonfire/bin/bonfire `. Alternatively, this file can be sourced by `source .env` instead. We will be using the `bin/bonfire` executable as called from `just` from here on. \n\n6. Running the release\n\n- Create a database, and a user, fill out the `.env` with your credentials and secrets\n\n- You will need to use `just` in order to pass the `.env` file to the executable. This can be accomplished by running `just cmd _build/prod/rel/bonfire/bin/bonfire `. Just works from the root directory of the `justfile`, not your current directory.\n\n- If you’re using RDS or some other locked down DB, you may need to run `CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;` on your database with elevated privileges.\n\n- You can check if your instance is configured correctly and get to the iex console by running `bin/bonfire start`\n\n- The migrations should automatically run on first boot, but if you run into troubles the migration command is: `Bonfire.Common.Repo.migrate()` in the iex console. \n\n- To run the instance as a daemon, use `bin/bonfire start daemon`. [Yay, you're up and running!](#running-the-app)\n\n7. Adding HTTPS\n\nThe common and convenient way for adding HTTPS is by using a reverse proxy like Nginx or Caddyserver (the latter of which is bundled as part of the docker compose setup).\n\nCaddyserver and other servers can handle generating and setting up HTTPS certificates automatically, but if you need TLS/SSL certificates for nginx, you can look get some for free with [letsencrypt](https://letsencrypt.org/). The simplest way to obtain and install a certificate is to use [Certbot.](https://certbot.eff.org). Depending on your specific setup, certbot may be able to get a certificate and configure your web server automatically.\n\nIf you've built from source, you should point the nginx root directory to be `_build/prod/rel/bonfire/lib/bonfire-[current-version]/priv/static`","ref":"deploy.html#bare-metal"},{"type":"extras","title":"Nix - Hosting guide","doc":"This repo contains an experimental Flake and Nix module. These are not ready for production.\n\nHere are the detailed steps to deploy it:\n\n- run a recent version of Nix or NixOS: https://nixos.wiki\n- enable Flakes: https://nixos.wiki/wiki/Flakes#Installing_flakes\n- add `sandbox = false` in your nix.conf\n- fetch and build the app and dependencies: `nix run github:bonfire-networks/bonfire-app start_iex`\n- add it as an input to your system flake.\n- add an overlay to just the package available\n- add the required configuration in your system\n\nYour `flake.nix` file would look like the following. Remember to replace `myHostName` with your actual hostname or however your deployed system is called.\n\n```nix\n{\n inputs.bonfire.url = \"github:bonfire-networks/bonfire-app/main\";\n outputs = { self, nixpkgs, bonfire }: {\n overlay = final: prev: with final;{\n # a package named bonfire already exists on nixpkgs so we put it under a different name\n elixirBonfire = bonfire.packages.x86_64-linux.default;\n };\n nixosConfigurations.myHostName = nixpkgs.lib.nixosSystem {\n system = \"x86_64-linux\";\n modules = [\n {\n environment.systemPackages = [ agenix.defaultPackage.x86_64-linux ];\n nixpkgs.overlays = [ self.overlay ];\n }\n ./myHostName.nix\n bonfire.nixosModules.bonfire\n ];\n };\n };\n}\n```\n\nThen your `myHostName.nix` would look like the following:\n\n```nix\n{ config, lib, pkgs, ... }:\n\n{\n services.bonfire = {\n # you will additionally need to expose bonfire with a reverse proxy, for example caddy\n port = 4000;\n package = pkgs.elixirBonfire;\n dbName = \"bonfire\";\n # the environment should contain a minimum of\n # SECRET_KEY_BASE\n # SIGNING_SALT\n # ENCRYPTION_SALT\n # RELEASE_COOKIE\n # have a look into nix/module.nix for more details\n # the way to deploy secrets is beyond this readme, but I would recommend agenix\n environmentFile = \"/run/secrets/bonfireEnv\";\n dbSocketDir = \"/var/run/postgresql\";\n };\n\t\n\t# this is specifically for a reverse proxy, which is primarily used for SSL certs\n\tservices.ngnix = {\n\t\tenable = true;\n\t\tforceSSL = true;\n\t\tenableACME = true;\n\t\tvirtualHosts.\"myHostName\".locations.proxyPass = \"http://localhost:4000\";\n\t};\n\t\n\t# You will need to accept ACME's terms and conditions if you haven't elsewhere in your configuration\n\tsecurity.acme.defaults.email = \"you@myHostName.com\";\n\tsecurity.acme.acceptTerms = true;\n\n # this is uniquely for database backup purposes\n # replace myBackupUserName with the user name that will do the backups\n # if you want to do backups differently, feel free to remove this part of the config\n services.postgresql = {\n ensureDatabases = [ \"bonfire\" ];\n ensureUsers = [{\n name = \"myBackupUserName\";\n ensurePermissions = { \"DATABASE bonfire\" = \"ALL PRIVILEGES\"; };\n }];\n };\n}\n```\n\n\n\n\n\n## Preparing the config (in .env)","ref":"deploy.html#nix"},{"type":"extras","title":"Config keys you should pay special attention to: - Hosting guide","doc":"The app needs these environment variables to be configured in order to work.\n\n- `FLAVOUR` should reflect your chosen flavour\n- `HOSTNAME` (your domain name, eg: `bonfire.example.com`)\n- `PUBLIC_PORT` (usually 443)\n- `MAIL_DOMAIN` and `MAIL_KEY` and related keys to configure transactional email, for example set `MAIL_BACKEND=mailgun` and sign up at [Mailgun](https://www.mailgun.com/) and then configure the domain name and key (you may also need to set `MAIL_BASE_URI` if your domain is not setup in EU, as the default `MAIL_BASE_URI` is set as `https://api.eu.mailgun.net/v3`). \n- SMTP is supported as well, through the following env vars \n```\nMAIL_SERVER (smtp domain of the mail server)\nMAIL_DOMAIN (the bit after the @ in your email)\nMAIL_USER\nMAIL_PASSWORD\nMAIL_FROM\nMAIL_PORT (optional)\nMAIL_SSL (optional)\n```\n- `UPLOADS_S3_BUCKET` and the related API key and secret for uploads. WARNING: If you want to store uploads in an object storage rather than directly on your server (which you probably want, to not run out of space), you need to configure that up front, otherwise URLs will break if you change it later. See `config/runtime.exs` for extra variables to set if you're not using the default service and region (which is [Scaleway](https://www.scaleway.com/en/object-storage/) Paris).","ref":"deploy.html#config-keys-you-should-pay-special-attention-to"},{"type":"extras","title":"Secret keys for which you should put random secrets. - Hosting guide","doc":"You can run `just secrets` to generate some for you.\n\n- `SECRET_KEY_BASE`\n- `SIGNING_SALT`\n- `ENCRYPTION_SALT`\n- `POSTGRES_PASSWORD`\n- `MEILI_MASTER_KEY`","ref":"deploy.html#secret-keys-for-which-you-should-put-random-secrets"},{"type":"extras","title":"Further information on config - Hosting guide","doc":"In the `./config/` (which is a symbolic link to the config of the flavour you choose to run) directory of the codebase, there are following config files:\n\n- `config.exs`: default base configuration, which itself loads many other config files, such as one for each installed Bonfire extension.\n- `prod.exs`: default extra configuration for `MIX_ENV=prod`\n- `runtime.exs`: extra configuration which is loaded at runtime (vs the others which are only loaded once at compile time, i.e. when you build a release)\n- `bonfire_*.exs`: configs specific to different extensions, which are automatically imported by `config.exs`\n\nYou should *not* have to modify the files above. Instead, overload any settings from the above files using env variables or in `./.env`. If any settings in the `.exs` config files are not available in env or in the instance settings UI, please open an issue or PR.","ref":"deploy.html#further-information-on-config"},{"type":"extras","title":"Running the app - Hosting guide","doc":"> NOTE: If you are running in a restricted environment such as Amazon RDS, you will need to execute some sql against the database before migrations can run: `CREATE EXTENSION IF NOT EXISTS citext;`\n\nBy default, the backend listens on port 4000 (TCP), so you can access it on http://localhost:4000/ (if you are on the same machine). In case of an error it will restart automatically.\n\nOnce you've signed up, you will automatically be an instance admin if you were the first to register.\n\n> You can sign up via CLI by entering something like this in your app's Elixir console: `Bonfire.Me.make_account_only(\"my@email.net\", \"my pw\")`","ref":"deploy.html#running-the-app"},{"type":"extras","title":"Handy commands - Hosting guide","doc":"- `just update` to update to the latest release of Bonfire \n- `just rel-run` Run the app in Docker, in the foreground\n- `just rel-run-bg` Run the app in Docker, and keep running in the background\n- `just rel-stop` Stop the running release\n- `just rel-shell` Runs a simple shell inside of the container, useful to explore the image \n\nOnce in the shell, you can run `bin/bonfire` with the following commands:\nUsage: `bonfire COMMAND [ARGS]`\n\nThe known commands are:\n- `start` Starts the system\n- `start_iex` Starts the system with IEx attached\n- `daemon` Starts the system as a daemon\n- `daemon_iex` Starts the system as a daemon with IEx attached\n- `eval \"EXPR\"` Executes the given expression on a new, non-booted system\n- `rpc \"EXPR\"` Executes the given expression remotely on the running system\n- `remote` Connects to the running system via a IEx remote shell\n- `restart` Restarts the running system via a remote command\n- `stop` Stops the running system via a remote command\n- `pid` Prints the operating system PID of the running system via a remote command\n- `version` Prints the release name and version to be booted\n\nThere are some useful database-related release tasks under `EctoSparkles.Migrator.` that can be run in an `iex` console (which you get to with `just rel.shell` followed by `bin/bonfire remote`, assuming the app is already running):\n\n- `migrate` runs all up migrations\n- `rollback(step)` roll back to step X\n- `rollback_to(version)` roll back to a specific version\n- `rollback_all` rolls back all migrations back to zero (caution: this means losing all data)\n\nYou can also directly call some functions in the code from the command line, for example:\n- to migrate: `docker exec bonfire_web bin/bonfire rpc 'Bonfire.Common.Repo.migrate'`\n- to just yourself an admin: `docker exec bonfire_web bin/bonfire rpc 'Bonfire.Me.Users.make_admin(\"my_username\")'`","ref":"deploy.html#handy-commands"},{"type":"extras","title":"Admin tools - Hosting guide","doc":"- LiveDashboard for viewing real-time metrics and logs at `/admin/system/`\n- Oban logs for viewing queued jobs (e.g. for processing federated activities) `/admin/system/oban_queues`\n- LiveAdmin for browsing data in the database at `/admin/system/data`\n- Orion for dynamic distributed performance profiling at `/admin/system/orion`\n- Web Observer as an alternative way to view metrics at `/admin/system/wobserver`","ref":"deploy.html#admin-tools"},{"type":"extras","title":"Troubleshooting - Hosting guide","doc":"Some common issues that may arise during deployment and our suggestions for resolving them.\n\n#### WebSocket connections not establishing behind a reverse proxy\n\nIf you are running Bonfire behind your own reverse proxy (e.g. nginx), you might experience issues with WebSocket connections not establishing. WebSocket connections require specific configuration to work, in nginx the following configuration is necessary for websockets to work:\n\n```\nlocation /live/websocket {\n proxy_pass http://127.0.0.1:4000;\n \n # these configurations are necessary to proxy WebSocket requests\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n}\n```","ref":"deploy.html#troubleshooting"},{"type":"extras","title":"Bonfire Changelog","doc":"# Bonfire Changelog\n\n## [0.3.5-beta (2022-09-23)]","ref":"changelog.html"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Coordination MVP [#445](https://github.com/bonfire-networks/bonfire-app/issues/445) by mayel & ivanminutillo\n- UI to enable/disable extensions in settings [#448](https://github.com/bonfire-networks/bonfire-app/issues/448) \n- Static page generator [#444](https://github.com/bonfire-networks/bonfire-app/issues/444) \n- Publish creation of sub-topic in the topic's feed [#439](https://github.com/bonfire-networks/bonfire-app/issues/439) by mayel","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Refactor navs/sidebars to use dynamic navigation & widgets provided by extensions [#447](https://github.com/bonfire-networks/bonfire-app/issues/447)","ref":"changelog.html#changed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- When I reply to a task, the activity in the feed does not show the parent activity [#449](https://github.com/bonfire-networks/bonfire-app/issues/449) \n- Use same composer for create post / topic / create a new list / create task\n\n## [0.3.4-beta.8 (2022-08-26)]","ref":"changelog.html#other"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Remember position in timeline [#392](https://github.com/bonfire-networks/bonfire-app/issues/392) by mayel\n- Should be able to click on a notification to see the related activity [#412](https://github.com/bonfire-networks/bonfire-app/issues/412) by mayel\n- Actions when someone clicks on follow/boost/like/reply buttons on a profile or feed while logged out [#441](https://github.com/bonfire-networks/bonfire-app/issues/441) \n- Combine duplicate posts [#396](https://github.com/bonfire-networks/bonfire-app/issues/396) by mayel","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- User preferences missing a consistent UX structure [#430](https://github.com/bonfire-networks/bonfire-app/issues/430) \n- Bug: pop-ups from compose box are hidden if close to edge [#394](https://github.com/bonfire-networks/bonfire-app/issues/394) \n- reset the CW field after posting [#378](https://github.com/bonfire-networks/bonfire-app/issues/378) \n- On mobile, there should be an obvious way to reply to a single post when viewing it by itself [#371](https://github.com/bonfire-networks/bonfire-app/issues/371) \n- Alerts and feedback messages need to adopt a solid pattern [#305](https://github.com/bonfire-networks/bonfire-app/issues/305)","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- i can't see what i'm typing past a certain amount of text. Like rivht now i dont' see what i'm typing. Might be some typos then^^ [#425](https://github.com/bonfire-networks/bonfire-app/issues/425) \n- Bug: When you switch user it *sometimes* stays on the switch user page [#377](https://github.com/bonfire-networks/bonfire-app/issues/377) by mayel","ref":"changelog.html#fixed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- Make push notification system more solid [#180](https://github.com/bonfire-networks/bonfire-app/issues/180) \n- Test/fix/improve graceful degradation (usage without JS, or without a LiveView websocket, i.e. when logged out) [#365](https://github.com/bonfire-networks/bonfire-app/issues/365) by mayel\n- use @prop in Surface views/components instead of e(assigns, :prop, default) and declare defaults in props or mount/1 [#414](https://github.com/bonfire-networks/bonfire-app/issues/414) \n\n\n## [0.3.4-beta.6 (2022-08-19)]","ref":"changelog.html#other"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- 3 options for smart input (sidebar, modal, floating) and improve responsive (modal on small screens) [#443](https://github.com/bonfire-networks/bonfire-app/issues/443) \n- Improve feeds async loading [#437](https://github.com/bonfire-networks/bonfire-app/issues/437) by mayel\n- Improve media/link attachments [#440](https://github.com/bonfire-networks/bonfire-app/issues/440)","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- Show and count only local users in user directory [#438](https://github.com/bonfire-networks/bonfire-app/issues/438) by mayel\n\n## [0.3.4 (2022-08-09)]","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Define & implement granular role & permission system for instance administration and moderation [#406](https://github.com/bonfire-networks/bonfire-app/issues/406) \n\n## [0.3.3 (2022-08-02)]","ref":"changelog.html#added"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Define & implement granular role & permission system for instance administration and moderation [#406](https://github.com/bonfire-networks/bonfire-app/issues/406) \n\n## [0.3.2 (2022-07-30)]","ref":"changelog.html#added"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Pagination topics list & feeds within topics [#431](https://github.com/bonfire-networks/bonfire-app/issues/431) \n- Check boundaries of a topic when tagging and if allowed auto-boost the tagged object in the topic's outbox [#428](https://github.com/bonfire-networks/bonfire-app/issues/428) \n- Show followed topics on a list [#424](https://github.com/bonfire-networks/bonfire-app/issues/424) \n- Topic settings [#423](https://github.com/bonfire-networks/bonfire-app/issues/423) \n- Topic activity preview [#422](https://github.com/bonfire-networks/bonfire-app/issues/422) \n- Browse topics [#421](https://github.com/bonfire-networks/bonfire-app/issues/421) \n- Tag something (eg. post/user) with a topic at any time (depending on boundaries) [#416](https://github.com/bonfire-networks/bonfire-app/issues/416) \n- Tag a post with a topic when writing a new post (or reply) [#415](https://github.com/bonfire-networks/bonfire-app/issues/415) \n- CRUD topics [#410](https://github.com/bonfire-networks/bonfire-app/issues/410) \n- Create a users directory [#159](https://github.com/bonfire-networks/bonfire-app/issues/159)","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Optimise LiveView rendering [#426](https://github.com/bonfire-networks/bonfire-app/issues/426) \n- Allow us to scroll from anywhere [#391](https://github.com/bonfire-networks/bonfire-app/issues/391)","ref":"changelog.html#changed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- Add unique key to encircle [#248](https://github.com/bonfire-networks/bonfire-app/issues/248) \n- Database Question [#3](https://github.com/bonfire-networks/activity_pub/issues/3) \n- Being able to change activity type from the composer [#429](https://github.com/bonfire-networks/bonfire-app/issues/429) \n- use created and extra_info mixins on Category [#433](https://github.com/bonfire-networks/bonfire-app/issues/433) \n- check boundaries for edit and archive topic [#434](https://github.com/bonfire-networks/bonfire-app/issues/434)","ref":"changelog.html#other"},{"type":"extras","title":"0.3.1-beta.9 (2022-07-22) - Bonfire Changelog","doc":"","ref":"changelog.html#0-3-1-beta-9-2022-07-22"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- BUG:Responsive, navigation goes under the mobile bottom tab [#420](https://github.com/bonfire-networks/bonfire-app/issues/420) by ivanminutillo","ref":"changelog.html#fixed"},{"type":"extras","title":"0.3.1-beta (2022-07-19) - Bonfire Changelog","doc":"","ref":"changelog.html#0-3-1-beta-2022-07-19"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Circles & flexible boundaries [#223](https://github.com/bonfire-networks/bonfire-app/issues/223) by mayel & ivanminutillo\n- Compose box at the bottom of the screen as an alternative to the standard microblogging input box [#419](https://github.com/bonfire-networks/bonfire-app/issues/419) \n- \"Compact layout\" in user preferences [#418](https://github.com/bonfire-networks/bonfire-app/issues/418) \n- Fetch metadata of links included in a post and show previews (of images, videos, etc) in feeds [#314](https://github.com/bonfire-networks/bonfire-app/issues/314)","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Pasting images into the editor should upload them [#411](https://github.com/bonfire-networks/bonfire-app/issues/411) \n- Bug: When starting from the feed page, clicking back would exit the site [#400](https://github.com/bonfire-networks/bonfire-app/issues/400) \n- /write page was missing the boundary selector [#398](https://github.com/bonfire-networks/bonfire-app/issues/398) \n- Keep me logged in [#395](https://github.com/bonfire-networks/bonfire-app/issues/395) \n- Font size is too small in compose window [#388](https://github.com/bonfire-networks/bonfire-app/issues/388) \n- UI: moved topbar in the header to sidebar [#362](https://github.com/bonfire-networks/bonfire-app/issues/362) \n- Improved responsive UI for use on small screens","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- Bug: some notifications / live feed updates were making all other activities in the feed disappear [#383](https://github.com/bonfire-networks/bonfire-app/issues/383) by mayel\n- Bug: followed/followers pages remained empty despite having followed people [#373](https://github.com/bonfire-networks/bonfire-app/issues/373) by mayel\n- Bug: followed activity missing the person (in main feeds) [#372](https://github.com/bonfire-networks/bonfire-app/issues/372) by mayel\n- Bug: follow notification clears the home feed except for the \"new follow\" post [#366](https://github.com/bonfire-networks/bonfire-app/issues/366) by mayel\n- Bug: images attached to a post should appear in the feed [#364](https://github.com/bonfire-networks/bonfire-app/issues/364)","ref":"changelog.html#fixed"},{"type":"extras","title":"Add a new widget","doc":"# Add a new widget\n\nWidgets are reusable components that encapsulate data and provide context-specific information to users based on the pages they are currently visiting. They are typically placed in the right sidebar ( refers to the [Design Guidelines](../topics/DESIGN.md) section to learn more about Bonfire user experience), and developers can define which widgets should appear on each page and in what order. \n\nDevelopers can include options for users to enable, disable, or rearrange the order of widgets when possible.\n\nA widget usually consists of a title and data formatted in various ways, such as links, data visualizations, actions, or information fetched from third-party apps. In this section, we will create a new widget that utilizes the user's location (if provided) and the [bonfire_geolocate](https://github.com/bonfire-networks/bonfire_geolocate) library to obtain the correct coordinates. These coordinates will then be used to retrieve the location's weather information using an external library. Additionally, we will create a setting that allows users to optionally include the widget on their profile.\n\nThis example is simple yet meaningful because it touches upon different parts of the Bonfire framework during the tutorial. The code for this widget is available [here](https://github.com/bonfire-networks/bonfire_geolocate/tree/main/lib/web/components/widgets).\n\n![weather widget](https://i.imgur.com/S6OaPGg.png)","ref":"add-a-new-widget.html"},{"type":"extras","title":"Let’s code! - Add a new widget","doc":"The first step is to identify the most appropriate extension for this widget. In this case, we can include the widget in the `bonfire_geolocate` extension, which already handles all the necessary logic for dealing with geolocations.\n\nWidgets are typically included in `lib/web/components/widgets`. Bonfire uses Surface on the frontend, so we'll create two files:\n\n- `widget_forecast_live.ex`\n- `widget_forecast_live.sface`\n\nThis forecast widget is a stateless component, meaning it won't handle any internal state. Therefore, the `widget_forecast_live.ex` code will be quite basic:\n\n```elixir\ndefmodule Bonfire.Geolocate.WidgetForecastLive do\n use Bonfire.UI.Common.Web, :stateless_component\n\n prop location, :string, default: nil\nend\n\n```\n\nWe use `:stateless_component`, a [function](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/web.ex#L543) that wraps the `Surface.Component` and includes a list of [helpers](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/web.ex#L575) widely used across most components.\n\nSince we want to include the widget on the user profile, we can gather the location data from there, so we define the `location` prop.\n\nWidgets are wrapped in a [WidgetBlockLive](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/components/widgets/widget_block_live.ex) component that takes care of injecting a style and the basic prop as the title. The initial implementation of our `widget_forecast_live.sface` looks like this:\n\n```elixir\n \n hello world\n \n\n```\n\nTo see our widget, we need to include it in a page. Widgets are included in our right sidebar and are defined within a prop called `sidebar_widgets`, which is a list that includes guest and user lists (respectively, the widgets to show when the user is visiting a page while not logged in or when the user is logged in).\n\nWe'll include our widget in the logged list, specifying it is in the secondary widget section. The final look of our `sidebar_widget` prop looks like this:\n\n```elixir\nsidebar_widgets = [\n users: [\n secondary: [\n Bonfire.Geolocate.WidgetForecastLive, [location: \"Naples, Italy\"]\n ]\n ]\n]\n\n```\n\nWe'll include our widget in the user profile page, located in the [Bonfire.UI.Me](https://github.com/bonfire-networks/bonfire_ui_me) extension, a library that deals with all the views related to user profiles and settings.\n\nThe `Bonfire.UI.Me.ProfileLive` [mount function](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/views/profile/profile_live.ex#L34) looks like:\n\n```elixir\n def mount(_params, _session, socket) do\n {:ok,\n socket\n |> assign(LiveHandler.default_assigns(is_nil(current_user_id(socket.assigns))))}\n end\n\n```\n\nThe `default_assigns` function includes data needed for dealing with multiple kinds of interactions and permissions. It also fetches the user from the database and ensures all the data is loaded correctly. The location data is fetched in [profiles_live_handler.ex:95](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/live_handlers/profiles_live_handler.ex#L95), and the widget is included in [profiles_live_handler.ex:274](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/live_handlers/profiles_live_handler.ex#L274).","ref":"add-a-new-widget.html#let-s-code"},{"type":"extras","title":"Adding Settings - Add a new widget","doc":"To ensure the user can decide whether they want to include the widget when visiting any user page, we're creating a new setting that optionally shows the widget based on user input.\n\nIn `profiles_live_handler.ex:274`, the widget is preceded by `weather_widget_enabled`, a boolean that controls whether the widget should be displayed or not. It makes use of the `Settings.get` function. You can learn more about defining and returning settings in our [Add an Extension Settings](/building/add-an-extension-settings.md) section.\n\nWe're adding the settings in the [edit_profile_info_live.sface](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/components/settings/profile/edit_profile_info_live.sface#L99) component (we may later refactor this to add the setting in the defined extension, but this is still a work in progress):\n\n```elixir\n \n \n \n\n```\n\nAt this point, we should be able to see our basic weather widget on our profile page and decide to switch it on and off.\n\nWhat remains is to include the logic for returning and displaying the weather. We will use the Forecastr library, which is already used in our application and added in the [bonfire](https://github.com/bonfire-networks/bonfire) extension.\n\nThe Forecastr library makes use of the Pirate Weather service, so we need a Pirate Weather API KEY. You can generate one on [pirateweather.net](http://pirateweather.net/) and add it at the bottom of your `.env` file:\n\n```elixir\nPIRATE_WEATHER_API=***********************\n\n```\n\nThe final component code looks like:\n\n```elixir\n{#if e(@location, nil)}\n \n {#case Forecastr.forecast(:today, e(@location, nil),\n units: :metric,\n renderer: Forecastr.Renderer.JSON\n )}\n {#match {:ok,\n %{\n \"description\" => weather,\n \"id\" => weather_id,\n \"temp\" => temp,\n \"name\" => weather_location\n }}}\n \n \n \n {temp}° \n {weather} \n \n \n {#match _}\n {/case}\n \n{/if}\n\n```","ref":"add-a-new-widget.html#adding-settings"},{"type":"extras","title":"Next Steps - Add a new widget","doc":"Although this weather widget is relatively basic, it significantly enhances the user experience by providing relevant metadata fetched from external services. This example demonstrates the potential for integrating additional information and functionality into widgets to create a more engaging and informative user interface.\nTo further improve this widget, developers can consider including more data points, such as:\n\n- Current moon position and phase\n- Daily amount of daylight hours\n- Sunrise and sunset times\n- Extended weather forecasts\n- Weather alerts and notifications\n\nBy incorporating these additional features, the widget can provide users with a more comprehensive overview of their location's weather and astronomical information, making it a valuable addition to their profile page.","ref":"add-a-new-widget.html#next-steps"},{"type":"extras","title":"Bonfire Navigation Sidebar","doc":"# Bonfire Navigation Sidebar","ref":"add-a-page-to-the-sidebar.html"},{"type":"extras","title":"Overview - Bonfire Navigation Sidebar","doc":"The Bonfire framework includes the navigation on the left sidebar, which can include pages from various extensions. Different navigation menus can be defined based on the current page (e.g., Explore and Settings pages have distinct menus).","ref":"add-a-page-to-the-sidebar.html#overview"},{"type":"extras","title":"Key Concepts - Bonfire Navigation Sidebar","doc":"1. Create new navigation menus\n2. Add pages to existing menus\n3. Override default navigation\n4. Use custom navigation components","ref":"add-a-page-to-the-sidebar.html#key-concepts"},{"type":"extras","title":"Creating a New Navigation Menu - Bonfire Navigation Sidebar","doc":"To create a new menu for your extension:\n\n1. Use the `declare_extension` macro in one of your extension views (typically the extension homepage).\n2. Configure your extension with options like name, icon, description, and navigation menu.\n\n```elixir\ndeclare_extension(\"Your Extension Name\",\n icon: \"🎆\",\n description: \"A short description to display in the extension settings\",\n default_nav: [\n ExtensionName.Path.YourPageLive,\n ExtensionName.Path.AnotherPageLive,\n # Add more pages as needed\n ]\n)\n```\n\n3. For each page in `default_nav`, use the `declare_nav_link` macro to define link properties:\n\n```elixir\ndeclare_nav_link(l(\"Your Page\"),\n page: \"your_page\",\n href: \"/your_page\",\n icon: \"ph:search\",\n icon_active: \"ph:search-fill\"\n)\n```","ref":"add-a-page-to-the-sidebar.html#creating-a-new-navigation-menu"},{"type":"extras","title":"Using the Default Navigation Menu - Bonfire Navigation Sidebar","doc":"To use the default navigation menu instead of your extension's menu:\n\n1. In each view's `mount` function, set the `nav_items` property:\n\n```elixir\ndef mount(params, session, socket) do\n {:ok,\n socket\n |> assign(\n nav_items: Bonfire.Common.ExtensionModule.default_nav()\n )\n }\nend\n```","ref":"add-a-page-to-the-sidebar.html#using-the-default-navigation-menu"},{"type":"extras","title":"Overriding Default Navigation with a Custom Menu - Bonfire Navigation Sidebar","doc":"To override the default navigation for specific pages:\n\n1. Create a custom navigation menu component.\n2. Use the `declare_nav_component(\"sidebar description\")` macro on the custom menu.\n3. In each view's `mount` function, set the `nav_items` property:\n\n```elixir\ndef mount(params, session, socket) do\n {:ok,\n socket\n |> assign(\n nav_items: [ExtensionName.Path.YourPageLive.declared_nav()]\n )\n }\nend\n```","ref":"add-a-page-to-the-sidebar.html#overriding-default-navigation-with-a-custom-menu"},{"type":"extras","title":"Add a new extension settings","doc":"# Add a new extension settings\n\nBonfire extensions can define settings that will be available to the users of the extension. These settings can be used to configure the behavior of the extension.\n\nTODO","ref":"add-an-extension-settings.html"},{"type":"extras","title":"Create a new extension","doc":"# Create a new extension\n \nExtensions in Bonfire are powerful tools that allow you to extend the functionality and features of your application.\nThis guide is perfect for developers who are looking to contribute new features or capabilities to the Bonfire ecosystem.\nBy the end of this page, you should have a solid understanding of how to develop and integrate a new extension in Bonfire, leveraging its modular architecture.","ref":"create-a-new-extension.html"},{"type":"extras","title":"Create your Bonfire extension - Create a new extension","doc":"1. To start building your own extension, you can utilise our custom mix generator task. Simply navigate to the Bonfire app root folder in your terminal and type:\n \n```\njust mix bonfire.extension.new *your_extension_name*\n```\n\nThis command creates a new directory in `./extensions` named `*your_extension_name*`, complete with all the necessary files and scaffolding.\n\n2. Add your extension to `./config/deps.flavour.path` (on a new line, it should look similar to `your_extension_name = \"extensions/your_extension_name\"`) to enable it locally.\n\n3. Once your new extension is set up, you're ready to dive into coding. Consider these possible steps to enhance your extension:\n\n- Implement extension-specific fake functions for testing purposes.\n- Create extension-specific [database migrations](https://hexdocs.pm/ecto_sql/Ecto.Adapters.SQL.html#module-migrations).\n- Add any dependencies you need to deps.git and/or deps.hex.\n- If your extension includes new pages, you need to link them in the main router. \n\n> #### Info {: .info}\n> Bonfire's Phoenix router module is found in the `bonfire` extension. Refer to the [Routing](/docs/building/routing.md) page to learn how to add new routes.\n\n\n4. After coding your initial features, create an empty repository on your preferred Git platform. Then, commit and push your local changes to make your work accessible and open for collaboration:\n\n```\ngit add .\ngit commit -m \"light my fire\"\ngit branch -M main\ngit remote add origin [your-remote-repository-url]\ngit push -u origin main\n```\n\n5. When you're ready for other people upstream to use your extension, add it to `./config/deps.git` (including the branch name).\n\nAnd just like that, you've successfully created and prepared your first Bonfire extension and shared with the community 🔥","ref":"create-a-new-extension.html#create-your-bonfire-extension"},{"type":"extras","title":"Create a new page","doc":"# Create a new page\n\nTODO","ref":"create-a-new-page.html"},{"type":"extras","title":"Make changes to an extension","doc":"# Make changes to an extension\n \nThis tutorial guides you through the process of editing an existing Bonfire extension. We'll cover how to clone, enable, and contribute to an extension, ensuring you can test and implement your changes effectively.\nIdeal for developers looking to modify and enhance Bonfire's functionalities.\nBy the end, you'll be adept at including and working with extensions in the Bonfire development environment.\n\n \nIn Bonfire, in order to edit an existing extension and test the changes you need to set up the extension in your development environment. The process is quite straightforward:","ref":"edit-an-existing-extension.html"},{"type":"extras","title":"Fork the extension - Make changes to an extension","doc":"If you want to share your changes to the extension, you may want to first fork it on Github.\n\nUse `just dep-clone-local *[dep]* *[repo]*` to clone an extension from its Git repository. Replace dep with the extension name and repo with the full URL of your fork. The cloned extension will be cloned in `./extensions`:\n \n```\njust dep-clone-local bonfire_social https://github.com/bonfire-networks/bonfire_social\n```","ref":"edit-an-existing-extension.html#fork-the-extension"},{"type":"extras","title":"Enable the extension - Make changes to an extension","doc":"After cloning, choose to use the local version by editing `./config/deps.flavour.path` (create the file in the `./flavours/[flavour]/config/` directory if it doesn’t exist). \nThe format to follow is the following: `dep_name = \"dep_path\"`.\nTo disable a local extension, comment or delete its line in `./config/deps.flavour.path`.\nUse just dev to run the app with changes hot-reloading.\n\n```\n# ./config/deps.flavour.path\nbonfire_me = \"./extensions/bonfire_me\"\n# bonfire_boundaries = \"./extensions/bonfire_boundaries\" # disabled local copy\n```","ref":"edit-an-existing-extension.html#enable-the-extension"},{"type":"extras","title":"Make and test your changes - Make changes to an extension","doc":"You can now make your edits to the `./extensions`, run the app with `just dev` and run tests with `just test-watch`.","ref":"edit-an-existing-extension.html#make-and-test-your-changes"},{"type":"extras","title":"Push changes - Make changes to an extension","doc":"You can push your changes remotely, use Bonfire's helpers like `just contrib` if you need to commit files that belong to multiple extensions or `just update-dep *dep*` for a specific one (e.g.` just update-dep bonfire_me`).","ref":"edit-an-existing-extension.html#push-changes"},{"type":"extras","title":"Great works 🎉🎉🎉 - Make changes to an extension","doc":"You're now equipped to contribute to Bonfire extensions, enhancing the framework's capabilities. You can do so by opening a PR on Github from your forked extension. Your contributions are vital to the Bonfire community, and we encourage you to keep exploring and improving the project.","ref":"edit-an-existing-extension.html#great-works"},{"type":"extras","title":"What is a Bonfire extension","doc":"# What is a Bonfire extension\n\nExtensions in Bonfire are collections of code that introduce new features and enhance the platform's functionality, or explore a different user experience for an existing feature.\n\nThey can range from adding entirely new pages, such as [bonfire_invite_links]() which lets admins create and share invites with usage limit and expiration date, to implementing specific components or widgets.\nAn example is [bonfire_editor_milkdown](), which integrates a markdown-first editor for publishing activities.\n\nExtensions are versatile, they can implement their own schema, database, logic, and components, or they can leverage existing fields, context functions, and UI components, or more commonly, a combination of both.","ref":"extensions-overview.html"},{"type":"extras","title":"Using extensions - What is a Bonfire extension","doc":"In order to make changes to extensions, you need to clone them locally. As you may imagine, we have a `just` command for that.\n\n```\njust dep-clone-local **[extension name]** **[extension url]**\n```\n\nThis command (eg. `just dep-clone-local bonfire_ui_social https://github.com/bonfire-app/bonfire_ui_social`) will create a local copy of the extension in `./extensions/bonfire_ui_social`.\n\nIf the extension is enabled locally, you will see an entry in `config/deps.flavour.path` with the path to the local extension: \n\n```\nbonfire_ui_social = \"extensions/bonfire_ui_social\"\n```\n\nIf you want to disable the extension, you can remove the entry from `config/deps.flavour.path`\n\n> #### Info {: .info}\n>\n> `config/deps.flavour.path` is a symlink of the file `flavours/[flavour]/deps.flavour.path`. Ensure this file exist in the flavour you are working on, or create one to begin use your extensions locally.\n\n\nWhen the extension is enabled, Bonfire will use the code in `extensions/` instead of the one in `deps/`.\n\nWe will dive more into the creation and the lifecycle of extensions in the next sections.","ref":"extensions-overview.html#using-extensions"},{"type":"extras","title":"Extension helpers - What is a Bonfire extension","doc":"Given Bonfire modularity, you will likely find yourself combining functions from several extensions when using the framework.\nA significant portion of its codebase is included in extensions, each serving specific purposes.\nMoreover, extensions often utilise code from other extensions.\nFor instance, [bonfire_common](https://github.com/bonfire-networks/bonfire_common) and [bonfire_ui_common](https://github.com/bonfire-networks/bonfire_ui_common) provide a suite of helpers to ease a good amount of tasks.\n\nWhen using extensions functions, we need a way to ensure the app will not break if the extension is not enabled.\n\nBonfire provides a few built-in components that allows users to optionally inject components or functions from different extensions.\n\n`Bonfire.Common.Utils.maybe_apply`\n\n- Helpers for calling hypothetical functions in other modules. Returns the result of calling a function with the given arguments, or the result of fallback function if the primary function is not defined (by default just logging an error message).\n\n```elixir\nBonfire.Common.Utils.maybe_apply(Bonfire.Social.Graph, :maybe_applications, [],\n fallback_return: []\n )\n```\n\n`Bonfire.UI.Common.Modular.StatefulComponent`\n\n- A built-in component that allows users to optionally inject dynamic live components into a Surface template.\n Based on `Surface.Components.Dynamic.LiveComponent` to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.\n\n```elixir\n \n```\n\n`Bonfire.UI.Common.Modular.StatelessComponent`\n\n- A built-in component that allows users to optionally inject dynamic functional components into a Surface template.\n Based on `Surface.Components.Dynamic.Component` to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.\n\n```elixir\n \n```","ref":"extensions-overview.html#extension-helpers"},{"type":"extras","title":"Project structure","doc":"# Project structure\n\nTODO","ref":"project-structure.html"},{"type":"extras","title":"Routing","doc":"# Routing\n\nThe Bonfire routing system provides a modular and extensible way to define routes for different parts of your application. \nIt allows developers to include routes directly from their extensions based on their availability and configuration. \nThe routes are organized into pipelines and scopes to handle authentication and authorization requirements.\n\nThe Router module is declared in the [router.ex](https://github.com/bonfire-networks/bonfire/blob/main/lib/web/router.ex) file in the [bonfire](https://github.com/bonfire-networks/bonfire) extension.\n\nThe `Bonfire.Web.Router.Routes` module defines all the routes for active Bonfire extensions that will be included in the Bonfire app. It also includes routes for GraphQl and AcitvityPub specific endpoints.\n\n\nIn order to add a new route to Bonfire, you need to create a Routes module in your extension. It is usually named as `Project.ExtensionName.Web.Routes` eg. [Bonfire.UI.Social.Routes](https://github.com/bonfire-networks/bonfire_social/blob/main/lib/bonfire_social_web/routes.ex)\n\nThe Routes file follows the standard Phoenix/Liveview syntax and structure.","ref":"routing.html"},{"type":"extras","title":"Add a new route - Routing","doc":"To add a new routes to the Router, you need to add include it to the main Router. \n\n> #### Info {: .info}\n>\n> At the moment, you need a workaround to be able to enable the `bonfire` dependency locally: clone it in your `./extensions` folder and then add it to your` deps.flavour.path` file.\n\nOnce you have the `bonfire` dep enabled locally, include your new extension router with `use_if_enabled(Project.ExtensionName.Web.Routes)` in the [Bonfire.Web.Router.Routes](https://github.com/bonfire-networks/bonfire/blob/main/lib/web/router.ex) file.","ref":"routing.html#add-a-new-route"},{"type":"extras","title":"What is a Bonfire flavour?","doc":"# What is a Bonfire flavour?","ref":"what-is-flavour.html"},{"type":"extras","title":"Working with flavour","doc":"# Working with flavour\n\ntest","ref":"working-with-flavour.html"},{"type":"extras","title":"Bonfire Architecture","doc":"# Bonfire Architecture","ref":"architecture.html"},{"type":"extras","title":"Hacking - Bonfire Architecture","doc":"Bonfire is an unusual piece of software, developed in an unusual way. It originally started as a project to create a generic federation library/framework, while building an app for educators to share and collaborate on learning resources with their peers, and has been forked and evolved a lot since then. \n\nHacking on it is actually pretty fun. The codebase has a unique feeling to work with and we've relentlessly refactored to manage the ever-growing complexity that a distributed social networking toolkit implies. That said, it is not easy to understand without context, which is what this document is here to provide.","ref":"architecture.html#hacking"},{"type":"extras","title":"Design Decisions - Bonfire Architecture","doc":"Feature goals:\n\n- Flexibility for developers and users.\n- Extreme configurability and extensibility.\n- Integrated federation with the existing fediverse.\n\nOperational goals:\n\n- Easy to set up and run.\n- Light on resources for small deployments.\n- Scalable for large deployments.","ref":"architecture.html#design-decisions"},{"type":"extras","title":"Stack - Bonfire Architecture","doc":"Our main implementation language is [Elixir](https://www.elixir-lang.org/), which is designed for building reliable systems. We have almost [our own dialect](./BONFIRE-FLAVOURED-ELIXIR.md).\n\nWe use the [Phoenix](https://www.phoenixframework.org/) web framework with [LiveView](https://hexdocs.pm/phoenix_live_view/) and [Surface](https://surface-ui.org/documentation) for UI components and views.\n\nSurface is a different syntax for LiveView that is designed to be more convenient and understandable to frontend developers, with extra compile time checks. Surface views and components are compiled into LiveView code (so once you hit runtime, Surface in effect doesn't exist any more).\n\nSome extensions use the [Absinthe](https://absinthe-graphql.org/) GraphQL library to expose an API.","ref":"architecture.html#stack"},{"type":"extras","title":"The Bonfire Environment - Bonfire Architecture","doc":"We like to think of bonfire as a comfortable way of developing software - there are a lot of conveniences built in once you know how they all work. The gotcha is that while you don't know them, it can be a bit overwhelming. Don't worry, we've got your back.","ref":"architecture.html#the-bonfire-environment"},{"type":"extras","title":"Code Structure - Bonfire Architecture","doc":"The code is broadly composed namespaces such as these, many of which are packaged as \"extensions\" which live in separate git repositories, which are included in the app by way of mix dependencies:\n\n- `Bonfire.*` - Core application logic (very little code).\n- `Bonfire.*.*` - Bonfire extensions (eg `Bonfire.Posts`) containing mostly context modules, APIs, and routes\n- `Bonfire.Data.*` - Extensions containing database schemas and migrations \n- `Bonfire.UI.*` - UI component extensions\n- `Bonfire.*.*.LiveHandler` - Backend logic to handle events in the frontend\n- `Bonfire.Editor.*` (pluggable text editors, eg. CKEditor for WYSIWYG markdown input)\n- `Bonfire.GraphQL.*` - Optional GraphQL API\n- `Bonfire.Federate.*` - Optional Federation hooks\n- `ActivityPub` - ActivityPub S2S models, logic and various helper modules \n- `ActivityPub.Web` - ActivityPub S2S REST endpoints, activity ingestion and push federation facilities \n- `ValueFlows.*` - economic extensions implementing the [ValueFlows vocabulary](https://www.valueflo.ws)\n\n\nContexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. `Bonfire.Posts` implements `Bonfire.Data.Social.Post`). \n\nAll Bonfire objects use an ULID as their primary key. We use the `Needle` library (with extra logic in `Bonfire.Common.Needles`) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see `Bonfire.Data.Social.Follow`) for an example.\n\nContext modules usually have `one/2`, `many/2`, and `many_paginated/1` functions for fetching objects, which in turn call a `query/2` function. These take a keyword list as filters (and an optional `opts` argument) allowing objects to be fetched by arbitrary criteria.\n\nExamples:\n\n```\nUsers.one(username: \"bob\") # Fetching by username\nPosts.many_paginated(by: \"01E9TQP93S8XFSV2ZATX1FQ528\") # List a page of posts by its author\nEconomicResources.many(deleted: true) # List any deleted resources\n```\n\nContext modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.\n\nHere is an incomplete sample of some of current extensions and modules:\n\n- `Bonfire.Me.Accounts` (for managing and querying local user accounts)\n- `Bonfire.Me.Users` (for managing and querying both local and remote user identities and profiles)\n- `Bonfire.Boundaries` (for managing and querying circles, ACLs, permissions...)\n- `Bonfire.Social.FeedActivities`, `Bonfire.Social.Feeds` and `Bonfire.Social.Activities` (for managing and querying activities and feeds)\n- `Bonfire.Posts` and `Bonfire.Social.PostContents` (for managing and querying posts)\n- `Bonfire.Social.Threads` (for managing and querying threads and comments)\n- `Bonfire.Social.Flags` (for managing and querying flags)\n- `Bonfire.Social.Graph.Follows` (for managing and querying follows)\n- `Bonfire.Classify` (for managing and querying categories, topics, and the like)\n- `Bonfire.Tag` (for managing and querying tags and mentions)\n- `Bonfire.Geolocate` (for managing and querying locations and geographical coordinates)\n- `Bonfire.Quantify` (for managing and querying units and measures)\n\n#### Additional extensions, libraries, and modules\n\n- `Bonfire.Common` and `Bonfire.Common.Utils` (stuff that gets used everywhere)\n- `Bonfire.Application` (OTP application)\n- `Bonfire.Me.Characters` (a shared abstraction over users, organisations, categories, and other objects that need to have feeds and behave as an actor in ActivityPub land)\n- `Bonfire.Federate.ActivityPub` and `ActivityPub` (ActivityPub integration)\n- `Bonfire.Search` (local search indexing and search API, powered by Meili)\n- `Bonfire.Mailer`, `Bonfire.Me.Mails`, and `Bamboo` (for rendering and sending emails)\n- `Bonfire.Files`, `Waffle`, `TreeMagic` and `TwinkleStar` (for managing uploaded content)\n- `Bonfire.GraphQL` (GraphQL API abstractions)\n- `Queery` and `Bonfire.Repo.Query` (Helpers for making queries on the database)\n- `Bonfire.Repo` (Ecto repository)\n- `Exto` (to extend DB schemas in config, especially useful for adding associations)\n- `AbsintheClient` (for querying the API from within the server)","ref":"architecture.html#code-structure"},{"type":"extras","title":"General structure - Bonfire Architecture","doc":"- Bonfire app\n - A [flavour](../README.md#flavours) running `Bonfire.Application` as supervisor\n - Configs assembled from extensions at `flavour/$FLAVOUR/config`\n - Phoenix at `Bonfire.Web.Endpoint`\n - Routes assembled from extensions at `Bonfire.Web.Router` \n - GraphQL schema assembled from extensions at `Bonfire.GraphQL.Schema`\n - Database migrations assembled from extensions at `flavour/$FLAVOUR/repo/migrations`\n - Data seeds assembled from extensions at `flavour/$FLAVOUR/repo/seeds`\n - Extensions and libraries as listed in `flavour/$FLAVOUR/config/deps.*`\n - Extensions defining schemas and migrations (usually `Bonfire.Data.*`)\n - Schemas\n - Migrations defined as functions in the schema modules in `lib/`\n - Migration templates calling those functions in `priv/repo/migrations` which are then copied into an app flavour's migrations\n - Extensions implementing features or groups of features (eg. `Bonfire.Me`)\n - Config template which is then copied into an app flavour's config (eg `config/bonfire_me.exs`)\n - Contexts (eg `Bonfire.Me.Users`)\n - Sometimes LiveHandlers for handling frontend events in the backend (eg `Bonfire.Me.Users.LiveHandler`)\n - Routes (eg `Bonfire.UI.Me.Routes`)\n - Controllers and/or Views (eg `Bonfire.UI.Me.CreateUserController` and `Bonfire.UI.Me.CreateUserLive`)\n - API (eg `Bonfire.Me.API.GraphQL`), refer to [GraphQL API documentation](./GRAPHQL.md)\n - Schemas\n - Resolvers\n - Sometimes Plugs (eg `Bonfire.Web.Plugs.UserRequired` and `Bonfire.Web.LivePlugs.UserRequired`)\n - Other extensions or libraries (eg `Needle` or `Bonfire.Common` which are used by most other extensions)","ref":"architecture.html#general-structure"},{"type":"extras","title":"Naming - Bonfire Architecture","doc":"It is said that naming is one of the four hard problems of computer science (along with cache management and off-by-one errors). We don't claim our scheme is the best, but we do strive for consistency.","ref":"architecture.html#naming"},{"type":"extras","title":"Naming guidelines - Bonfire Architecture","doc":"- Module names mostly begin with `Bonfire.` unless they belong to a more generic library (eg `Needle` or `ValueFlows`)\n- Everything within an extension begins with the context name and a `.` (eg `Bonfire.Social.Migrations`)\n- Database schemas should be named in the singular (eg `Bonfire.Data.Social.Post`)\n- Context modules are named in plural where possible (eg `Bonfire.Posts`)\n- Other modules within a context begins with the context name and a `.` (eg `Bonfire.Posts.LiveHandler`)\n- Modules use UpperCamelCase while functions use snake_case\n- Acronyms in module names should be all uppercase (eg `Bonfire.Social.APActivities`)","ref":"architecture.html#naming-guidelines"},{"type":"extras","title":"Federation libraries - Bonfire Architecture","doc":"### `ActivityPub`\n\nThis namespace handles the ActivityPub logic and stores AP activities. It is largely adapted Pleroma code with some modifications, for example merging of the activity and object tables and new actor object abstraction.\n\n- `ActivityPub` contains the main API and is documented there. \n- `ActivityPub.Federator.Adapter` defines callback functions for the AP library.\n\nIt also contains some functionality that isn't part of the AP spec but is required for federation:\n- `ActivityPub.Safety.Keys` - Generating and handling RSA keys and signatures \n- `ActivityPub.Federator.WebFinger` - Implementation of the WebFinger protocol\n- `ActivityPub.Federator.HTTP` - Module for making HTTP requests (wrapper around tesla)\n- `ActivityPub.Instances` - Module for storing reachability information about remote instances\n\nAlso refer to [MRF documentation](./MRF.md) to learn how to rewrite or discard messages.\n\n### `ActivityPub.Web`\n\nThis namespace contains the ActivityPub Server-to-Server REST API, the activity ingestion pipeline (`ActivityPub.Federator.Transformer`) and the push federation facilities (`ActivityPub.Federator`, `ActivityPub.Federator.APPublisher` and others). The outgoing federation module is designed in a modular way allowing federating through different protocols in the future.","ref":"architecture.html#federation-libraries"},{"type":"extras","title":"ActivityPub integration with Bonfire's application logic - Bonfire Architecture","doc":"The callback functions defined in `ActivityPub.Federator.Adapter` are implemented in `Bonfire.Federate.ActivityPub.Adapter`. \n\nWhen implementing federation for a new object type it needs to be implemented for both directions: \nfor outgoing federation using the hooks in `Bonfire.Federate.ActivityPub.Outgoing` and for incoming federation using the hooks in `Bonfire.Federate.ActivityPub.Incoming`.","ref":"architecture.html#activitypub-integration-with-bonfire-s-application-logic"},{"type":"extras","title":"Bonfire-flavoured Elixir","doc":"# Bonfire-flavoured Elixir\n\nBonfire has a few libraries that are widely used in the codebase and make writing Elixir feel a little bit different. To help you get less confused by this, here's a guide on what we can call \"bonfire-flavoured elixir\"!\n\nPlease note this guide assumes you already know [Elixir](https://elixir-lang.org/getting-started/introduction.html).\n\n## `Arrows`\n\nThe Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). Here is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"bonfire-flavoured-elixir.html"},{"type":"extras","title":"Ok-pipe - Bonfire-flavoured Elixir","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.","ref":"bonfire-flavoured-elixir.html#ok-pipe"},{"type":"extras","title":"Untangle - Bonfire-flavoured Elixir","doc":"`Untangle` provides replacements for the macros in Elixir's `Logger` module and the `IO.inspect` function to output code location information. The first argument will be `inspect`ed and the second (where provided) will be used as a label:\n\n```\niex(1)> import Untangle\nUntangle\niex(2)> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\niex(3)> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes slightly more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for\ninserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!\n\nYou will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.","ref":"bonfire-flavoured-elixir.html#untangle"},{"type":"extras","title":"Error handling - Bonfire-flavoured Elixir","doc":"`Bonfire.Fail` is an `Exception` handler, which you can use to stop the show anywhere in the code, e.g:\n\n`id = uid(object) || raise(Bonfire.Fail, :not_found)` \n\nYou can use this special exception when you want to redirect the user to the login page rather than just show an error:\n`user = current_user(assigns) || raise(Bonfire.Fail.Auth, :needs_login)` \n\nAdvantages include:\n\n- standardised error messages (defaults are defined at https://github.com/bonfire-networks/bonfire_fail/blob/main/lib/runtime_config.ex#L16) which can be overridden in your app's config using `config :bonfire_fail, :common_errors`\n- friendly error messages are defined in one place, which means no duplicated localisation efforts\n- uses the elixir/OTP pattern of \"let it crash\"\n- returns the correct HTTP code when applicable\n- no need to wrap blocks in if/else or the like \n- for users of the LiveView frontend, this will make the corresponding friendly error message appear in a flash overlay (if using `Bonfire.UI.Common.LiveHandlers` and/or `Bonfire.UI.Common.undead/3`)","ref":"bonfire-flavoured-elixir.html#error-handling"},{"type":"extras","title":"Design Guidelines","doc":"# Design Guidelines\n\nTODO","ref":"design.html"},{"type":"extras","title":"Just commands","doc":"# Just commands\n\nWelcome to this guide on navigating the world of Bonfire development, is crafted especially for people taking their first steps in Bonfire or looking to refine their workflow.","ref":"just.html"},{"type":"extras","title":"General Setup Related Commands - Just commands","doc":"As you dive into developing your own extension or app with the Bonfire framework, you'll quickly encounter an array of dependencies and extensions to deal with. An extension that uses a function or a component from a different extension is not an exception, but rather a common pattern.\n\nThis setup means you might likely soon find yourself contributing to multiple extensions simultaneously. Navigating this landscape can be intimidating at first, but Bonfire provides tools to streamline the process.\n\nThey help you effortlessly synchronize the latest updates across different extensions or efficiently push your updates to all relevant repositories. Understanding these facilities is key to a smooth and productive development experience in the Bonfire ecosystem.\n \nMost of these tools are driven by [just](https://github.com/casey/just#just) and their code can be seen in the [justfile](https://github.com/bonfire-networks/bonfire-app/blob/main/justfile) (which is quite similar to a `Makefile`). Below is a small selection of the most used commands.\n \n \n \n`just`\n- Print a list of all possible `just` commands a short explanation for each. \n\n`just update`\n- Update the app and all extensions/forks, and run migrations. Use this command to ensure you're in sync with the most recent changes across your development environment. \n\n`just update-app`\n- This command updates the app along with Bonfire extensions located in `./deps`. It's ideal for updating the app while excluding the extensions currently under development located in `./extensions`.\n\n`just dep-clone *[dep]* *[repo]*`\n- Clone a git dependency and use the local version, eg: `just dep-clone-local bonfire_me https://github.com/bonfire-networks/bonfire_me`. Active extensions need to be added in `./config/deps.path` (see [the tutorial on how to fork an extension](/courses/how_to_fork_extension/)). To switch between local and remote dependencies, simply comment or uncomment the corresponding lines in this file.\n\n`just contrib`\n- Push all changes to the app and extensions in `./forks` and `./extensions`.\n\n`just contrib-release`\n- Push all changes to the app and extensions in `./forks`, increment the app version number, and push a new version/release\n\n`just test`\n- Run tests of all extensions, or only specific tests, eg: `just test extensions/bonfire_social` or `just test extensions/bonfire_social/test/social/boosts_test.exs`\n\n`just test-watch *[path]*`\n- Run stale tests, and wait for changes to any module code, and re-run affected tests. \n\n`just test-federation-in-extensions *[path]*`\n- Test federation integration in your extension.","ref":"just.html#general-setup-related-commands"},{"type":"extras","title":"Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"# Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto\n\n> One foreign key to rule them all and in the darkness, bind them. - Gandalf, paraphrased.\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle)](https://hex.pm/packages/needle)\n[hexdocs](https://hexdocs.pm/needle)","ref":"Needle.html"},{"type":"extras","title":"Intro - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Bonfire uses the excellent PostgreSQL database for most data storage. PostgreSQL allows us to make a wide range of queries and to make them relatively fast while upholding data integrity guarantees.\n\nPostgres is a relational schema-led database - it expects you to pre-define tables and the fields in each table (represented in tabular form, i.e. as a collection of tables with each table consisting of a set of rows and columns). Fields can contain data or a reference to a row in another table. \n\nThis usually means that a field containing a reference has to be pre-defined with a foreign key pointing to a specific field (typically a primary key, like an ID column) *in a specific table*. \n\nA simple example would be a blogging app, which might have a `post` table with `author` field that references the `user` table.\n\nA social network, by contrast, is actually a graph of objects. Objects need to be able to refer to other objects by their ID without knowing their type. \n\nA simple example would be likes, you might have a `likes` table with `liked_post_id` field that references the `post` table. But you don't just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add `liked_video_id`, `liked_image_id`, etc?\n\nWe needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Needle`.\n\nThis guide is a brief introduction to Needle. It assumes some foundational knowledge:\n\n* Basic understanding of how relational databases like Postgresql work, in particular:\n * Tables being made up of fields.\n * What a primary key is and why it's useful.\n * Foreign keys and relationships between tables (1 to 1, 1 to Many, Many to 1, Many to Many).\n * Views as virtual tables backed by a SQL query.\n\n* Basic understanding of Elixir (enough to follow the examples).\n* Basic working knowledge of the [Ecto](https://hexdocs.pm/ecto/Ecto.html) database library (schema and migration definitions)","ref":"Needle.html#intro"},{"type":"extras","title":"What is Needle? - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"A means of foreign keying many tables in one field. Designed for highly interlinked data in highly dynamic schemata where tracking all the foreign keys is neither desired nor practical.\n\n> A universal foreign key is actually a hard problem. Many approaches are on offer with a variety of tradeoffs. If plugging into Bonfire's Needle-based core extensions isn't a requirement for you (i.e. you don't need to put things into feeds or use boundaries for access-control) should carefully consider a variety of approaches rather than just blindly adopting the one that fitted our project's needs the best!","ref":"Needle.html#what-is-needle"},{"type":"extras","title":"Identifying objects - the UID type - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"All referenceable objects in the system have a unique ID (primary key) whose type is the `Needle.UID`. `UUIDv7` and [ULIDs](https://github.com/ulid/spec) are a lot like standard `UUID` in that you can generate unique ones independently of the database. It's also a little different, being made up of two parts:\n\n* The current timestamp, to millisecond precision.\n* Strong random padding for uniqueness.\n\nThis means that it naturally sorts by time to the millisecond (close enough for us), giving us a performance advantage compared to queries ordered by a separate creation datetime field (by contrast, UUIDv4 is randomly distributed).\n\nIf you've only worked with integer primary keys before, you are probably used to letting the database dispense an ID for you. With `ULID` (or `UUID`), IDs can be known *before* they are stored, greatly easing the process of storing a graph of data and allowing us to do more of the preparation work outside of a transaction for increased performance.\n\nIn PostgreSQL, we actually store `UUIDv7` and `ULID`s as `UUID` columns, thanks to both being the same size (and the lack of specific column types shipping with postgresql). You mostly will not notice this because it's handled for you, but there are a few places it can come up:\n\n* Ecto debug and error output may show either binary values or UUID-formatted values.\n* Hand-written SQL may need to convert table IDs to the `UUID` format before use.","ref":"Needle.html#identifying-objects-the-uid-type"},{"type":"extras","title":"It's just a table - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The `Needle` system is mostly based around a single table represented by the `Needle.Pointer` schema with the following fields:\n\n* `id` (UID) - the database-wide unique id for the object, primary key.\n* `table_id` (UID) - identifies the type of the object, references `Needle.Table`.\n* `deleted_at` (timestamp, default: `null`) - when the object was deleted.\n\nEvery object that is stored in the system will have a record in this table. It may also have records in other tables (handy for storing more than 3 fields about the object!).\n\nA `Table` is a record of a table that may be linked to by a pointer. A `Pointer` is a pointer ID and a table ID.\nWith these two ingredients, we can construct a means of pointing to any table that has a `Table` entry.\n\nBut don't worry about `Needle.Table` for now, just know that every object type will have a record there so `Needle.Pointer.table_id` can reference it.","ref":"Needle.html#it-s-just-a-table"},{"type":"extras","title":"Installation - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.InitPointers do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up(), do: inits(:up)\n def down(), do: inits(:down)\n\n defp inits(dir) do\n init_pointers_ulid_extra(dir) # this one is optional but recommended\n init_pointers(dir) # this one is not optional\n end\nend\n```\n\n> Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.","ref":"Needle.html#installation"},{"type":"extras","title":"Declaring Object Types - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#declaring-object-types"},{"type":"extras","title":"Picking a table id - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The first step to declaring a new type is picking a unique table ID in UID format. \n\nYou could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.\n\nFor example, the ID for the `Feed` table is: `1TFEEDS0NTHES0V1S0FM0RTA1S`, which can be read as \"It feeds on the souls of mortals\". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:\n\n* The alphabet is [Crockford's Base32](https://en.wikipedia.org/wiki/Base32#Crockford's_Base32).\n* They must be 26 characters in length.\n* The first character must be a digit in the range 0-7.\n\nTo help you with this, the `Needle.UID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:\n\n```\niex(1)> Needle.UID.synthesise!(\"itfeedsonthesouls\")\n\n11:20:28.299 [error] Too short, need 9 chars.\n:ok\niex(2)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortalsandothers\")\n\n11:20:31.819 [warn] Too long, chopping off last 9 chars\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(3)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortals\")\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(4)> Needle.UID.synthesise!(\"gtfeedsonthesoulsofmortals\")\n\n11:21:03.268 [warn] First character must be a digit in the range 0-7, replacing with 7\n\"7TFEEDS0NTHES0V1S0FM0RTA1S\"\n```","ref":"Needle.html#picking-a-table-id"},{"type":"extras","title":"Virtual pointables (\"virtuals\") - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"`Needle.Virtual` is the simplest and most common type of object. Here's a definition of block:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block do\n\n use Needle.Virtual,\n otp_app: :bonfire_data_social,\n table_id: \"310CK1NGSTVFFAV01DSSEE1NG1\",\n source: \"bonfire_data_social_block\"\n\n alias Bonfire.Data.Edges.Edge\n\n virtual_schema do\n has_one :edge, Edge, foreign_key: :id\n end\nend\n```\n\nIt should look quite similar to a mixin definition, except that we `use` `Needle.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.\n\nThe primary limitation of a virtual is that you cannot put extra fields on it. This also means that `belongs_to` is not generally permitted because it results in adding a field, while `has_one` and `has_many` work just fine as they do not cause the creation of fields in the schema.\n\nThis is not usually a problem, as extra fields can be put into [mixins](mixins-storing-data-about-objects) or [multimixins](#multimixins) as appropriate.\n\nIn all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.\n\n> Under the hood, a virtual has a writable view (in the above example, called `bonfire_data_social_block`). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the `pointers` table for you transparently. When you delete from the view, the corresponding `pointers` entry is marked deleted for you.\n\n> Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).","ref":"Needle.html#virtual-pointables-virtuals"},{"type":"extras","title":"Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The other, lesser used, type of object is called the `Needle.Pointable`. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.\n\n> When a record is inserted into a pointable table, a copy is made in the `pointers` table for you transparently. When you delete from the table, the the corresponding `pointers` entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.\n\nPointables pay for this flexibility by being slightly more expensive than virtuals:\n\n* Records must be inserted into/deleted from two tables (the pointable's table and the `pointers` table).\n* The pointable table needs its own primary key index.\n\nThe choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.\n\nHere is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity do\n\n use Needle.Pointable,\n otp_app: :bonfire_data_social,\n table_id: \"30NF1REAPACTTAB1ENVMBER0NE\",\n source: \"bonfire_data_social_apactivity\"\n\n pointable_schema do\n field :json, :map\n end\nend\n```\n\n\n> As you can see, to declare a pointable schema, we start by using `Needle.Pointable`, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.\n\n> We then call `pointable_schema` and define any fields we wish to put directly in the table. For the most part, `pointable_schema` is like Ecto's `schema` macro, except you do not provide the table name and let it handle the primary key.\n\n> If for some reason you wished to turn ID autogeneration off, you could pass `autogenerate: false` to the options provided when using `Needle.Pointable`.","ref":"Needle.html#pointables"},{"type":"extras","title":"Adding re-usable fields - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#adding-re-usable-fields"},{"type":"extras","title":"Mixins - storing data about objects - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Mixins are tables which contain extra information on behalf of objects. Each object can choose to\nrecord or not record information for each mixin. Sample mixins include:\n\n* user profile (containing a name, location and summary)\n* post content (containing the title, summary, and/or html body of a post or message)\n* created (containing the id of the object creator)\n\nIn this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.\n\nMixins are just tables too! The only requirement is they have a `UID` primary key which references `Needle.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro). \n\nHere is a sample mixin definition for a user profile:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_profile\"\n\n mixin_schema do\n field :name, :string\n field :summary, :string\n field :website, :string\n field :location, :string\n end\nend\n```\n\n> Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.\n\nAside from `use`ing `Needle.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of\n`schema`, pretty similar to a standard Ecto schema, right? \n\nThe arguments to `use Needle.Mixin` are:\n\n* `otp_app`: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)\n* `source`: the underlying table name to use in the database\n\nWe will cover dynamic configuration later. For now, you can use the OTP app that includes the module.","ref":"Needle.html#mixins-storing-data-about-objects"},{"type":"extras","title":"Multimixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.\n\nFor this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Needle.Pointer` and at least one other field which will collectively be unique.\n\nAn example multimixin is used for publishing an item to feeds:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_feed_publish\"\n\n alias Needle.Pointer\n\n mixin_schema do\n belongs_to :feed, Pointer, primary_key: true\n end\nend\n```\n\nNotice that this looks very similar to defining a mixin. Indeed, the only difference is the `primary_key: true` in this line, which adds a second field to the compound primary key.\nThis results in ecto recording a compound primary key of `(id, feed_id)` for the schema (the id is added for you as with regular mixins).","ref":"Needle.html#multimixins"},{"type":"extras","title":"Writing Migrations - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Migrations are typically included along with the schemas as public APIs you can call within your project's migrations.","ref":"Needle.html#writing-migrations"},{"type":"extras","title":"Virtuals - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Most virtuals are incredibly simple to migrate for:\n\n```elixir\ndefmodule Bonfire.Data.Social.Post.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Post\n\n def migrate_post(), do: migrate_virtual(Post)\n\nend\n```\n\nIf you need to do more work, it can be a little trickier. Here's an example for `block`, which also creates a unique index on another table:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n import Bonfire.Data.Edges.Edge.Migration\n alias Bonfire.Data.Social.Block\n\n def migrate_block_view(), do: migrate_virtual(Block)\n\n def migrate_block_unique_index(), do: migrate_type_unique_index(Block)\n\n def migrate_block(dir \\\\ direction())\n\n def migrate_block(:up) do\n migrate_block_view()\n migrate_block_unique_index()\n end\n\n def migrate_block(:down) do\n migrate_block_unique_index()\n migrate_block_view()\n end\n\nend\n```\n\nNotice how we have to write our `up` and `down` versions separately to get the correct ordering of operations.","ref":"Needle.html#virtuals"},{"type":"extras","title":"Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Migration example for a `Pointable`:\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity.Migration do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.APActivity\n\n defp make_apactivity_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do\n Ecto.Migration.add :json, :jsonb\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_apactivity_table, do: make_apactivity_table([])\n defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)\n\n def drop_apactivity_table(), do: drop_pointable_table(APActivity)\n\n defp maa(:up), do: make_apactivity_table([])\n defp maa(:down) do\n quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()\n end\n\n defmacro migrate_apactivity() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(maa(:up)),\n else: unquote(maa(:down))\n end\n end\n\nend\n```\n\nAs you can see, this `Pointable` migration a little trickier to define than a `Virtual` because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Greeting do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up() do\n create_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\") do\n add :greeting, :text, null: false\n end\n end\n\n def down() do\n drop_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\")\n end\nend\n```\n\n> As you can see, it's pretty similar to defining a regular migration, except you use `create_pointable_table` and\n`drop_pointable_table`. Notice that our sentinel UID makes an appearance again here. It's *very* important that these match what we declared in the schema.","ref":"Needle.html#pointables"},{"type":"extras","title":"Mixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Mixins look much like pointables:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Profile\n\n # create_profile_table/{0,1}\n\n defp make_profile_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do\n Ecto.Migration.add :name, :text\n Ecto.Migration.add :summary, :text\n Ecto.Migration.add :website, :text\n Ecto.Migration.add :location, :text\n Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)\n Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_profile_table(), do: make_profile_table([])\n defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)\n\n # drop_profile_table/0\n\n def drop_profile_table(), do: drop_mixin_table(Profile)\n\n # migrate_profile/{0,1}\n\n defp mp(:up), do: make_profile_table([])\n\n defp mp(:down) do\n quote do\n Bonfire.Data.Social.Profile.Migration.drop_profile_table()\n end\n end\n\n defmacro migrate_profile() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mp(:up)),\n else: unquote(mp(:down))\n end\n end\n\nend\n```","ref":"Needle.html#mixins"},{"type":"extras","title":"Multimixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Similar to mixins:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.FeedPublish\n\n @feed_publish_table FeedPublish.__schema__(:source)\n\n # create_feed_publish_table/{0,1}\n\n defp make_feed_publish_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do\n Ecto.Migration.add :feed_id,\n Needle.Migration.strong_pointer(), primary_key: true\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_feed_publish_table(), do: make_feed_publish_table([])\n defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body)\n\n def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish)\n\n def migrate_feed_publish_feed_index(dir \\\\ direction(), opts \\\\ [])\n def migrate_feed_publish_feed_index(:up, opts),\n do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts))\n def migrate_feed_publish_feed_index(:down, opts),\n do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts))\n\n defp mf(:up) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table()\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n end\n end\n\n defp mf(:down) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table()\n end\n end\n\n defmacro migrate_feed_publish() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mf(:up)),\n else: unquote(mf(:down))\n end\n end\n\n defmacro migrate_feed_publish(dir), do: mf(dir)\n\nend\n```","ref":"Needle.html#multimixins"},{"type":"extras","title":"More examples - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Take a look at a few of the migrations in our data libraries. Between them, they cover most\nscenarios by now:\n\n* [bonfire_data_social](https://github.com/bonfire-networks/bonfire_data_social/)\n* [bonfire_data_access_control](https://github.com/bonfire-networks/bonfire_data_access_control/)\n* [bonfire_data_identity](https://github.com/bonfire-networks/bonfire_data_identity/)\n* [bonfire_data_edges](https://github.com/bonfire-networks/bonfire_data_edges/) (feat. bonus triggers)\n\nIf you want to know exactly what's happening, you may want to read the code for\n[Needle.Migration](https://github.com/bonfire-networks/needle/blob/main/lib/migration.ex).","ref":"Needle.html#more-examples"},{"type":"extras","title":"Configuration and overrides - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Every pointable or mixin schema is overrideable with configuration\nduring compilation (this is why using them requires an `:otp_app` to\nbe specified). For example, we could override `Needle.Table` (which\nis a pointable table) thus:\n\n```elixir\nconfig :needle, Needle.Table, source: \"my_pointers_table\"\n```\n\nThe `table_id` is also configurable, but we don't recommend you change it.\n\nIn addition, all pointable and mixin schemas permit extension with [Exto](https://github.com/bonfire-networks/exto). See the `Exto`'s docs for more information about how to extend schemas via configuration. You will probably at the very least want to insert some `has_one` for mixins off your pointables.","ref":"Needle.html#configuration-and-overrides"},{"type":"extras","title":"Referencing Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically `belongs_to` with `Needle.Pointer`. The table in which we do this does not itself need to necessarily be a `Pointable`.\n\n```elixir\ndefmodule MyApp.Foo do\n\n use Ecto.Schema\n\n # regular ecto table, not pointable!\n schema \"hello\" do\n belongs_to :pointer, Needle.Pointer # who knows what it points to?\n end\nend\n```\n\nYou may choose to reference a specific schema rather than Pointer if it\nwill only point to a single table. If you do this, you must ensure\nthat the referenced record exists in that table in the normal\nway. There may be some performance benefit, we didn't benchmark it.\n\nThe migration is slightly more complex, we have to decide what type of\na pointer it is. Needle come in three categories:\n\n* A strong pointer is not nullable and is deleted when the object it\n points to is deleted.\n* A weak pointer is nullable and is nilified when the object it points\n to is deleted.\n* An unbreakable pointer will raise when you attempt to delete the\n object it points to.\n\n| Type | Nullable? | On Delete |\n|-------------|-----------|-------------|\n| Strong | No | Cascade |\n| Weak | Yes | Set Null |\n| Unbreakable | No | Raise |\n\nIn this case we will use a strong pointer, because we want it to be\ndeleted if the pointed object is deleted.\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Hello do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def change() do\n create_if_not_exists table(:hello) do\n add :pointer, strong_pointer(), null: false\n add :greeting, :text, null: false\n end\n end\nend\n```\n\nIf you are pointing to a specific table instead of pointer,\n`strong_pointer/1` allows you to pass the name of that module\n(`strong_pointer/0` calls this with `Needle.Pointer`).","ref":"Needle.html#referencing-pointables"},{"type":"extras","title":"Dereferencing Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"It is common that even though you have a universal foreign key, you\nwill want to issue different queries based upon the type that is being\npointed to. For this reason, it is up to you to decide how to perform\nan onward query.\n\n`Needle.Pointers.schema/1` turns a `Pointer` into an Ecto schema module name\nyou can switch against. `Needle.Pointers.plan` breaks down a list of Needle\ninto a map of ids keyed by schema module. It is handy to define some\nfunctions in your (non-library) application that can load any type of\npointer in given contexts.","ref":"Needle.html#dereferencing-pointables"},{"type":"extras","title":"Inserting data - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#inserting-data"},{"type":"extras","title":"Elixir-based logic - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The practical result of needle is that it pushes a certain amount of\nvalidation and consistency logic back into elixir land. It is\ntherefore your elixir code's responsibility to ensure that data is\ninserted into the appropriate mixin tables when inserting a pointable\nobject and to manage deletions as appropriate.\n\nWhen assembling queries with mixin tables, pay careful attention to\nthe type of join you are performing. An inner join is explicitly\nasking not to be shown objects that do not have a record for that\nmixin. You quite possibly wanted to left join.","ref":"Needle.html#elixir-based-logic"},{"type":"extras","title":"Querying Needle - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Since `Pointer` has a table, you can use its `table_id` field to\nfilter by pointed type. `Needle.Tables.id!/1` (or `ids!/1` for a\nlist) can be used to obtain the IDs for a table or tables.","ref":"Needle.html#querying-needle"},{"type":"extras","title":"Tradeoffs - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"All solutions to the universal primary key problem have tradeofs. Here\nare what we see as the deficiencies in our approach:\n\n1. It forces a UUIDv7 or ULID on you. This is great for us, but not\n everyone. They both expose a timestamp with millisecond precision. \n If the time of creation of a resource is sensitive information for\n your purposes, they may not going to be suitable for you.\n2. Ecto has no knowledge of the specialty of `Pointer`,\n e.g. `Repo.preload` does not work and you need to specify a join\n condition to join through a pointer. Use our functions or add extra\n associations with exto configuration.\n3. Dereferencing a list of needle requires a select query per table\n type that occurs in the input set.\n4. Reliance on user attention. You have to follow the instructions\n correctly to make the system work at all.\n5. There is likely some performance impact from postgres not\n understanding the relationships between the various tables\n properly. It's hard to gauge and we haven't even tried.\n\nThese are not likely to change. If you're going to pick\nthis library, do so in the full knowledge of the tradeoffs it makes.\n\nAlternatives include (I'm sure you can think of others):\n\n* Storing the table name in a second column alongside every foreign key.\n* A compound datatype of id and table name.\n* Byte/String manipulation tricks.\n* Evil SQL hacks based upon compile time configuration.\n\nWhile we have our gripes with this approach, once you've gotten the\nhang of using it, it works out pretty well for most purposes and it's\none of the simpler options to work with.","ref":"Needle.html#tradeoffs"},{"type":"extras","title":"Copyright and License - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Copyright (c) 2020 needle Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Needle.html#copyright-and-license"},{"type":"extras","title":"Email Delivery in Bonfire","doc":"# Email Delivery in Bonfire\n\nEmail delivery is a crucial component of many web applications, including your Bonfire instance. It's used for various purposes such as:\n\n- Sending signup confirmation emails\n- Delivering password reset links\n- Notifying users of new messages or activities\n- Sending alerts to administrators or moderators\n\nTo set up email delivery for your Bonfire instance, you'll need to choose an email delivery method and configure it properly. This guide will help you through that process.","ref":"Bonfire.Mailer.html"},{"type":"extras","title":"Before You Begin - Email Delivery in Bonfire","doc":"1. **Choose Email Delivery Method and/or Provider**: You may choose to sign up with one of the email service providers listed in this guide. Each provider has its own pricing, features, and delivery rates.\n\n2. **Domain Configuration**: To ensure reliable email delivery and avoid spam filters, you should configure your [email-related DNS settings](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance's domain name. This typically involves setting up:\n - MX (Mail Exchanger) records\n - SPF (Sender Policy Framework) records\n - DKIM (DomainKeys Identified Mail) records\n - DMARC (Domain-based Message Authentication, Reporting, and Conformance) records\n\nYour chosen email provider should provide instructions on how to set these up for your domain.\n\n3. **Environment Variables**: Bonfire uses environment variables for configuration. You'll need to set these variables in your deployment environment or in a `.env` file if you're running Bonfire locally or using Co-op Cloud.\n\nFor all email delivery methods, you'll need to set the following environment variables:\n\n- `MAIL_BACKEND` environment variable to choose your email delivery method or provider. \n- `MAIL_DOMAIN` or `HOSTNAME`: Your domain name\n- `MAIL_FROM`: The email address from which emails will be sent","ref":"Bonfire.Mailer.html#before-you-begin"},{"type":"extras","title":"Choosing an Email Delivery Method - Email Delivery in Bonfire","doc":"","ref":"Bonfire.Mailer.html#choosing-an-email-delivery-method"},{"type":"extras","title":"1. Default Behaviour: Direct SMTP Delivery - Email Delivery in Bonfire","doc":"If no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers. Here's what you need to know about this default behaviour:\n\n- **What it means**: Your server will try to connect directly to the recipient's email server (e.g. a provider such as Gmail or an organisation's own mail server) to deliver the email.\n\n- **Pros**: It requires no additional configuration and can work for basic setups.\n\n- **Cons**: This method is often unreliable and prone to several issues:\n 1. **Spam Filters**: Emails sent this way are more likely to be marked as spam or rejected entirely.\n 2. **Deliverability**: Many recipient servers may flat-out reject IP addresses not properly set up for email sending.\n 3. **DNS Configuration**: Without proper DNS records (SPF, DKIM, DMARK, etc.), your emails are more likely to be treated as suspicious.\n 4. **IP Reputation**: If your server's IP address isn't established as a legitimate email sender, deliverability will suffer.\n\n- **Important**: While this default method can work for testing or in very small-scale scenarios, it is strongly recommended to configure a proper email delivery service for any production use of Bonfire. If you want to try this method anyway, make sure to configure [SPF, DKIM, DMARK, etc.](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance domain name and IP address.","ref":"Bonfire.Mailer.html#1-default-behaviour-direct-smtp-delivery"},{"type":"extras","title":"2. Managed Email Service Providers - Email Delivery in Bonfire","doc":"These providers offer comprehensive email delivery services, usually featuring analytics, bounce handling, high deliverability rates, etc.\n\n> Note: the information about free tiers and pricing are only meant to serve as a rough indication of the options available and may be outdated or inaccurate (we'd welcome PRs with any updates of course). Please check with each provider's website for more details.\n\n\n#### Brevo (formerly Sendinblue)\n- Website: [brevo.com](https://www.brevo.com/)\n- Free Tier: 300 emails per day, then pay-as-you-go or $15+/month\n```\nMAIL_BACKEND=brevo\nMAIL_KEY=your_brevo_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailjet\n- Website: [mailjet.com](https://www.mailjet.com/)\n- Free Tier: 200 emails per day (up to 6,000 emails per month), then $17+/month\n```\nMAIL_BACKEND=mailjet\nMAIL_KEY=your_mailjet_api_key\nMAIL_PRIVATE_KEY=your_mailjet_secret_key\nMAIL_FROM=your@email.address\n```\n\n#### SMTP2GO\n- Website: [smtp2go.com](https://www.smtp2go.com/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $10+/month\n```\nMAIL_BACKEND=SMTP2GO\nMAIL_KEY=your_smtp2go_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailtrap \n- Website: [mailtrap.io](https://mailtrap.io/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $15+/month\n```\nMAIL_BACKEND=mailtrap\nMAIL_KEY=your_mailtrap_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mailgun\n- Website: [www.mailgun.com](https://www.mailgun.com/)\n- Free Tier: 100 emails per day, then $15+/month\n```\nMAIL_BACKEND=mailgun\nMAIL_KEY=your_mailgun_api_key\nMAIL_BASE_URI=https://api.eu.mailgun.net/v3\nMAIL_FROM=your@email.address\n```\nNote: The `MAIL_BASE_URI` depends on your Mailgun registration region. The default is set to EU, adjust if necessary.\n\n#### Postmark\n- Website: [postmarkapp.com](https://postmarkapp.com/)\n- Free Tier: 100 emails per month, then $15+/month\n```\nMAIL_BACKEND=postmark\nMAIL_KEY=your_postmark_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Twilio SendGrid \n- Website: [sendgrid.com](https://sendgrid.com/)\n- Free Tier: 100 emails per day, then $20+/month\n```\nMAIL_BACKEND=sendgrid\nMAIL_KEY=your_sendgrid_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Zoho ZeptoMail\n- Website: [zoho.com](https://www.zoho.com/zeptomail/)\n- First 10,000 emails are free, then €2,50 per 10,000 emails\n```\nMAIL_BACKEND=zepto\nMAIL_KEY=your_zeptomail_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Gmail\n- Website: [gmail.com](https://developers.google.com/gmail/api)\n- Free Tier: 500 emails per day\n```\nMAIL_BACKEND=gmail\nMAIL_KEY=your_gmail_api_key \nMAIL_FROM=your@email.address\n# ^ OAuth2 access token with `gmail.compose` scope\n```\nNote: Using Gmail for sending application email is generally not recommended for production use.\n\n#### Scaleway\n- Website: [scaleway.com](https://www.scaleway.com/en/transactional-email-tem/)\n- No free tier, pay-as-you-go pricing (€0.25/1,000 emails sent)\n```\nMAIL_BACKEND=scaleway\nMAIL_KEY=your_scaleway_api_key\nMAIL_PROJECT_ID=your_scaleway_project_id\nMAIL_PRIVATE_KEY=your_scaleway_secret_key\nMAIL_FROM=your@email.address\n```\n\n#### MailPace\n- Website: [mailpace.com](https://mailpace.com/)\n- No free tier, starts at £2.50 per month for up to 1,000 emails\n```\nMAIL_BACKEND=mailpace\nMAIL_KEY=your_mailpace_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Mandrill (Mailchimp Transactional)\n- Website: [mailchimp.com](https://mailchimp.com/features/transactional-email/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=mandrill\nMAIL_KEY=your_mandrill_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Bird / SparkPost\n- Website: [bird.com](https://bird.com/api/email)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=sparkpost\nMAIL_KEY=your_sparkpost_api_key\nMAIL_BASE_URI=https://api.eu.sparkpost.com\nMAIL_FROM=your@email.address\n```\nNote: The `MAIL_BASE_URI` depends on your SparkPost registration region. The default is set to EU, adjust if necessary.\n\n#### Sendcloud (China)\n- Website: [sendcloud.net](https://www.sendcloud.net/)\n- Free Tier: 10 emails per day\n```\nMAIL_BACKEND=sendcloud\nMAIL_KEY=your_sendcloud_api_key\nMAIL_USER=your_sendcloud_api_user\nMAIL_FROM=your@email.address\n```\n\n#### SocketLabs\n- Website: [socketlabs.com](https://www.socketlabs.com/)\n- No free tier\n```\nMAIL_BACKEND=socketlabs\nMAIL_KEY=your_socketlabs_api_key\nMAIL_SERVER=your_socketlabs_server_id\nMAIL_PRIVATE_KEY=your_socketlabs_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Campaign Monitor\n- Website: [campaignmonitor.com](https://www.campaignmonitor.com/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=campaign_monitor\nMAIL_KEY=your_campaign_monitor_api_key\nMAIL_FROM=your@email.address\n```\n\n#### Amazon AWS SES\n- Website: [aws.amazon.com](https://aws.amazon.com/ses/)\n- Free Tier: 3,000 message / month (only for the first 12 months, and extra AWS charges may still apply)\n\nAmazon SES can be configured in two ways:\n\n1. Using existing AWS credentials (if already configured for S3 file storage, you can simplify configuration and use the same AWS credentials for both file storage and email delivery):\n```\nMAIL_BACKEND=aws\nMAIL_FROM=your@email.address\n```\nNote: This method will automatically use the credentials set by `UPLOADS_S3_ACCESS_KEY_ID` and `UPLOADS_S3_SECRET_ACCESS_KEY`. No additional configuration is needed if these are already set up for a Bonfire extension (such as `Bonfire.Files`) which uses S3 file storage.\n\n2. Using dedicated credentials, if you don't use AWS for S3 file storage or you want to use different AWS accounts for file storage and email delivery:\n```\nMAIL_BACKEND=aws\nMAIL_KEY=your_aws_access_key_id\nMAIL_PRIVATE_KEY=your_aws_secret_access_key\nMAIL_REGION=your_aws_region\nMAIL_FROM=your@email.address\n```\n\nNote: \n- If not specified, `MAIL_REGION` defaults to \"eu-west-1\".","ref":"Bonfire.Mailer.html#2-managed-email-service-providers"},{"type":"extras","title":"3. Direct Email Sending Methods - Email Delivery in Bonfire","doc":"These methods involve sending emails directly or through your own mail server. They require more setup and maintenance but offer more control.\n\n#### Default: Direct SMTP Delivery\n- When no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers.\n- No additional configuration is needed as this is the default behaviour, but it's not recommended for production use due to deliverability issues ([see above](#module-default-behaviour-direct-smtp-delivery)).\n\n#### SMTP\nSMTP (Simple Mail Transfer Protocol) is the standard method for sending emails across the internet. It's like the postal service for digital messages, ensuring your emails reach their destination regardless of the systems involved. While many opt for using a dedicated email delivery provider (see above), if you already run your own email server or use a provider that's not listed above which provides you with SMTP credentials, you can configure Bonfire to use that:\n\n```\nMAIL_BACKEND=smtp\nMAIL_SERVER=your_smtp_server\nMAIL_PORT=587\nMAIL_USER=your_smtp_username\nMAIL_PASSWORD=your_smtp_password\nMAIL_FROM=your@email.address\n```\n\nNotes: \n- `MAIL_PORT` defaults to 587 if not specified.\n\n#### Sendmail\n- Built into many Unix-like operating systems\n```\nMAIL_BACKEND=sendmail\nMAIL_SERVER=/path/to/sendmail\n# MAIL_ARGS=\nMAIL_QMAIL=true_or_false\nMAIL_FROM=your@email.address\n```\n\nNotes: \n- `MAIL_SERVER` defaults to `/usr/bin/sendmail` if not specified.\n- `MAIL_ARGS` defaults to `-N delay,failure,success` if not specified.\n- While sendmail can send mail directly (similar to the default behaviour), it can be set up to hand off emails to a local or remote SMTP server for delivery.\n- Using sendmail usually provides more control and logging capabilities compared to the default direct SMTP delivery.\n\n#### Postal\n- Self-hosted email delivery platform\n- Website: [postalserver.io](https://docs.postalserver.io)\n```\nMAIL_BACKEND=postal\nMAIL_KEY=your_postal_api_key\nMAIL_BASE_URI=https://your_postal_server_api.uri/\nMAIL_FROM=your@email.address\n```","ref":"Bonfire.Mailer.html#3-direct-email-sending-methods"},{"type":"extras","title":"Copyright and License - Email Delivery in Bonfire","doc":"Copyright (c) 2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Mailer.html#copyright-and-license"},{"type":"extras","title":"Boundaries for Access Control","doc":"# Boundaries for Access Control\n\nBonfire's boundaries framework provides a flexible way to control user access to specific actions and data. It ensures that users can only see and do what they're authorized to.\n\nYou can create custom groups of contacts (circles) and grant them specific permissions to interact with you and your content. They can help you take control of your online presence and ensure that your data is shared only with the people you want.\n\n> Boundaries are limits that you set for yourself or others to define what you're comfortable with.\n> These limits can be physical, like curtains or doors; digital, like sharing settings on social media; in writing, like codes of conduct; emotional, like feeling comfortable to take time for self-care; or mental, like choosing what you pay attention to. In Bonfire, boundaries can help limit the type of interactions that others may have with you or things you post.\n> Boundaries are important because they help you protect yourself, maintain your autonomy, and communicate your needs and expectations clearly.","ref":"Bonfire.Boundaries.html"},{"type":"extras","title":"Glossary - Boundaries for Access Control","doc":"| Term | Definition |\n| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **Subject** or **User** | An individual who interacts with the system. |\n| **[Circle](Bonfire.Boundaries.Circles.html)** | A categorization method for users, allowing users to group other users (e.g., colleagues, friends). |\n| **[Verb](Bonfire.Boundaries.Verbs.html)** | An action that a user can perform (e.g., read, reply). |\n| **Permission** | A value indicating whether an action is allowed (`true`), denied (`false`), or `nil`. |\n| **[Grant](Bonfire.Boundaries.Grants.html)** | Links a user or circle with a verb and permission. |\n| **[ACL](Bonfire.Boundaries.Acls.html)** | Access Control List, a collection of grants. Also called \"boundary\" or \"boundary preset\" in the app. |\n| **[Controlled](Bonfire.Boundaries.Controlleds.html)** | Links an object to one or more ACLs, to determine access based on the grants. |\n| **[Role](Bonfire.Boundaries.Roles.html)** | A group of verbs linked to a permission. |","ref":"Bonfire.Boundaries.html#glossary"},{"type":"extras","title":"Users and Circles - Boundaries for Access Control","doc":"Circles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.","ref":"Bonfire.Boundaries.html#users-and-circles"},{"type":"extras","title":"Verbs - Boundaries for Access Control","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.","ref":"Bonfire.Boundaries.html#verbs"},{"type":"extras","title":"Permissions - Boundaries for Access Control","doc":"A permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n- `true`: yes, the action is allowed\n- `false`: no, the action is explicitly denied (i.e. never permit)\n- `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed)","ref":"Bonfire.Boundaries.html#permissions"},{"type":"extras","title":"Grants - Boundaries for Access Control","doc":"A `Grant` links a `subject` (user or circle) with a `Verb` and a permission. It defines the access rights for a specific user or circle in relation to a particular action.","ref":"Bonfire.Boundaries.html#grants"},{"type":"extras","title":"ACLs - Boundaries for Access Control","doc":"An `Acl` is a list of `Grant`s used to define access permissions for objects.\n\nBecause a user could be in more than one circle and each circle may have a different permission, when a user attempts an action on an object, the system combines all relevant grants to determine the final permission. This combination prioritizes permissions as follows: `false > true > nil`, resulting in:\n\n| input | input | result |\n| :------ | :------ | :------ |\n| `nil` | `nil` | `nil` |\n| `nil` | `true` | `true` |\n| `nil` | `false` | `false` |\n| `true` | `nil` | `true` |\n| `true` | `true` | `true` |\n| `true` | `false` | `false` |\n| `false` | `nil` | `false` |\n| `false` | `true` | `false` |\n| `false` | `false` | `false` |\n\nIn simpler terms, a final permission is granted only if the combined result is `true`. Think of it as requiring an explicit \"yes\" for permission, while \"no\" always takes precedence. Notably, `nil` acts as a sort of \"weak no,\" it can be overridden by a `true` but not granting access on its own. This approach provides flexibility for implementing features like user blocking (`false` is crucial here).\n\nFor efficiency, `nil` is the assumed default and not stored in the database.","ref":"Bonfire.Boundaries.html#acls"},{"type":"extras","title":"Controlled - Applying boundaries to an object - Boundaries for Access Control","doc":"The `Controlled` [multimixin](./DATABASE.md#multimixins) link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described above.","ref":"Bonfire.Boundaries.html#controlled-applying-boundaries-to-an-object"},{"type":"extras","title":"Roles - Boundaries for Access Control","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.","ref":"Bonfire.Boundaries.html#roles"},{"type":"extras","title":"Practical example: Surprise birthday party - Boundaries for Access Control","doc":"Let's illustrate how boundaries work with a real-world example: planning a surprise party without the birthday girl finding out.","ref":"Bonfire.Boundaries.html#practical-example-surprise-birthday-party"},{"type":"extras","title":"1. Setting up users - Boundaries for Access Control","doc":"```elixir\niex> import Bonfire.Me.Fake\niex> organizer = fake_user!()\niex> birthday_girl = fake_user!()\niex> friends = [fake_user!(), fake_user!()]\niex> family = [fake_user!(), fake_user!()]\n```","ref":"Bonfire.Boundaries.html#1-setting-up-users"},{"type":"extras","title":"2. Define your Circles - Boundaries for Access Control","doc":"Organize users into relevant circles (friends and family).\n\n```elixir\niex> alias Bonfire.Boundaries.Circles\niex> {:ok, friends_circle} = Circles.create(organizer, %{named: %{name: \"friends\"}})\niex> Circles.add_to_circles(friends, friends_circle)\niex> Circles.is_encircled_by?(List.first(friends), friends_circle)\ntrue\niex> {:ok, family_circle} = Circles.create(organizer, %{named: %{name: \"family\"}})\niex> Circles.add_to_circles(family, family_circle)\n```","ref":"Bonfire.Boundaries.html#2-define-your-circles"},{"type":"extras","title":"3. Create the ACL (boundary preset) - Boundaries for Access Control","doc":"This boundary will control access to the surprise party plans.\n\n```elixir\niex> alias Bonfire.Boundaries.Acls\niex> {:ok, boundary} = Acls.simple_create(organizer, \"Surprise party\")\n```","ref":"Bonfire.Boundaries.html#3-create-the-acl-boundary-preset"},{"type":"extras","title":"4. Grant permissions - Boundaries for Access Control","doc":"Allow friends to discover, read, and respond to party plans, while family members can also edit details and send invitations.\n\n```elixir\niex> alias Bonfire.Boundaries.Grants\niex> Grants.grant(friends_circle.id, boundary.id, [:see, :read, :reply], true, current_user: organizer)\niex> Grants.grant(family_circle.id, boundary.id, [:see, :read, :reply, :edit, :invite], true, current_user: organizer)\n```\n\nPrevent the birthday person from accessing any party information.\n\n```elixir\niex> Grants.grant(birthday_girl.id, boundary.id, [:see, :read], false, current_user: organizer)\n```","ref":"Bonfire.Boundaries.html#4-grant-permissions"},{"type":"extras","title":"5. Post about the party - Boundaries for Access Control","doc":"```elixir\niex> alias Bonfire.Posts\niex> {:ok, party_plan} = Posts.publish(\n current_user: organizer,\n boundary: boundary.id,\n post_attrs: %{post_content: %{name: \"Surprise party!\"}})\n```","ref":"Bonfire.Boundaries.html#5-post-about-the-party"},{"type":"extras","title":"6. Double-check applied boundaries - Boundaries for Access Control","doc":"```elixir\niex> Boundaries.can?(List.first(friends).id, :read, party_plan.id)\ntrue\niex> Boundaries.can?(List.first(family).id, :invite, party_plan.id)\ntrue\niex> Boundaries.can?(birthday_girl.id, :see, party_plan.id)\nfalse\niex> Boundaries.load_pointer(party_plan.id, current_user: birthday_girl)\nnil\n```\n\nBy following these steps, the organizer can effectively manage access to ensure the birthday girl cannot see the party plans, while friends and family can.","ref":"Bonfire.Boundaries.html#6-double-check-applied-boundaries"},{"type":"extras","title":"Copyright and License - Boundaries for Access Control","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Boundaries.html#copyright-and-license"},{"type":"extras","title":"Bonfire.API.GraphQL","doc":"# Bonfire.API.GraphQL","ref":"Bonfire.API.Graphql.html"},{"type":"extras","title":"GraphQL Introduction - Bonfire.API.GraphQL","doc":"Go to http://your-instance-url/api/ to start playing with the GraphQL API. The GraphiQL UI should autocomplete types, queries and mutations for you, and you can also explore the schema there.\n\nLet's start with a simple GraphQL thoeretical query:\n\n```graphql\nquery {\n greetings(limit: 10) {\n greeting\n to {\n name\n }\n }\n}\n```\n\nLet's break this apart:\n\n- `query {}` is how you retrieve information from GraphQL.\n- `greetings` is a `field` within the query.\n- `greetings` takes a `limit` argument, a positive integer.\n- `greetings` has two fields, `greeting` and `to`.\n- `to` has one `field`, `name`.\n\nThis query is asking for a list of (up to) 10 greetings and the people\nthey are for. Notice that the result of both `greetings` and `to` are\nmap/object structures with their own fields and that if the type has\nmultiple fields, we can select more than one field.\n\nHere is some possible data we could get returned\n\n```elixir\n%{greetings: [\n %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]}\n```\n\nWhere is the magic? Typically an object type will reside in its own\ntable in the database, so this query is actually querying two tables\nin one go. In fact, given a supporting schema, you can nest queries\narbitrarily and the backend will figure out how to run them.\n\nThe fact that you can represent arbitrarily complex queries puts quite\na lot of pressure on the backend to make it all efficient. This is\nstill a work in progress at this time.","ref":"Bonfire.API.Graphql.html#graphql-introduction"},{"type":"extras","title":"Absinthe Introduction - Bonfire.API.GraphQL","doc":"Every `field` is filled by a resolver. Let's take our existing query\nand define a schema for it in Absinthe's query DSL:\n\n```elixir\ndefmodule MyApp.Schema do\n # the schema macro language\n use Absinthe.Schema.Notation\n # where we will actually resolve the fields\n alias MyApp.Resolver\n\n # Our user object is pretty simple, just a name\n object :user do\n field :name, non_null(:string)\n end\n\n # This one is slightly more complicated, we have that nested `to`\n object :greeting do\n # the easy one\n field :greeting, non_null(:string)\n # the hard one. `edge` is the term for when we cross an object boundary.\n field :to, non_null(:user), do: resolve(&Resolver.to_edge/3)\n end\n\n # something to put our top level queries in, because they're just fields too!\n object :queries do\n field :greetings, non_null(list_of(non_null(:string))) do\n arg :limit, :integer # optional\n resolve &Resolver.greetings/2 # we need to manually process this one\n end\n end\n\nend\n```\n\nThere are a couple of interesting things about this:\n\n- Sprinklings of `not_null` to require that values be present (if you\n don't return them, absinthe will get upset).\n- Only two fields have explicit resolvers. Anything else will default\n to a map key lookup (which is more often than not what you want).\n- `greeting.to_edge` has a `/3` resolver and `queries.greetings` a\n `/2` resolver.\n\nTo understand the last one (and partially the middle one), we must\nunderstand how resolution works and what a parent is. The best way of\ndoing that is probably to look at the resolver code:\n\n```elixir\ndefmodule MyApp.Resolver do\n\n # For purposes of this, we will just fake the data out\n defp greetings_data() do\n [ %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]\n end\n\n # the /2 resolver takes only arguments (which in this case is just limit)\n # and an info (which we'll explain later)\n def greetings(%{limit: limit}, _info) when is_integer(limit) and limit > 0 do\n {:ok, Enum.take(greetings_data(), limit)} # absinthe expects an ok/error tuple\n end\n def greetings(_args, _info), do: {:ok, greetings_data()} # no limit\n\n # the /3 resolver takes an additional parent argument in first position.\n # `parent` here will be the `greeting` we are resolving `to` for.\n def to_edge(parent, args, info), do: Map.get(parent, :to)\n\nend\n```\n\nThe keen-eyed amongst you may have noticed I said the default resolver\nis a map lookup and our `to_edge/3` is a map lookup too, so\ntechnically we didn't need to write it. But then you wouldn't have an\nexample of a `/3` resolver! In most of the app, these will be querying\nfrom the database, not looking up in a constant.\n\nSo for every field, a resolver function is run. It defaults to a map\nlookup, but you can override it with `resolve/1`. It may or may not\nhave arguments. And all absinthe resolvers return an ok/error tuple.","ref":"Bonfire.API.Graphql.html#absinthe-introduction"},{"type":"extras","title":"Copyright and License - Bonfire.API.GraphQL","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.API.Graphql.html#copyright-and-license"},{"type":"extras","title":"Bonfire Community","doc":"# Bonfire Community \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.UI.Groups](https://github.com/bonfire-ecosystem/bonfire_ui_groups) - groups\n- [Bonfire.UI.Topics](https://github.com/bonfire-ecosystem/bonfire_ui_topics) - topics","ref":"blog.html"},{"type":"extras","title":"More information - Bonfire Community","doc":"See the [main docs](../../README.md).","ref":"blog.html#more-information"},{"type":"extras","title":"Bonfire Classic","doc":"# Bonfire Classic\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) ecosystem and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places","ref":"classic.html"},{"type":"extras","title":"More information - Bonfire Classic","doc":"See the [main docs](../../README.md).","ref":"classic.html#more-information"},{"type":"extras","title":"Bonfire Community","doc":"# Bonfire Community \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.UI.Groups](https://github.com/bonfire-ecosystem/bonfire_ui_groups) - groups\n- [Bonfire.UI.Topics](https://github.com/bonfire-ecosystem/bonfire_ui_topics) - topics","ref":"community.html"},{"type":"extras","title":"More information - Bonfire Community","doc":"See the [main docs](../../README.md).","ref":"community.html#more-information"},{"type":"extras","title":"Bonfire Cooperation","doc":"# Bonfire Cooperation \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire.Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire.ValueFlows.Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire.Breadpub](https://github.com/bonfire-networks/bonfire_breadpub) - needs & offers for mutual aid","ref":"cooperation.html"},{"type":"extras","title":"More information - Bonfire Cooperation","doc":"See the [main docs](../../README.md).","ref":"cooperation.html#more-information"},{"type":"extras","title":"Bonfire Coordination","doc":"# Bonfire Coordination \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.UI.Coordination](https://github.com/bonfire-networks/bonfire_ui_coordinatio) - basic coordination UI for projects and communities\n- [Bonfire.UI.Kanban](https://github.com/bonfire-networks/bonfire_ui_kanban) - coordination tools with drag-and-drop card based UI","ref":"coordination.html"},{"type":"extras","title":"More information - Bonfire Coordination","doc":"See the [main docs](../../README.md).","ref":"coordination.html#more-information"},{"type":"extras","title":"Open Science Network","doc":"# Open Science Network\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) ecosystem and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- Etc...","ref":"open-science.html"},{"type":"extras","title":"More information - Open Science Network","doc":"See the [main docs](../../README.md).","ref":"open-science.html#more-information"},{"type":"extras","title":"Reflow","doc":"# Reflow\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) and [ValueFlows](http://valueflo.ws/) ecosystems and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire.Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.ValueFlows.Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.UI.Reflow](https://github.com/bonfire-networks/bonfire_ui_reflow) - frontend for the Reflow project","ref":"reflow.html"},{"type":"extras","title":"More information - Reflow","doc":"See the [main docs](../../README.md).","ref":"reflow.html#more-information"},{"type":"extras","title":"Upcycle","doc":"# Upcycle\n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire:Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire:Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire:Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire:UI:Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire:Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire:Federate:ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire:Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire:Classify\n- [Bonfire:Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire:Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire:Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire:ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire:ValueFlows:Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire:API:GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire:UI:ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire:UI:Coordination](https://github.com/bonfire-networks/bonfire_ui_valueflows) - basic coordination UI for projects and communities\n- [Bonfire:Kanban](https://github.com/bonfire-networks/bonfire_breadpub) - coordination tools with drag-and-drop card UI\n- [Bonfire:Breadpub](https://github.com/bonfire-networks/bonfire_breadpub) - needs & offers for mutual aid\n- [Bonfire:Files](https://github.com/bonfire-networks/bonfire_files) - file management for bonfire apps\n- [Bonfire:Data:SharedUser](https://github.com/bonfire-networks/bonfire_data_shared_user) - database models for shared users in the bonfire ecosystem\n- [Bonfire:Upcycle](https://gitlab.com/msoe.edu-public/sdl/y22sdl/upcycle/bonfire_upcycle/-/tree/master) - Upcycle UI","ref":"upcycle.html"},{"type":"extras","title":"More information - Upcycle","doc":"See the [main docs](../../README.md).","ref":"upcycle.html#more-information"},{"type":"extras","title":"Bonfire.Data.Assort","doc":"# Bonfire.Data.Assort\n\nVarious assorted database schemas for:\n- Ranked linked items\n- TODO: move schemas from bonfire_classify and bonfire_tag here?","ref":"Bonfire.Data.Assort.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Assort","doc":"Copyright (c) 2020 Bonfire Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Assort.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.AccessControl","doc":"# Bonfire.Data.AccessControl\n\nSee `Bonfire.Boundaries` for docs: https://github.com/bonfire-networks/bonfire_boundaries","ref":"Bonfire.Data.AccessControl.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.AccessControl","doc":"Copyright (c) 2020 James Laver, `bonfire_data_access_control` Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public\nLicense, v. 2.0. If a copy of the MPL was not distributed with this\nfile, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.AccessControl.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.ActivityPub","doc":"# Bonfire.Data.ActivityPub\n\n\n\nActor schema.","ref":"Bonfire.Data.ActivityPub.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.ActivityPub","doc":"Copyright (c) 2020 James Laver, bonfire_data_activity_pub Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.ActivityPub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Identity","doc":"# Bonfire.Data.Identity\n\nSchemas for accounts, users, etc.","ref":"Bonfire.Data.Identity.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Identity","doc":"Copyright (c) 2020 James Laver, bonfire_data_identity Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Identity.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Social","doc":"# Bonfire.Data.Social\n\n\n\nSchemas for social activities, posts, feeds, etc","ref":"Bonfire.Data.Social.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Social","doc":"Copyright (c) 2020 James Laver, bonfire_data_social Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Edges","doc":"# Bonfire.Data.Edges","ref":"Bonfire.Data.Edges.html"},{"type":"extras","title":"Bonfire.Data.SharedUser","doc":"# Bonfire.Data.SharedUser","ref":"Bonfire.Data.SharedUser.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.SharedUser","doc":"Copyright (c) 2020 Bonfire Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.SharedUser.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Common","doc":"# Bonfire.UI.Common\n\nA library of common utils and helpers used across Bonfire extensions\n\n- Many common functions for web UIs \n- Common and generic re-usable components\n- Etc","ref":"Bonfire.UI.Common.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Common","doc":"","ref":"Bonfire.UI.Common.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Common","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Common.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Me","doc":"# Bonfire.UI.Me\n![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Me](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) for functionality around accounts, users, profiles, authentication, etc.\n\nThis extension is meant to be used by other extensions like [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me), which provide logic for the UI to work with.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Me.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Me.html"},{"type":"extras","title":"Stack - Bonfire.UI.Me","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Me.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Me","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Me.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Me","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Me.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Me","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Me.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Social","doc":"# Bonfire.UI.Social\n![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Social](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) required to have a fully working federated social network app.\n\nThis extension is meant to be used by other extensions like [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social), which provides logic for the UI to work with/\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Social.html"},{"type":"extras","title":"Stack - Bonfire.UI.Social","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Social.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Social","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Social.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Social","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Social.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Social","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Social.Graph","doc":"# Bonfire.UI.Social.Graph\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Social.Graph` is an extension that includes some User Interfaces (routes, pages and components) for following and otherwise managing one's network in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.SocialGraph.html"},{"type":"extras","title":"Stack - Bonfire.UI.Social.Graph","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.SocialGraph.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Social.Graph","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.SocialGraph.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Social.Graph","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.SocialGraph.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Social.Graph","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.SocialGraph.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Posts","doc":"# Bonfire.UI.Posts\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Posts` is an extension that includes some User Interfaces (routes, pages and components) for writing and reading posts in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Posts.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Posts.html"},{"type":"extras","title":"Stack - Bonfire.UI.Posts","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Posts.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Posts","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Posts.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Posts","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Posts.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Posts","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Posts.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Messages","doc":"# Bonfire.UI.Messages\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Messages` is an extension that includes some User Interfaces (routes, pages and components) for messaging in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Messages.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Messages.html"},{"type":"extras","title":"Stack - Bonfire.UI.Messages","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Messages.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Messages","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Messages.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Messages","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Messages.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Messages","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Messages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Reactions","doc":"# Bonfire.UI.Reactions\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Reactions` is an extension that includes some User Interfaces (routes, pages and components) for liking, boosting, pinning, bookmarking, etc, in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Reactions.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Reactions.html"},{"type":"extras","title":"Stack - Bonfire.UI.Reactions","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Reactions.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Reactions","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Reactions.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Reactions","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Reactions.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Reactions","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Reactions.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Moderation","doc":"# Bonfire.UI.Moderation\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Moderation` is an extension that includes some User Interfaces (routes, pages and components) for flagging content and moderation in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Moderation.html"},{"type":"extras","title":"Stack - Bonfire.UI.Moderation","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Moderation.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Moderation","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Moderation.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Moderation","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Moderation.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Moderation","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Moderation.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Topics","doc":"# Bonfire.UI.Topics\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles UI for:\n\n- Browsing and using topics\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Topics.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Topics","doc":"","ref":"Bonfire.UI.Topics.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Topics","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Topics.html#copyright-and-license"},{"type":"extras","title":"Bonfire UI Groups","doc":"# Bonfire UI Groups\n\nPages and UI components for groups in Bonfire.\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Groups.html"},{"type":"extras","title":"Roadmap - Bonfire UI Groups","doc":"[Group Milestone](https://github.com/bonfire-networks/bonfire-app/milestone/33)","ref":"Bonfire.UI.Groups.html#roadmap"},{"type":"extras","title":"Sponsors - Bonfire UI Groups","doc":"[Nlnet](https://nlnet.nl/project/Bonfire-FederatedGroups/index.html) | [Become a sponsor](https://opencollective.com/bonfire-networks)","ref":"Bonfire.UI.Groups.html#sponsors"},{"type":"extras","title":"📖 Documentation - Bonfire UI Groups","doc":"* [Website](https://bonfirenetworks.org) \n* [Set up an instance](docs/DEPLOY.md) - for testing and evaluation only!\n* [Hacking on Bonfire](docs/HACKING.md) \n* [Code documentation](https://doc.bonfirenetworks.org/api-reference.html#content) \n* [Community chat](https://matrix.to/#/%23bonfire-networks:matrix.org)","ref":"Bonfire.UI.Groups.html#documentation"},{"type":"extras","title":"Copyright and License - Bonfire UI Groups","doc":"Copyright (c) 2020-2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Groups.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.ValueFlows","doc":"# Bonfire.UI.ValueFlows\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Valueflows.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.ValueFlows","doc":"","ref":"Bonfire.UI.Valueflows.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.ValueFlows","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Valueflows.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Kanban","doc":"# Bonfire.UI.Kanban\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for a kanban app","ref":"Bonfire.UI.Kanban.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Kanban","doc":"","ref":"Bonfire.UI.Kanban.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Kanban","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Kanban.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Coordination","doc":"# Bonfire.UI.Coordination\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Coordination.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Coordination","doc":"","ref":"Bonfire.UI.Coordination.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Coordination","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Coordination.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Reflow","doc":"# Bonfire.UI.Reflow\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Reflow.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Reflow","doc":"","ref":"Bonfire.UI.Reflow.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Reflow","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Reflow.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Files","doc":"# Bonfire.Files\n\nFile management extension for Bonfire. \n\nBonfire Files wraps the `Entrepot` a file management library, \nadding support for media type checking, image resizing, and the like, \nalong with creating a [pointable][1] table for storage of file data.\n\n[1]: https://github.com/bonfire-networks/needle","ref":"Bonfire.Files.html"},{"type":"extras","title":"Configuration - Bonfire.Files","doc":"","ref":"Bonfire.Files.html#configuration"},{"type":"extras","title":"TODO's - Bonfire.Files","doc":"- Generate docs\n- More tests","ref":"Bonfire.Files.html#todo-s"},{"type":"extras","title":"Bonfire.Common","doc":"# Bonfire.Common\n\nA library of common utils and helpers used across Bonfire extensions.\n\nAn extension for [Bonfire](https://bonfire.cafe/) that contains:\n\n- Many common functions in `Bonfire.Common.Utils`\n- Path and URL generators in `Bonfire.Common.URIs`\n- Date and time helpers in `Bonfire.Common.DatesTimes`\n- Etc","ref":"Bonfire.Common.html"},{"type":"extras","title":"Handy commands - Bonfire.Common","doc":"","ref":"Bonfire.Common.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Common","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Common.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Epics","doc":"# Bonfire.Epics\n\nEpics are a extensible way of structuring tasks.\n\nThis library is designed to provide a structured way to define and execute complex workflows in Elixir applications. It introduces the concept of \"Epics\" and \"Acts\" to organize and run sequences of operations.","ref":"Bonfire.Epics.html"},{"type":"extras","title":"Key components and concepts: - Bonfire.Epics","doc":"- `Bonfire.Epics.Epic`: An Epic represents a complete workflow or process. It's a container that holds a sequence of Acts to be executed, along with state information, errors, and assigned values.\n- `Bonfire.Epics.Act`: An Act is an individual step or operation within an Epic. Each Act is typically a module that implements a specific task or functionality.\n- Execution Flow & Parallel Execution: Epics are executed by running their Acts in sequence. The library provides mechanisms to define, modify, and run these sequences. The library supports running multiple Acts in parallel for improved performance in certain scenarios.\n- Shared State: An Epic can maintain state throughout its execution using the 'assigns' map, allowing data to be passed between Acts.\n- Configurable: Epics can be defined in configuration, including at runtime, making it easy to set up and modify workflows without changing code.\n- Database Transactions: See the `Bonfire.Ecto` library for helpers to queue changeset operations within Acts and then run them all together in a single transaction: https://github.com/bonfire-networks/bonfire_ecto\n- Error Handling: The library includes built-in error handling, allowing errors to be captured and associated with specific Acts within an Epic.\n\nThis library is particularly useful for applications that need to manage complex, multi-step tasks with error handling and state management. It provides a flexible and extensible way to define, configure, and execute these processes, making it easier to maintain and modify complex workflows.","ref":"Bonfire.Epics.html#key-components-and-concepts"},{"type":"extras","title":"How it works - Bonfire.Epics","doc":"1. Each Act is implemented as a module with a `run/2` function that performs a specific task.\n2. Users define an Epic, either in code or configuration, as sequences of Acts.\n3. When the Epic is run, it executes each Act in sequence (or with some Acts optionally running in parallel), maintaining state and handling errors along the way. Acts can update the Epic's state, adding errors, and assigning values that can be used by subsequent Acts.\n4. After all Acts are executed, the final state of the Epic is returned, including any errors or assigned values.","ref":"Bonfire.Epics.html#how-it-works"},{"type":"extras","title":"1. How to write an Act - Bonfire.Epics","doc":"Write a module with a `run/2` function that takes an Epic and an Act, performs a specific task, and returns an Epic.\n\n```elixir\ndefmodule Bonfire.Label.Acts.LabelObject do\n @moduledoc \"\"\"\n Takes an object and label and returns a changeset for labeling that object. \n Implements `Bonfire.Epics.Act`.\n\n Epic Options:\n * `:current_user` - user that will create the page, required.\n\n Act Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.\n \"\"\"\n\n use Arrows\n import Bonfire.Epics\n\n @doc false\n def run(epic, act) do\n current_user = Bonfire.Common.Utils.current_user(epic.assigns[:options])\n\n cond do\n epic.errors != [] ->\n maybe_debug(\n epic,\n act,\n length(epic.errors),\n \"Skipping due to epic errors\"\n )\n\n epic\n\n not (is_struct(current_user) or is_binary(current_user)) ->\n maybe_debug(\n epic,\n act,\n current_user,\n \"Skipping due to missing current_user\"\n )\n\n epic\n\n true ->\n as = Keyword.get(act.options, :as) || Keyword.get(act.options, :on, :label)\n object_key = Keyword.get(act.options, :object, :object)\n\n label = Keyword.get(epic.assigns[:options], as, [])\n object = Keyword.get(epic.assigns[:options], object_key, nil)\n\n Bonfire.Label.Labelling.label_object(label, object,\n return: :changeset,\n current_user: current_user\n )\n |> Map.put(:action, :insert)\n |> Bonfire.Epics.Epic.assign(epic, as, ...)\n |> Bonfire.Ecto.Acts.Work.add(:label)\n end\n end\nend\n```","ref":"Bonfire.Epics.html#1-how-to-write-an-act"},{"type":"extras","title":"2. How to define an Epic - Bonfire.Epics","doc":"","ref":"Bonfire.Epics.html#2-how-to-define-an-epic"},{"type":"extras","title":"Simple Epic where each Act executes sequentially - Bonfire.Epics","doc":"```elixir\n @page_act_opts [on: :page, attrs: :page_attrs]\n\n config :bonfire_pages, Bonfire.Pages,\n epics: [\n create: [\n # Create a changeset for insertion\n {Bonfire.Pages.Acts.Page.Create, @page_act_opts},\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, @page_act_opts},\n # a caretaker,\n {Bonfire.Me.Acts.Caretaker, @page_act_opts},\n # and a creator,\n {Bonfire.Me.Acts.Creator, @page_act_opts},\n # and possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, @page_act_opts},\n # possibly with uploaded files,\n {Bonfire.Files.Acts.AttachMedia, @page_act_opts},\n # with extracted tags fully hooked up,\n {Bonfire.Tag.Acts.Tag, @page_act_opts},\n # and the appropriate boundaries established,\n {Bonfire.Boundaries.Acts.SetBoundaries, @page_act_opts},\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, @page_act_opts}\n ]\n ]\n```","ref":"Bonfire.Epics.html#simple-epic-where-each-act-executes-sequentially"},{"type":"extras","title":"Advanced Epic, where some Acts execute in parallel - Bonfire.Epics","doc":"```elixir\n config :bonfire_posts, Bonfire.Posts,\n epics: [\n publish: [\n # Create a changeset for insertion\n Bonfire.Posts.Acts.Posts.Publish,\n # These next 3 Acts are run in parallel\n [\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, on: :post},\n\n # assign a caretaker,\n {Bonfire.Me.Acts.Caretaker, on: :post},\n\n # record the creator,\n {Bonfire.Me.Acts.Creator, on: :post}\n ],\n # These next 4 Acts are run in parallel (they run after the previous 3 because they depend on the outputs of those Acts)\n [\n # possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, on: :post},\n\n # possibly occurring in a thread,\n {Bonfire.Social.Acts.Threaded, on: :post},\n\n # with extracted tags/mentions fully hooked up,\n {Bonfire.Tag.Acts.Tag, on: :post},\n\n # maybe set as sensitive,\n {Bonfire.Social.Acts.Sensitivity, on: :post}\n ],\n # These next 3 Acts are run in parallel (they run after the previous 4 because they depend on the outputs of those Acts)\n [\n # possibly with uploaded/linked media (optionally depends on URLPreviews),\n {Bonfire.Files.Acts.AttachMedia, on: :post},\n\n # with appropriate boundaries established (depends on Threaded),\n {Bonfire.Boundaries.Acts.SetBoundaries, on: :post},\n\n # summarised by an activity (possibly appearing in feeds),\n {Bonfire.Social.Acts.Activity, on: :post}\n ],\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Preload data & Publish live feed updates via (in-memory) PubSub\n {Bonfire.Social.Acts.LivePush, on: :post},\n\n # These steps are run in parallel\n [\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, on: :post},\n\n # Prepare JSON for federation and add to queue (oban).\n {Bonfire.Social.Acts.Federate, on: :post}\n ],\n\n # Once the activity/object exists (depends on federation being done)\n {Bonfire.Tags.Acts.AutoBoost, on: :post}\n ]\n ]\n```","ref":"Bonfire.Epics.html#advanced-epic-where-some-acts-execute-in-parallel"},{"type":"extras","title":"3. How to run an Epic - Bonfire.Epics","doc":"```elixir\nBonfire.Epics.run_epic(Bonfire.Posts, :publish, on: :post)\n```","ref":"Bonfire.Epics.html#3-how-to-run-an-epic"},{"type":"extras","title":"Copyright and License - Bonfire.Epics","doc":"Copyright (c) 2022 Bonfire Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Bonfire.Epics.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Ecto","doc":"# Bonfire.Ecto\n\n`Bonfire.Ecto` contains `Ecto` transactional support as acts for `Bonfire.Epics`","ref":"Bonfire.Ecto.html"},{"type":"extras","title":"Introduction - Bonfire.Ecto","doc":"`Bonfire.Ecto` is designed to facilitate complex Ecto transaction handling within an Elixir application that uses `Bonfire.Epics` to execute a sequence of operations (or `Acts`). These modules provide a structured way to manage database transactions as a series of acts and managing them within an `Epic`, offering flexibility and control over database interactions, ensuring that transactions are executed efficiently.","ref":"Bonfire.Ecto.html#introduction"},{"type":"extras","title":"Modules Overview - Bonfire.Ecto","doc":"1. `Bonfire.Ecto.Acts.Begin`\n - Responsible for initiating a transaction if certain conditions are met. It ensures that the transaction is only started when it is sensible to do so, based on the current state of the `Epic`.\n\n2. `Bonfire.Ecto.Acts.Work`\n - Handles queued database operations within a transaction. Operations are queued using the `Bonfire.Ecto.Acts.Work.add/2` function and executed if there are no errors in the `Epic` or changesets.\n\n3. `Bonfire.Ecto.Acts.Commit`\n - A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.html#modules-overview"},{"type":"extras","title":"Usage - Bonfire.Ecto","doc":"#### 1. Initial Setup\n\nEnsure that you have `Ecto` and `Bonfire.Epics` installed and configured in your application, and then install this linrary.\n\n#### 2. Using `Bonfire.Ecto.Acts.Begin`\n\nRefer to `Bonfire.Epics` docs to define some `Act`s and `Epic`s: https://github.com/bonfire-networks/bonfire_epics\n\n#### 3. Queue database operation(s) in an Act \n\nQueue operations by calling the `Bonfire.Ecto.Acts.Work.add/2` function, providing the epic and a key representing the changeset to be processed.\n\n```elixir\nepic = Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n```\n\n#### 3. Add the three `Bonfire.Ecto` Acts to your Epic\n```\n # First come the Acts that prepare the changeset and call `Bonfire.Ecto.Acts.Work.add/2` to queue it\n\n # Open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Then can come some Acts that process the result of the transaction \n```","ref":"Bonfire.Ecto.html#usage"},{"type":"extras","title":"Bonfire.Classify","doc":"# Bonfire.Classify\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Defining categories/topics\n- Defining relationships (parent or related) between categories to create taxonomies\n\nUse Bonfire.Tag if you want to tag/classify posts or other objects with these categories/topics.","ref":"Bonfire.Classify.html"},{"type":"extras","title":"Handy commands - Bonfire.Classify","doc":"","ref":"Bonfire.Classify.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Classify","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Classify.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Tag","doc":"# Bonfire.Tag\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles tagging posts or other things:\n- @ mentions \n- #hashtags\n- others (e.g. with a Category from Bonfire.Classify or a location from Bonfire.Geolocate)","ref":"Bonfire.Tag.html"},{"type":"extras","title":"Handy commands - Bonfire.Tag","doc":"","ref":"Bonfire.Tag.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Tag","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Tag.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Label","doc":"# Bonfire.Label\n\nBonfire.Label is a powerful and flexible extension designed to enhance content moderation and improve online safety. Inspired by the design principles outlined by Prosocial Design (specifically the [Label Misleading Content & Add Links to Reliable Related Content](https://www.prosocialdesign.org/library/label-misleading-content-add-links-to-reliable-related-content) pattern), this library enables the addition of custom labels and descriptions to user-generated posts. \n\nThis feature aids in identifying and marking potentially misleading, harmful, or unsafe content, while also providing users with links to reliable and related information.","ref":"Bonfire.Label.html"},{"type":"extras","title":"Features - Bonfire.Label","doc":"- **Custom Labeling**: Easily add custom labels to posts, categorizing them based on content, reliability, and safety.\n- **Dynamic Descriptions**: Append descriptions to posts to provide context, warnings, or additional information.\n- **Link to Reliable Sources**: Option to include up to 3 links to authoritative sources for further reading or fact-checking.\n- **Configurable Settings**: Tailor the permission system to fit the specific governance of your platform.\n- **User-friendly Interface**: Intuitive tools for moderators and administrators to manage labels and descriptions.","ref":"Bonfire.Label.html#features"},{"type":"extras","title":"Copyright and License - Bonfire.Label","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Label.html#copyright-and-license"},{"type":"extras","title":"Bonfire.OpenScience","doc":"# Bonfire.OpenScience\n\nSee https://bonfirenetworks.org/app/open-science/","ref":"Bonfire.OpenScience.html"},{"type":"extras","title":"Copyright and License - Bonfire.OpenScience","doc":"Copyright (c) 2024 Bonfire and Open Science Network Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenScience.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Poll","doc":"# Bonfire.Poll\n\nAn extensions for asking questions, collecting options, and conducting ranked voting on [Bonfire](https://bonfire.cafe/)","ref":"Bonfire.Poll.html"},{"type":"extras","title":"Copyright and License - Bonfire.Poll","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Poll.html#copyright-and-license"},{"type":"extras","title":"Bonfire.OpenID","doc":"# Bonfire.OpenID\n\nAn extension to enable:\n- authenticating on Bonfire using an external identity using OpenID Connect\n- using your Bonfire identity to authenticate in other apps with OpenID Connect 1.0 or OAuth 2.0","ref":"Bonfire.OpenId.html"},{"type":"extras","title":"Copyright and License - Bonfire.OpenID","doc":"Powered by these libraries: \n- https://hex.pm/packages/boruta (MIT license)\n- https://hex.pm/packages/openid_connect (MIT license)\n\nExtension copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenId.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Search","doc":"# Bonfire.Search\n\nAn extension for [Bonfire](https://bonfire.cafe/) to handle:\n\n- Search indexing\n- Ultra-fast search\n- LiveView search UI\n\nYou can implement adapters for your prefered search backend. Currently adapters are included for:\n- Database\n- [Meili Search](https://www.meilisearch.com/)","ref":"Bonfire.Search.html"},{"type":"extras","title":"Development & Deployment Documentation - Bonfire.Search","doc":"This extension is meant to be used inside of a Bonfire app, so please refer to the main repo at: https://github.com/bonfire-networks/bonfire-app","ref":"Bonfire.Search.html#development-deployment-documentation"},{"type":"extras","title":"Copyright and License - Bonfire.Search","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Search.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Federate.ActivityPub","doc":"# Bonfire.Federate.ActivityPub\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Extensible/configurable tools for translating Bonfire data to/from ActivityStreams\n- Bonfire Adapter for the [ActivityPub federation library ](https://github.com/bonfire-networks/activity_pub)","ref":"Bonfire.FederateActivitypub.html"},{"type":"extras","title":"Testing - Bonfire.Federate.ActivityPub","doc":"There are unit tests both in this repo, and in the activity_pub lib, but they can't cover every possible federation case, so manual testing with e.g. `curl -H \"Accept: application/activity+json\" -v \"http://localhost:4001/pub/actors/my_username\" | jq '.'` and by trying out federation flows between instances of Bonfire and other ActivityPub implementation is a must.","ref":"Bonfire.FederateActivitypub.html#testing"},{"type":"extras","title":"Handy commands - Bonfire.Federate.ActivityPub","doc":"","ref":"Bonfire.FederateActivitypub.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Federate.ActivityPub","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.FederateActivitypub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Editor.Milkdown","doc":"# Bonfire.Editor.Milkdown\n\nBonfire composer based on the [Milkdown](https://milkdown.dev/) markdown editor","ref":"Bonfire.Editor.Milkdown.html"},{"type":"extras","title":"ROADMAP - Bonfire.Editor.Milkdown","doc":"- [x] Add emojis using gemoji convention\n- [x] Show emojis suggestions when typing : followed by 2 chars\n- [x] Show mentions suggestions when typing @ followed by 2 chars\n- [x] Show formatting suggestions when typing /\n- [x] Insert emojis from the suggestions list\n- [x] Insert mentions from the suggestions list\n- [ ] Insert formatting from the suggestions list\n- [x] Add placeholder when missing text\n- [ ] Upload images by dragging them in the editor","ref":"Bonfire.Editor.Milkdown.html#roadmap"},{"type":"extras","title":"Copyright and License - Bonfire.Editor.Milkdown","doc":"Copyright (c) 2023 Bonfire, Milkdown, ProseMirror and Remark Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Editor.Milkdown.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Me","doc":"# Bonfire.Me\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Account creation\n- Email verification\n- Authentication\n- User/Profile creation\n- User/Profile switching\n- User Profile\n- Settings","ref":"Bonfire.Me.html"},{"type":"extras","title":"Handy commands - Bonfire.Me","doc":"","ref":"Bonfire.Me.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Me","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Me.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Social","doc":"# Bonfire.Social \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Feeds / Timelines\n- Activities\n- Threads\n- Boosting\n- Liking\n- Flagging\n- etc","ref":"Bonfire.Social.html"},{"type":"extras","title":"Handy commands - Bonfire.Social","doc":"","ref":"Bonfire.Social.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Social","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Social.Graph","doc":"# Bonfire.Social.Graph \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Following\n- Follow Requests\n- Social graph analysis","ref":"Bonfire.SocialGraph.html"},{"type":"extras","title":"Handy commands - Bonfire.Social.Graph","doc":"","ref":"Bonfire.SocialGraph.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Social.Graph","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.SocialGraph.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Posts","doc":"# Bonfire.Posts \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Creating and reading posts","ref":"Bonfire.Posts.html"},{"type":"extras","title":"Handy commands - Bonfire.Posts","doc":"","ref":"Bonfire.Posts.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Posts","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Posts.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Messages","doc":"# Bonfire.Messages \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- DM\n- Group messaging","ref":"Bonfire.Messages.html"},{"type":"extras","title":"Handy commands - Bonfire.Messages","doc":"","ref":"Bonfire.Messages.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Messages","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Messages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Invite.Links","doc":"# Bonfire.Invite.Links\n\nAn extension for [Bonfire](https://bonfire.cafe/) to generate invite links","ref":"Bonfire.InviteLinks.html"},{"type":"extras","title":"Handy commands - Bonfire.Invite.Links","doc":"","ref":"Bonfire.InviteLinks.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Invite.Links","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.InviteLinks.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Pages","doc":"# Bonfire.Pages\n\nBasic CMS","ref":"Bonfire.Pages.html"},{"type":"extras","title":"Copyright and License - Bonfire.Pages","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Pages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Quantify","doc":"# Bonfire.Quantify\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Units\n- Measures","ref":"Bonfire.Quantify.html"},{"type":"extras","title":"Handy commands - Bonfire.Quantify","doc":"","ref":"Bonfire.Quantify.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Quantify","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Quantify.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Geolocate","doc":"# Bonfire.Geolocate\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Geolocation schema\n- Optional GraphQL API for geolocations\n- Geocoding of addresses\n- Reverse geocoding","ref":"Bonfire.Geolocate.html"},{"type":"extras","title":"Usage - Bonfire.Geolocate","doc":"If you want to use the map LiveView component, you will need to `npm add leaflet --save --prefix assets/` in your app, and import","ref":"Bonfire.Geolocate.html#usage"},{"type":"extras","title":"Handy commands - Bonfire.Geolocate","doc":"","ref":"Bonfire.Geolocate.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Geolocate","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Geolocate.html#copyright-and-license"},{"type":"extras","title":"ValueFlows","doc":"# ValueFlows\n\n`ValueFlows` is a [Bonfire](https://bonfire.cafe/) extension that implements [ValueFlows](https://valueflo.ws/) for federated networks to conduct economic activities.\n\nImplemented so far:\n\n- Intent\n- Proposal\n- Economic Event\n- Types of Action\n- Resource Specification\n- Economic Resource\n- Process Specification\n- Process\n- Claim (WIP)\n- Value Calculations (WIP)\n\nAs well as an optional GraphQL API for all of the above...","ref":"Bonfire.Valueflows.html"},{"type":"extras","title":"Handy commands - ValueFlows","doc":"","ref":"Bonfire.Valueflows.html#handy-commands"},{"type":"extras","title":"Copyright and License - ValueFlows","doc":"Copyright (c) 2021 ValueFlows, CommonsPub, Reflow & Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Valueflows.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Breadpub","doc":"# Bonfire.Breadpub\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.Breadpub.html"},{"type":"extras","title":"Handy commands - Bonfire.Breadpub","doc":"","ref":"Bonfire.Breadpub.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Breadpub","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Breadpub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.ValueFlows.Observe","doc":"# Bonfire.ValueFlows.Observe\n\nAn extension for [ValueFlows](https://valueflo.ws/) on [Bonfire](https://bonfire.cafe/) that handles:\n\n- Observations\n - with measurements\n - with other phenomena","ref":"Bonfire.ValueflowsObserve.html"},{"type":"extras","title":"Handy commands - Bonfire.ValueFlows.Observe","doc":"","ref":"Bonfire.ValueflowsObserve.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.ValueFlows.Observe","doc":"Copyright (c) 2020 Bonfire and ValueFlows Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.ValueflowsObserve.html#copyright-and-license"},{"type":"extras","title":"Bonfire:Upcycle","doc":"# Bonfire:Upcycle\n\nUpcycle supports a network of high school fablabs in Milwaukee that receive contributions of materials from organizations in the community and share these with each other. It is implemented as a UI for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows), which are both available as extensions for [Bonfire](https://bonfire.cafe/). Upcycle was initially created for [LearnDeep](https://learndeep.org/) by students at [MSOE](https://www.msoe.edu/), and is now being maintained by the Bonfire team.","ref":"Bonfire.Upcycle.html"},{"type":"extras","title":"Set up - Bonfire:Upcycle","doc":"Upcycle is packaged as part of the `cooperation` flavour of Bonfire. Check out the development or deployment [docs](https://doc.bonfirenetworks.org/readme.html) to get started.","ref":"Bonfire.Upcycle.html#set-up"},{"type":"extras","title":"Copyright and License - Bonfire:Upcycle","doc":"Copyright (c) 2022 all contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Upcycle.html#copyright-and-license"},{"type":"extras","title":"Bonfire","doc":"# Bonfire \n\nAn essential Bonfire extension that bootstraps any other enabled extensions and starts the app. Also includes views such as the homepage and dashboard.\n\nSee https://github.com/bonfire-networks/bonfire-app for an example umbrella app (actually a [poncho](https://embedded-elixir.com/post/2017-05-19-poncho-projects/) since Bonfire is not a monorepo) if you want to run this, and https://bonfirenetworks.org for details about Bonfire.","ref":"Bonfire.html"},{"type":"extras","title":"ActivityPub","doc":"# ActivityPub\n\nActivityPub Library for elixir.\n\n**WORK IN PROGRESS, TESTING FEDERATION WITH DIFFERENT IMPLEMENTATIONS IS UNDERWAY**","ref":"ActivityPub.html"},{"type":"extras","title":"Installation - ActivityPub","doc":"1. Add this library to your dependencies in `mix.exs`\n\n```\ndefp deps do\n [...]\n {:activity_pub, git: \"https://github.com/bonfire-networks/activity_pub.git\", branch: \"stable\"} # branch can \"stable\", or \"develop\" for the bleeding edge\nend\n```\n\n2. Create an adapter module. To start, one created at\n `lib/my_app/adapter.ex` might look like\n\n```elixir\ndefmodule MyApp.Adapter do\n @moduledoc \"\"\"\n Adapter functions delegated from the `ActivityPub` Library\n \"\"\"\n\n @behaviour ActivityPub.Federator.Adapter\nend\n```\n\nNote that, due to the defined `@behavior`, Elixir will warn you that\nthe required functions\n\n * `base_url/0`\n * `get_actor_by_id/1`\n * `get_actor_by_username/1`\n * `get_follower_local_ids/1`\n * `get_following_local_ids/1`\n * `get_redirect_url/1`\n * `handle_activity/1`\n * `maybe_create_remote_actor/1`\n * `maybe_publish_object/2`\n * `update_local_actor/2`\n * `update_remote_actor/1`\n\nhave not yet been implemented though you will be able to start your\napp. Defining these allows `ActivityPub` to handle ActivityPub HTTP\nand database calls and operations. An example of an implemented\nadaptor can be found\n[here](https://github.com/bonfire-networks/bonfire_federate_activitypub/tree/main/lib/adapter\n\"Link to file hosted on GitHub\").\n\nThen set it in config\n\n```\nconfig :activity_pub, :adapter, MyApp.Adapter\n```\n\n3. Set your application repo in config\n\n```\nconfig :activity_pub, :repo, MyApp.Repo\n```\n\n4. Create a new ecto migration and call `ActivityPub.Migration.up/0` from it\n\n5. Inject AP routes to your router by adding `use ActivityPub.Web.Router` to your app's router module\n\n6. Copy the default AP config to your app's confix.exs\n\n```\nconfig :activity_pub, :mrf_simple,\n media_removal: [],\n media_nsfw: [],\n report_removal: [],\n accept: [],\n avatar_removal: [],\n banner_removal: []\n\nconfig :activity_pub, :instance,\n hostname: \"example.com\",\n federation_publisher_modules: [ActivityPub.Federator.APPublisher],\n federation_reachability_timeout_days: 7,\n federating: true,\n rewrite_policy: []\n\nconfig :activity_pub, :http,\n proxy_url: nil,\n user_agent: \"Your app name\",\n send_user_agent: true,\n adapter: [\n ssl_options: [\n # Workaround for remote server certificate chain issues\n partial_chain: &:hackney_connect.partial_chain/1,\n # We don't support TLS v1.3 yet\n versions: [:tlsv1, :\"tlsv1.1\", :\"tlsv1.2\"]\n ]\n ]\n ```\n\n7. Change the hostname value in the instance config block to your instance's hostname \n\n8. If you don't already have Oban set up, follow the [Oban installation intructions](https://hexdocs.pm/oban/installation.html#content) and add the AP queues:\n\n```\nconfig :my_app, Oban, queues: [federator_incoming: 50, federator_outgoing: 50, remote_fetcher: 20]\n```\n\nNow you should be able to compile and run your app and move over to integration.","ref":"ActivityPub.html#installation"},{"type":"extras","title":"Needle.UID","doc":"# Needle.UID\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle_uid)](https://hex.pm/packages/needle_uid)\n[hexdocs](https://hexdocs.pm/needle_uid)\n\nHybrid prefixed UUIDv7 and ULID data type for Ecto (using [pride](https://github.com/bonfire-networks/pride) and [needle_ulid](https://github.com/bonfire-networks/needle_ulid))","ref":"Needle.Uid.html"},{"type":"extras","title":"Installation - Needle.UID","doc":"```elixir\n{:needle_uid, git: \"https://github.com/bonfire-networks/needle_uid\", branch: \"main\"}\n```","ref":"Needle.Uid.html#installation"},{"type":"extras","title":"Copyright and License - Needle.UID","doc":"Copyright (c) 2024 Bonfire contributors\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.Uid.html#copyright-and-license"},{"type":"extras","title":"Needle.ULID","doc":"# Needle.ULID\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle_ulid)](https://hex.pm/packages/needle_ulid)\n[hexdocs](https://hexdocs.pm/needle_ulid)\n\nA ULID datatype and some postgres support for ULID operations (`min` and `max` functions and aggregates)\n\nOriginally forked from\n[ecto-ulid](https://github.com/TheRealReal/ecto-ulid) but the internals have been replaced with a dependency on [ex_ulid](https://github.com/omgnetwork/ex_ulid)","ref":"Needle.Ulid.html"},{"type":"extras","title":"Installation - Needle.ULID","doc":"```elixir\n{:needle_ulid, git: \"https://github.com/bonfire-networks/needle_ulid\", branch: \"main\"}\n```","ref":"Needle.Ulid.html#installation"},{"type":"extras","title":"Copyright and License - Needle.ULID","doc":"Copyright (c) 2021 Bonfire contributors.\nCopyright (c) 2018 The RealReal, Inc.\nCopyright (c) 2020 needle_ulid contributors.\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.Ulid.html#copyright-and-license"},{"type":"extras","title":"EctoSparkles","doc":"# EctoSparkles\n\nSome helpers to sparkle on top of [Ecto](https://hexdocs.pm/ecto/Ecto.html) \n\n- [`EctoSparkles.proload/3`](#proload-documentation) and `EctoSparkles.join_preload/2` to join and preload associations with less verbosity\n- [`EctoSparkles.reusable_join/5`](#reusable_join-documentation) to avoid duplicating joins \n- `EctoSparkles.Migrator` to run migrations, rollbacks, etc in a release and `EctoSparkles.AutoMigrator` to automatically run them at startup.\n- `EctoSparkles.DataMigration`: a behaviour implemented for data migrations (generally backfills).\n- `EctoSparkles.Log` to log slow or possible N+1 queries with telemetry (showing stacktraces)\n- `EctoSparkles.Changesets.Errors` to generate readable errors for changesets\n\nNOTE: you need to put something like `config :ecto_sparkles, :otp_app, :your_otp_app_name` in your app's config.\n\n\n## `proload` documentation\n\nA macro which tells Ecto to perform a join and preload of associations.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\n\nYou can make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see examples below).","ref":"EctoSparkles.html"},{"type":"extras","title":"Examples using standard Ecto - EctoSparkles","doc":"```\n query\n |> join(:left, [o, activity: activity], assoc(:object), as: :object)\n |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})\n```\n\nEcto requires calling three different functions for this operation: `Query.join/4`, `Query.assoc/3` and `Query.preload/2`. \n\nHere's another example:\n\n```\n Invoice\n |> join(:left, [i], assoc(i, :customer), as: :customer)\n |> join(:left, [i], assoc(i, :lines), as: :lines)\n |> preload([lines: v, customers: c], lines: v, customer: c)\n```","ref":"EctoSparkles.html#examples-using-standard-ecto"},{"type":"extras","title":"Example using proload - EctoSparkles","doc":"With `proload`, you can accomplish this with just one line of code:\n\n```\nproload(query, activity: [:object])\n```\n\nAnd for the other example:\n```\nproload(Invoice, [:customer, :lines])\n```\n\nAs a bonus, it automatically makes use of `reusable_join` so calling it multiple times with the same association has no ill effects.","ref":"EctoSparkles.html#example-using-proload"},{"type":"extras","title":"Example using join_preload - EctoSparkles","doc":"`join_preload` is `proload`'s sister macro with a slightly different syntax:\n\n```\n join_preload(query, [:activity, :object])\n```\n\nand:\n```\n Invoice\n |> join_preload(:customer)\n |> join_preload(:lines)\n```\n\n\n## `reusable_join` documentation\n\nA macro similar to `Ecto.Query.join/{4,5}`, but can be called multiple times \nwith the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, its mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#example-using-join_preload"},{"type":"extras","title":"Creating reusable joins - EctoSparkles","doc":"```elixir\nquery\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_a)\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_b)\n```","ref":"EctoSparkles.html#creating-reusable-joins"},{"type":"extras","title":"Copyright - EctoSparkles","doc":"- Copyright (c) 2021 Bonfire developers\n- Copyright (c) 2020 Up Learn\n- Copyright (c) 2019 Joshua Nussbaum \n\n- `join_preload` was originally forked from [Ecto.Preloader](https://github.com/joshnuss/ecto_preloader), licensed under WTFPL)\n- `reusable_join` was originally forked from [QueryElf](https://gitlab.com/up-learn-uk/query-elf), licensed under Apache License Version 2.0\n- original code licensed under Apache License Version 2.0","ref":"EctoSparkles.html#copyright"},{"type":"extras","title":"Iconify for Phoenix","doc":"# Iconify for Phoenix\n\nPhoenix helpers for using 100,000+ SVG icons from 100+ icon sets compiled by [Iconify](https://icon-sets.iconify.design) (visit that site to browse the sets available and preview the icons)\n\nIt copies only the icons you use from the iconify library into your project, preparing them on-the-fly when you first use an icon in a view or component (either at compile time if using the Surface component, or on the first run during development).\n\nIt can be configured to embed the icons one of three ways:\n- `css` (default): generate a single CSS file containing SVGs of all the icons used \n- `img` (default for emojis): to create SVG files in your static assets, used to be included with `img` tags and loaded over HTTP (you may want to include [svg-inject](https://github.com/iconfu/svg-inject) on your site to enable styling of the SVGs, e.g. to change their colour)\n- `inline`: to generate a Phoenix Component for each icon used, used to embed the icons as `svg` tags inline in the HTML of your views (meaning the SVG will be included in LiveView diffs)\n- `set`: to generate an SVG sprite set for each family, and reference icons with a `use` tag inside of inline SVGs.\n\nThere is also an optional integration of [phoenix_live_favicon](https://github.com/BartOtten/phoenix_live_favicon) so you can set an icon (or emoji) as favicon on a page with `Iconify.maybe_set_favicon(socket, icon_name_or_emoji)`.","ref":"IconifyEx.html"},{"type":"extras","title":"Installation - Iconify for Phoenix","doc":"```elixir\ndef deps do\n [\n {:iconify_ex, \"~> 0.1.0\"}\n ]\nend\n```\n\nAfter running `mix deps.get` you need to fetch the latest [iconify icon sets](https://github.com/iconify/icon-sets) by running something like:\n```bash\ncd deps/iconify_ex/assets && yarn && cd -\n```","ref":"IconifyEx.html#installation"},{"type":"extras","title":"Usage - Iconify for Phoenix","doc":"1. Add `import Iconify` in your Phoenix or LiveView module where you want to use it (or just once in the macros in your Web module). \n\n2. Set one of these options in config to choose which approach you want to use (see above for explanations):\n- `config :iconify_ex, :mode, :css` \n- `config :iconify_ex, :mode, :img` \n- `config :iconify_ex, :mode, :inline` \n- `config :iconify_ex, :mode, :set` \n\nIf using CSS mode, you'll need to include the CSS file in your layout (e.g. ` ` in your app's equivalent of `lib/my_app_web/components/layouts/root.html.heex`) and set some default styles that will be applied to all icons, by adding something like this to your app's main CSS (e.g. `assets/css/app.css`):\n```css\n[iconify] {\n background-color: currentColor;\n -webkit-mask-size: cover;\n mask-size: cover;\n min-width: 0.5rem;\n min-height: 0.5rem;\n}\n```\n\nOther configurations include:\n\n```elixir\nconfig :iconify_ex, :fallback_icon, \"heroicons-solid:question-mark-circle\" # when an icon is not found\nconfig :iconify_ex, :generated_icon_modules_path, \"./lib/web/icons\" # for :inline mode\nconfig :iconify_ex, :generated_icon_static_path, \"./priv/static/images/icons\" # where CSS and images are stored\nconfig :iconify_ex, :generated_icon_static_url, \"/images/icons/\" # where CSS and images are served from\n```\n\n3. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:\n\nEmbed an icon using default classes (copy the icon name from the [iconify website](https://icon-sets.iconify.design)):\n```html\n<.iconify icon=\"heroicons-solid:collection\" />\n```\n\nSpecify custom classes:\n```html\n<.iconify icon=\"heroicons-solid:collection\" class=\"w-8 h-8 text-base-content\" /> \n```\n\nOr if you use [Surface](https://surface-ui.org), it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:\n\nAdd `alias Iconify.Icon` to your Web module, and then:\n\n```html\n<#Icon iconify=\"heroicons-solid:collection\" />\n```\n\nIf your icon is dynamic, you'll still want to use the first form:\n```html\n<.iconify icon={@my_icon} />\n```\n\nNote: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like `sort -u -o icons_dir/icons.css icons_dir/icons.css` to clean up the CSS file.","ref":"IconifyEx.html#usage"},{"type":"extras","title":"Entrepôt","doc":"# Entrepôt\n\nMinimal, composable file upload, storage, and streamed data migrations for Elixir apps, flexibly and with minimal dependencies.\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot.svg)](https://hex.pm/packages/entrepot)\n[![CI status](https://github.com/bonfire-networks/entrepot/workflows/CI/badge.svg)](https://github.com/bonfire-networks/entrepot/actions)\n\n:warning: Although it's been used in production for over a year without issue, Entrepôt is experimental and still in active development. Accepting file uploads introduces specific security vulnerabilities. Use at your own risk.","ref":"Entrepot.html"},{"type":"extras","title":"Concepts - Entrepôt","doc":"Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: [storage](#storage), [upload](#upload), [locator](#locator), and optionally, [uploader](#uploader), which provides a more ergonomic API for the other 3.\n\nIt is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.\n\nSo what does it do? Here's a theoretical example of a use case with an Ecto 1 schema, which stores the file retrieved from a URL, along with some additional metadata:\n\n```\n def create_attachment(upload, user) do\n Multi.new()\n |> Multi.run(:upload, fn _, _ ->\n YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())\n end)\n |> Multi.insert(:attachment, fn %{upload: file_id} ->\n %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: \"document\"})\n end)\n |> Repo.transaction()\n end\n```\n\nThen to access the file:\n\n```\n%Attachment{file_data: file} = attachment\n\n{:ok, contents} = Disk.read(file.id)\n```\n\n 1 *See [integrations](#integrations) for streamlined use with Ecto.*","ref":"Entrepot.html#concepts"},{"type":"extras","title":"Storage - Entrepôt","doc":"A \"storage\" is a [behaviour](https://elixirschool.com/en/lessons/advanced/behaviours/) that implements the following \"file-like\" callbacks:\n\n* read\n* put\n* delete\n\nImplementing your own storage is as easy as creating a module that quacks this way. Each callback should accept an optional list of options as the last arg. Which options are supported is up to the module that implements the callbacks.","ref":"Entrepot.html#storage"},{"type":"extras","title":"Upload - Entrepôt","doc":"Upload is a [protocol](https://elixir-lang.org/getting-started/protocols.html) consisting of the following two functions:\n\n* contents\n* name\n\nA storage uses this interface to figure how to extract the file data from a given struct and how to identify it. See `Entrepot.Locator` for an example of how this protocol can be implemented.","ref":"Entrepot.html#upload"},{"type":"extras","title":"Locator - Entrepôt","doc":"Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.\n\nLocator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for \"promoting\" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage 2 :\n\n```\nold_file_data = %Locator{id: \"/path/to/file.jpg\", storage: Disk, metadata: %{}}\n{:ok, new_id} = S3.put(old_file_data)`\n```\n\nNote: always remember to take care of cleaning up the old file as Entrepot *never* automatically removes files:\n\n`Disk.delete(old_file_data.id)`","ref":"Entrepot.html#locator"},{"type":"extras","title":"Uploader - Entrepôt","doc":"This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can `use` the uploader to codify the handling for specific types of assets.\n\n```\ndefmodule AvatarUploader do\n use Entrepot.Uploader, storages: [cache: Disk, store: S3]\n\n def build_options(upload, :cache, opts) do\n Keyword.put(opts, :prefix, \"cache/#{Date.utc_today()}\")\n end\n\n def build_options(upload, :store, opts) do\n opts\n |> Keyword.put(:prefix, \"users/#{opts[:user_id]}/avatar\")\n |> Keyword.drop([:user_id])\n end\n\n def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()]\nend\n```\n\nThen you can get the files where they need to be without constructing all the options everywhere they might be uploaded: `AvatarUploader.store(upload, :store, user_id: 1)`\n\nNote: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.","ref":"Entrepot.html#uploader"},{"type":"extras","title":"Built-in Integrations - Entrepôt","doc":"Entrepôt's module design is intended to make it easy to implement your own custom utilities for handling files in the way you need. However, anticipating the most common use cases, that is facilitated with the following optional modules and add-on library.\n\nThere are several implementations some common file storages (including S3/Digital Ocean) and uploads (including `Plug.Upload`).","ref":"Entrepot.html#built-in-integrations"},{"type":"extras","title":"Storages - Entrepôt","doc":"Entrepôt ships with the following storage implementations:\n\n- [Disk](#Disk)\n- [S3](#S3)\n- [RAM](#RAM)","ref":"Entrepot.html#storages"},{"type":"extras","title":"Disk - Entrepôt","doc":"This saves uploaded files to a local disk. It is useful for caching uploads while you validate other data, and/or perform some file processing.\n\n#### configuration\n\n- To set the root directory where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.Disk, root_dir: \"tmp\")`\n\n#### options\n\n- `prefix`: This should be a valid system path that will be appended to the root. If it does not exist, Disk will create it.\n- `force`: If this option is set to a truthy value, Disk will overwrite any existing file at the derived path. Use with caution!\n\n#### notes\n\nSince it is possible for files with the same name to be uploaded multiple times, Disk needs some additional info to uniquely identify the file. Disk _does not_ overwrite files with the same name by default. To ensure an upload can be stored, the combination of the `Upload.name` and `prefix` should be unique.","ref":"Entrepot.html#disk"},{"type":"extras","title":"S3 - Entrepôt","doc":"This storage uploads files to [AWS's S3](https://aws.amazon.com/s3/) service. It also works with [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/).\n\n#### configuration\n\n- To set the bucket where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: \"whatever\")`\n\n#### options\n\n- prefix: A string to prepend to the upload's key\n- s3_options: Keyword list of option that will passed directly to ex_aws_s3\n\n#### dependencies\n\nSome of the implementations might require further dependencies (currently only [S3](#s3)-compatible storage) that you will also need to add to your project's deps\n```\n{:ex_aws, \"~> 2.0\"}\n{:ex_aws_s3, \"~> 2.0\"}\n```","ref":"Entrepot.html#s3"},{"type":"extras","title":"RAM - Entrepôt","doc":"Uses Elixir's [StringIO](https://hexdocs.pm/elixir/StringIO.html) module to store file contents in memory. Since the \"files\" are essentially just strings, they will not be persisted and will error if they are read back from a database, for example. However, operations are correspondingly very fast and thus suitable for tests or other temporary file operations.","ref":"Entrepot.html#ram"},{"type":"extras","title":"uploads - Entrepôt","doc":"There are implementation of the `Entrepot.Upload` protocol for the following modules:\n\n- [URI](#URI)\n- [Plug.Upload](#plugupload)","ref":"Entrepot.html#uploads"},{"type":"extras","title":"URI - Entrepôt","doc":"This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a [TUS server](https://tus.io/).\n\nYou can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:\n\n```\ndef attach(conn, %{\"attachment\" => %{\"url\" => url}}) when url != \"\" do\n URI.parse(url)\n |> Disk.put(upload)\n\n # ...redirect, etc\nend\n```\n\n#### notes\n\nThis implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.","ref":"Entrepot.html#uri"},{"type":"extras","title":"Plug.Upload - Entrepôt","doc":"This supports multi-part form submissions handled by [Plug](https://hexdocs.pm/plug/Plug.Upload.html#content).\n\n## [EntrepôtEcto](https://github.com/bonfire-networks/entrepot_ecto)\n\nThere is an external library (because it needs Ecto as a dependency) which provides `Entrepot.Ecto.Type` for Ecto schema fields to easily handle persisting Locator data in your repository.\n\n---\n\nThat's it! Happy uploading.","ref":"Entrepot.html#plug-upload"},{"type":"extras","title":"EntrepôtEcto","doc":"# EntrepôtEcto\n\nEcto integration for [Entrepôt](https://github.com/bonfire-networks/entrepot)\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot_ecto.svg)](https://hex.pm/packages/entrepot_ecto)\n[![CI status](https://github.com/bonfire-networks/entrepot_ecto/workflows/CI/badge.svg)](https://github.com/bonfire-networks/capsulei_ecto/actions)\n\nThis package adds the following two features to support the use of Entrepôt with Ecto:\n\n1. Custom Type\n2. Changeset helper\n\n## `Entrepot.Ecto.Type`\n\nIn your Ecto schema specify your file field with the following type to get serialization of uploads (`Entrepot.Locator`) to maps:\n\n```\ndefmodule Attachment\n use Ecto.Schema\n\n schema \"attachments\" do\n field :file_data, Entrepot.Ecto.Type\n end\nend\n```\n\n## `Entrepot.Ecto.upload`\n\nCast params to uploaded data with `Entrepot.Ecto.upload`. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.\n\nIt is expected to return either a success tuple with the `Locator` struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.\n\nEven if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], fn {_field, upload}, changeset ->\n case Entrepot.Storages.Disk.put(upload) do\n {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)\n error_tuple -> add_error(changeset, \"upload just...failed\")\n end\n end)\n |> validate_attachment\n\n ```\n\nHowever, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], MyApp.Attacher, :attach)\n ```\n---","ref":"EntrepotEcto.html"},{"type":"extras","title":"Upload cleanup - EntrepôtEcto","doc":"Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).\n\nOne good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:\n\n ```\n def create_attachment(user, attrs) do\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)\n |> Repo.insert()\n |> case do\n {:ok, attachment} = success_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Attachment.promote_upload(attachment) end\n )\n\n success_tuple\n\n {:error, %{changes: %{file_data: file_data}}} = error_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Disk.delete(file_data.id) end\n )\n\n error_tuple\n end\n ```\n\nIn this example, `Attachment.promote_upload(attachment)` would handle moving the file and updating the file data in the db. It uses `Multi` to ensure all operations succeed or fail together:\n\n ```\n def promote_upload(attachment) do\n Multi.new()\n |> Multi.run(:copy_file, fn _, _ ->\n NetworkStorage.put(attachment.file_data.id)\n end)\n |> Multi.update(:updated_schema, fn %{move_file: new_data} ->\n Attachment.changeset(attachment, %{file_data: new_data })\n end)\n |> Multi.run(:delete_old_file, fn _, _ ->\n Disk.delete(attachment.file_data.id)\n end)\n |> Repo.transaction()\n end\n ```","ref":"EntrepotEcto.html#upload-cleanup"},{"type":"extras","title":"Testing - EntrepôtEcto","doc":"Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:\n\n ```\n %Attachment{\n file_data: %{\n id: \"fake.jpg\",\n metadata: %{name: \"fake\"}, size: 100\n }\n }\n |> Repo.insert!()\n ```\n\nIf you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.\n\nYou can configure your test environment to use the RAM storage:\n\n ```\n {:ok, id} = Entrepot.Storages.RAM.put(some_upload)\n\n Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})\n ```\n\nOr, for maximum performance, you can a simple struct that implements the `Upload` protocol:\n\n ```\n defmodule Entrepot.MockUpload do\n defstruct content: \"Hi, I'm a file\", name: \"hi\"\n\n defimpl Entrepot.Upload do\n def contents(mock), do: {:ok, mock.content}\n\n def name(mock), do: mock.name\n end\n end\n ```","ref":"EntrepotEcto.html#testing"},{"type":"extras","title":"Paginator","doc":"# Paginator\n\n[![Build status](https://github.com/duffelhq/paginator/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/duffelhq/paginator/actions?query=branch%3Amain)\n[![Inline docs](http://inch-ci.org/github/duffelhq/paginator.svg)](http://inch-ci.org/github/duffelhq/paginator)\n\n`Paginator` implements [cursor-based pagination](http://use-the-index-luke.com/no-offset) for Elixir [Ecto](https://github.com/elixir-ecto/ecto).\n\n[Documentation](https://hexdocs.pm/paginator)","ref":"Paginator.html"},{"type":"extras","title":"Why? - Paginator","doc":"There are several ways to implement pagination in a project and they all have pros and cons depending on your situation.","ref":"Paginator.html#why"},{"type":"extras","title":"Limit-offset - Paginator","doc":"This is the easiest method to use and implement: you just have to set `LIMIT` and `OFFSET` on your queries and the\ndatabase will return records based on this two parameters. Unfortunately, it has two major drawbacks:\n\n* Inconsistent results: if the dataset changes while you are querying, the results in the page will shift and your user\nmight end seeing records they have already seen and missing new ones.\n\n* Inefficiency: `OFFSET N` instructs the database to skip the first N results of a query. However, the database must still\nfetch these rows from disk and order them before it can returns the ones requested. If the dataset you are querying is\nlarge this will result in significant slowdowns.","ref":"Paginator.html#limit-offset"},{"type":"extras","title":"Cursor-based (a.k.a keyset pagination) - Paginator","doc":"This method relies on opaque cursor to figure out where to start selecting records. It is more performant than\n`LIMIT-OFFSET` because it can filter records without traversing all of them.\n\nIt's also consistent, any insertions/deletions before the current page will leave results unaffected.\n\nIt has some limitations though: for instance you can't jump directly to a specific page. This may\nnot be an issue for an API or if you use infinite scrolling on your website.","ref":"Paginator.html#cursor-based-a-k-a-keyset-pagination"},{"type":"extras","title":"Learn more - Paginator","doc":"* http://use-the-index-luke.com/no-offset\n* http://use-the-index-luke.com/sql/partial-results/fetch-next-page\n* https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/\n* https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines","ref":"Paginator.html#learn-more"},{"type":"extras","title":"Getting started - Paginator","doc":"```elixir\ndefmodule MyApp.Repo do\n use Ecto.Repo,\n otp_app: :my_app,\n adapter: Ecto.Adapters.Postgres\n\n use Paginator\nend\n\nquery = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id])\n\npage = MyApp.Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)\n\n# `page.edges` contains all the entries for this page.\n# `page.page_info` contains the meta-data associated with this page (cursors, limit, total count)\n```","ref":"Paginator.html#getting-started"},{"type":"extras","title":"Install - Paginator","doc":"Add `paginator` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [{:paginator, \"~> 1.0.4\"}]\nend\n```","ref":"Paginator.html#install"},{"type":"extras","title":"Usage - Paginator","doc":"1. Add `Paginator` to your repo.\n\n ```elixir\n defmodule MyApp.Repo do\n use Ecto.Repo,\n otp_app: :my_app,\n adapter: Ecto.Adapters.Postgres\n\n use Paginator\n end\n ```\n\n2. Use the `paginate` function to paginate your queries.\n\n ```elixir\n query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id])\n\n # return the first 50 posts\n %{edges: edges, page_info: page_info} = Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)\n\n # assign the `after` cursor to a variable\n cursor_after = page_info.end_cursor\n\n # return the next 50 posts\n %{edges: edges, page_info: page_info} = Repo.paginate(query, after: cursor_after, cursor_fields: [{:inserted_at, :asc}, {:id, :asc}], limit: 50)\n\n # assign the `before` cursor to a variable\n cursor_before = page_info.start_cursor\n\n # return the previous 50 posts (if no post was created in between it should be the same list as in our first call to `paginate`)\n %{edges: edges, page_info: page_info} = Repo.paginate(query, before: cursor_before, cursor_fields: [:inserted_at, :id], limit: 50)\n\n # return total count\n # NOTE: this will issue a separate `SELECT COUNT(*) FROM table` query to the database.\n %{edges: edges, page_info: page_info} = Repo.paginate(query, include_total_count: true, cursor_fields: [:inserted_at, :id], limit: 50)\n\n IO.puts \"total count: #{page_info.total_count}\"\n ```","ref":"Paginator.html#usage"},{"type":"extras","title":"Security Considerations - Paginator","doc":"`Repo.paginate/4` will throw an ArgumentError should it detect an executable term in the cursor parameters passed to it (`before`, `after`).\nThis is done to protect you from potential side-effects of malicious user input, see [paginator_test.exs](https://github.com/duffelhq/paginator/blob/master/test/paginator_test.exs#L820).","ref":"Paginator.html#security-considerations"},{"type":"extras","title":"Indexes - Paginator","doc":"If you want to reap all the benefits of this method it is better that you create indexes on the columns you are using as\ncursor fields.","ref":"Paginator.html#indexes"},{"type":"extras","title":"Example - Paginator","doc":"```elixir\n# If your cursor fields are: [:inserted_at, :id]\n# Add the following in a migration\n\ncreate index(\"posts\", [:inserted_at, :id])\n```","ref":"Paginator.html#example"},{"type":"extras","title":"Caveats - Paginator","doc":"* This method requires a deterministic sort order. If the columns you are currently using for sorting don't match that\ndefinition, just add any unique column and extend your index accordingly.\n* You need to add order_by clauses yourself before passing your query to `paginate/2`. In the future we might do that\nfor you automatically based on the fields specified in `:cursor_fields`.\n* There is an outstanding issue where Postgrex fails to properly builds the query if it includes custom PostgreSQL types.\n* This library has only be tested with PostgreSQL.","ref":"Paginator.html#caveats"},{"type":"extras","title":"Documentation - Paginator","doc":"Documentation is written into the library, you will find it in the source code, accessible from `iex` and of course, it\nall gets published to [hexdocs](http://hexdocs.pm/paginator).","ref":"Paginator.html#documentation"},{"type":"extras","title":"Contributing - Paginator","doc":"","ref":"Paginator.html#contributing"},{"type":"extras","title":"Running tests - Paginator","doc":"Clone the repo and fetch its dependencies:\n\n```\n$ git clone https://github.com/duffelhq/paginator.git\n$ cd paginator\n$ mix deps.get\n$ mix test\n```","ref":"Paginator.html#running-tests"},{"type":"extras","title":"Building docs - Paginator","doc":"```\n$ mix docs\n```","ref":"Paginator.html#building-docs"},{"type":"extras","title":"LICENSE - Paginator","doc":"See [LICENSE](https://github.com/duffelhq/paginator/blob/master/LICENSE.txt)","ref":"Paginator.html#license"},{"type":"extras","title":"Paper Trail","doc":"# Paper Trail\n\nTrack and record all the changes in your database. Revert back to anytime in history.\n\n[![Hex Version](http://img.shields.io/hexpm/v/paper_trail.svg?style=flat)](https://hex.pm/packages/paper_trail) [![Hex docs](http://img.shields.io/badge/hex.pm-docs-green.svg?style=flat)](https://hexdocs.pm/paper_trail/PaperTrail.html)\n[![Total Download](https://img.shields.io/hexpm/dt/paper_trail.svg)](https://hex.pm/packages/paper_trail)\n[![License](https://img.shields.io/hexpm/l/paper_trail.svg)](https://github.com/izelnakri/paper_trail/blob/master/LICENSE)\n[![Last Updated](https://img.shields.io/github/last-commit/izelnakri/paper_trail.svg)](https://github.com/izelnakri/paper_trail/commits/master)\n\n# How does it work?\n\nPaperTrail lets you record every change in your database in a separate database table called ```versions```. Library generates a new version record with associated data every time you run ```PaperTrail.insert/2```, ```PaperTrail.update/2``` or ```PaperTrail.delete/2``` functions. Simply these functions wrap your Repo insert, update or destroy actions in a database transaction, so if your database action fails you won't get a new version.\n\nPaperTrail is assailed with hundreds of test assertions for each release. Data integrity is an important aim of this project, please refer to the `strict_mode` if you want to ensure data correctness and integrity of your versions. For simpler use cases the default mode of PaperTrail should suffice.","ref":"PaperTrail.html"},{"type":"extras","title":"Example - Paper Trail","doc":"```elixir\nchangeset = Post.changeset(%Post{}, %{\n title: \"Word on the street is Elixir got its own database versioning library\",\n content: \"You should try it now!\"\n})\n\nPaperTrail.insert(changeset)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# item_changes: %{title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\n# => on error(it matches Repo.insert/2):\n# {:error, Ecto.Changeset ,\n# valid?: false>, %{}}\n\npost = Repo.get!(Post, 1)\nedit_changeset = Post.changeset(post, %{\n title: \"Elixir matures fast\",\n content: \"Future is already here, Elixir is the next step!\"\n})\n\nPaperTrail.update(edit_changeset)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil\n# meta: nil}}}\n\n# => on error(it matches Repo.update/2):\n# {:error, Ecto.Changeset ,\n# valid?: false>, %{}}\n\nPaperTrail.get_version(post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\nupdated_post = Repo.get!(Post, 1)\n\nPaperTrail.delete(updated_post)\n# => on success:\n# {:ok,\n# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:deleted, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}}}\n\nRepo.aggregate(Post, :count, :id) # => 0\nPaperTrail.Version.count() # => 3\n# same as Repo.aggregate(PaperTrail.Version, :count, :id)\n\nPaperTrail.Version.last() # returns the last version in the db by inserted_at\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{\"title\" => \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\", \"id\" => 1,\n# \"inserted_at\" => \"2016-09-15T21:42:38\",\n# \"updated_at\" => \"2016-09-15T22:00:59\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n```\n\nPaperTrail is inspired by the ruby gem ```paper_trail```. However, unlike the ```paper_trail``` gem this library actually results in less data duplication, faster and more explicit programming model to version your record changes.\n\nThe library source code is minimal and well tested. It is suggested to read the source code.","ref":"PaperTrail.html#example"},{"type":"extras","title":"Installation - Paper Trail","doc":"1. Add paper_trail to your list of dependencies in `mix.exs`:\n\n ```elixir\n def deps do\n [{:paper_trail, \"~> 0.14.3\"}]\n end\n ```\n\n2. Configure paper_trail to use your application repo in `config/config.exs`:\n\n ```elixir\n config :paper_trail, repo: YourApplicationName.Repo\n # if you don't specify this PaperTrail will assume your repo name is Repo\n ```\n\n3. Install and compile your dependency:\n\n ```mix deps.get && mix compile```\n\n4. Run this command to generate the migration:\n\n ```mix papertrail.install```\n\n You might want to edit the types for `:item_id` or `:originator_id` if you're\n using UUID or other types for your primary keys before you execute\n `mix ecto.migrate`.\n\n5. Run the migration:\n\n ```mix ecto.migrate```\n\nYour application is now ready to collect some history!\n\n#### Does this work with phoenix?\n\nYES! Make sure you do the steps above.\n\n### %PaperTrail.Version{} fields:\n\n| Column Name | Type | Description | Entry Method |\n| ------------- | ------- | -------------------------- | ------------------------ |\n| event | String | either \"insert\", \"update\" or \"delete\" | Library generates |\n| item_type | String | model name of the reference record | Library generates |\n| item_id | configurable (Integer by default) | model id of the reference record | Library generates |\n| item_changes | Map | all the changes in this version as a map | Library generates |\n| originator_id | configurable (Integer by default) | foreign key reference to the creator/owner of this change | Optionally set |\n| origin | String | short reference to origin(eg. worker:activity-checker, migration, admin:33) | Optionally set |\n| meta | Map | any extra optional meta information about the version(eg. %{slug: \"ausername\", important: true}) | Optionally set |\n| inserted_at | Date | inserted_at timestamp | Ecto generates |\n\n#### Configuring the types\n\nIf you are using UUID or another type for your primary keys, you can configure\nthe PaperTrail.Version schema to use it.\n\n##### Example Config\n\n```elixir\nconfig :paper_trail, item_type: Ecto.UUID,\n originator_type: Ecto.UUID,\n originator_relationship_options: [references: :uuid]\n```\n\n###### Example User\n\n```elixir\ndefmodule Acme.User do\n use Ecto.Schema\n\n @primary_key {:uuid, :binary_id, autogenerate: true}\n schema \"users\" do\n field :email, :string\n\n timestamps()\n end\n```\n\nRemember to edit the types accordingly in the generated migration.","ref":"PaperTrail.html#installation"},{"type":"extras","title":"Version origin references: - Paper Trail","doc":"PaperTrail records have a string field called ```origin```. ```PaperTrail.insert/2```, ```PaperTrail.update/2```, ```PaperTrail.delete/2``` functions accept a second argument to describe the origin of this version:\n```elixir\nPaperTrail.update(changeset, origin: \"migration\")\n# or:\nPaperTrail.update(changeset, origin: \"user:1234\")\n# or:\nPaperTrail.delete(changeset, origin: \"worker:delete_inactive_users\")\n# or:\nPaperTrail.insert(new_user_changeset, origin: \"password_registration\")\n# or:\nPaperTrail.insert(new_user_changeset, origin: \"facebook_registration\")\n```","ref":"PaperTrail.html#version-origin-references"},{"type":"extras","title":"Version originator relationships - Paper Trail","doc":"You can specify setter/originator relationship to paper_trail versions with ```originator``` assignment. This feature is only possible by specifying `:originator` keyword list for your application configuration:\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, originator: [name: :user, model: YourApp.User]\n# For most applications originator should be the user since models can be updated/created/deleted by several users.\n```\n\nNote: You will need to recompile your deps after you have added the config for originator.\n\nThen originator name could be used for querying and preloading. Originator setting must be done via ```:originator``` or originator name that is defined in the paper_trail configuration:\n\n```elixir\nuser = create_user()\n# all these set originator_id's for the version records\nPaperTrail.insert(changeset, originator: user)\n{:ok, result} = PaperTrail.update(edit_changeset, originator: user)\n# or you can use :user in the params instead of :originator if this is your config:\n# config :paper_trail, originator: [name: :user, model: YourApplication.User]\n{:ok, result} = PaperTrail.update(edit_changeset, user: user)\nresult[:version] |> Repo.preload(:user) |> Map.get(:user) # we can access the user who made the change from the version thanks to originator relationships!\nPaperTrail.delete(edit_changeset, user: user)\n```\n\nAlso make sure you have the foreign-key constraint in the database and in your version migration file.","ref":"PaperTrail.html#version-originator-relationships"},{"type":"extras","title":"Storing version meta data - Paper Trail","doc":"You might want to add some meta data that doesn't belong to ``originator`` and ``origin`` fields. Such data could be stored in one object named ```meta``` in paper_trail versions. Meta field could be passed as the second optional parameter to PaperTrail.insert/2, PaperTrail.update/2, PaperTrail.delete/2 functions:\n\n```elixir\ncompany = Company.changeset(%Company{}, %{name: \"Acme Inc.\"})\n |> PaperTrail.insert(meta: %{slug: \"acme-llc\"})\n\n# You can also combine this with an origin:\nedited_company = Company.changeset(company, %{name: \"Acme LLC\"})\n |> PaperTrail.update(origin: \"documentation\", meta: %{slug: \"acme-llc\"})\n\n# Or even with an originator:\nuser = create_user()\ndeleted_company = Company.changeset(edited_company, %{})\n |> PaperTrail.delete(origin: \"worker:github\", originator: user, meta: %{slug: \"acme-llc\", important: true})\n```\n\n# Strict mode\nThis is a feature more suitable for larger applications. Models can keep their version references via foreign key constraints. Therefore it would be impossible to delete the first and current version of a model if the model exists in the database, it also makes querying easier and the whole design more relational database/SQL friendly. In order to enable strict mode:\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, strict_mode: true\n```\n\nStrict mode expects tracked models to have foreign-key reference to their first_version and current_version. These columns must be named ```first_version_id```, and ```current_version_id``` in their respective model tables. A tracked model example with a migration file:\n\n```elixir\n# In the migration file: priv/repo/migrations/create_company.exs\ndefmodule Repo.Migrations.CreateCompany do\n def change do\n create table(:companies) do\n add :name, :string, null: false\n add :founded_in, :date\n\n # null constraints are highly suggested:\n add :first_version_id, references(:versions), null: false\n add :current_version_id, references(:versions), null: false\n\n timestamps()\n end\n\n create unique_index(:companies, [:first_version_id])\n create unique_index(:companies, [:current_version_id])\n end\nend\n\n# In the model definition:\ndefmodule Company do\n use Ecto.Schema\n\n import Ecto.Changeset\n\n schema \"companies\" do\n field :name, :string\n field :founded_in, :date\n\n belongs_to :first_version, PaperTrail.Version\n belongs_to :current_version, PaperTrail.Version, on_replace: :update # on_replace: is important!\n\n timestamps()\n end\n\n def changeset(struct, params \\\\ %{}) do\n struct\n |> cast(params, [:name, :founded_in])\n end\nend\n```\n\nWhen you run PaperTrail.insert/2 transaction, ```first_version_id``` and ```current_version_id``` automagically gets assigned for the model. Example:\n\n```elixir\ncompany = Company.changeset(%Company{}, %{name: \"Acme LLC\"}) |> PaperTrail.insert\n# {:ok,\n# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, \"companies\">,\n# name: \"Acme LLC\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38], first_version_id: 1, current_version_id: 1},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{name: \"Acme LLC\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38]},\n# originator_id: nil, origin: \"unknown\", meta: nil}}}\n```\n\nWhen you PaperTrail.update/2 a model, ```current_version_id``` gets updated during the transaction:\n\n```elixir\nedited_company = Company.changeset(company, %{name: \"Acme Inc.\"}) |> PaperTrail.update(origin: \"documentation\")\n# {:ok,\n# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, \"companies\">,\n# name: \"Acme Inc.\", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 23:22:12], first_version_id: 1, current_version_id: 2},\n# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 23:22:12],\n# item_changes: %{name: \"Acme Inc.\"}, originator_id: nil, origin: \"documentation\", meta: nil}}}\n```\n\nAdditionally, you can put a null constraint on ```origin``` column, you should always put an ```origin``` reference to describe who makes the change. This is important for big applications because a model can change from many sources.","ref":"PaperTrail.html#storing-version-meta-data"},{"type":"extras","title":"Bang(!) functions: - Paper Trail","doc":"PaperTrail also supports ```PaperTrail.insert!```, ```PaperTrail.update!```, ```PaperTrail.delete!```. Naming of these functions intentionally match ```Repo.insert!```, ```Repo.update!```, ```Repo.delete!``` functions. If PaperTrail is on strict_mode these bang functions will update the version references of the model just like the normal PaperTrail operations.\n\nBang functions assume the operation will always be successful, otherwise functions will raise ```Ecto.InvalidChangesetError``` just like ```Repo.insert!```, ```Repo.update!``` and ```Repo.delete!```:\n\n```elixir\nchangeset = Post.changeset(%Post{}, %{\n title: \"Word on the street is Elixir got its own database versioning library\",\n content: \"You should try it now!\"\n})\n\ninserted_post = PaperTrail.insert!(changeset)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]\n# }\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\ninserted_post_version = PaperTrail.get_version(inserted_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"insert\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# item_changes: %{title: \"Word on the street is Elixir got its own database versioning library\",\n# content: \"You should try it now!\", id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 21:42:38]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n\nedit_changeset = Post.changeset(inserted_post, %{\n title: \"Elixir matures fast\",\n content: \"Future is already here, Elixir is the next step!\"\n})\n\nupdated_post = PaperTrail.update!(edit_changeset)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, you deserve to be awesome!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]}\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\nupdated_post_version = PaperTrail.get_version(updated_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"update\", id: 2, inserted_at: ~N[2016-09-15 22:00:59],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil\n# meta: nil}\n\nPaperTrail.delete!(updated_post)\n# => on success:\n# %Post{__meta__: #Ecto.Schema.Metadata<:deleted, \"posts\">,\n# title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]}\n#\n# => on error raises: Ecto.InvalidChangesetError !!\n\nPaperTrail.get_version(updated_post)\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{title: \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\",\n# id: 1, inserted_at: ~N[2016-09-15 21:42:38],\n# updated_at: ~N[2016-09-15 22:00:59]},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n\nRepo.aggregate(Post, :count, :id) # => 0\nPaperTrail.Version.count() # => 3\n# same as Repo.aggregate(PaperTrail.Version, :count, :id)\n\nPaperTrail.Version.last() # returns the last version in the db by inserted_at\n# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, \"versions\">,\n# event: \"delete\", id: 3, inserted_at: ~N[2016-09-15 22:22:12],\n# item_changes: %{\"title\" => \"Elixir matures fast\", content: \"Future is already here, Elixir is the next step!\", \"id\" => 1,\n# \"inserted_at\" => \"2016-09-15T21:42:38\",\n# \"updated_at\" => \"2016-09-15T22:00:59\"},\n# item_id: 1, item_type: \"Post\", originator_id: nil, originator: nil, meta: nil}\n```","ref":"PaperTrail.html#bang-functions"},{"type":"extras","title":"Working with multi tenancy - Paper Trail","doc":"Sometimes you have to deal with applications where you need multi tenancy capabilities,\nand you want to keep tracking of the versions of your data on different schemas (PostgreSQL)\nor databases (MySQL).\n\nYou can use the [Ecto.Query prefix](https://hexdocs.pm/ecto/Ecto.Query.html#module-query-prefix)\nin order to switch between different schemas/databases for your own data, so\nyou can specify in your changeset where to store your record. Example:\n\n```elixir\ntenant = \"tenant_id\"\nchangeset = User.changeset(%User{}, %{first_name: \"Izel\", last_name: \"Nakri\"})\n\nchangeset\n|> Ecto.Queryable.to_query()\n|> Map.put(:prefix, tenant)\n|> Repo.insert()\n```\n\nPaperTrail also allows you to store the `Version` entries generated by your activity in\ndifferent schemas/databases by using the value of the element `:prefix` on the options\nof the functions. Example:\n\n```elixir\ntenant = \"tenant_id\"\n\nchangeset =\n User.changeset(%User{}, %{first_name: \"Izel\", last_name: \"Nakri\"})\n |> Ecto.Queryable.to_query()\n |> Map.put(:prefix, tenant)\n\nPaperTrail.insert(changeset, [prefix: tenant])\n```\n\nBy doing this, you're storing the new `User` entry into the schema/database\nspecified by the `:prefix` value (`tenant_id`).\n\nNote that the `User`'s changeset it's sent with the `:prefix`, so PaperTrail **will take care of the\nstorage of the generated `Version` entry in the desired schema/database**. Make sure\nto add this prefix to your changeset before the execution of the PaperTrail function if you want to do versioning on a separate schema.\n\nPaperTrail can also get versions of records or models from different schemas/databases as well\nby using the `:prefix` option. Example:\n\n```elixir\ntenant = \"tenant_id\"\nid = 1\n\nPaperTrail.get_versions(User, id, [prefix: tenant])\n```","ref":"PaperTrail.html#working-with-multi-tenancy"},{"type":"extras","title":"Version timestamps - Paper Trail","doc":"PaperTrail can be configured to use `utc_datetime` or `utc_datetime_usec` for Version timestamps.\n\n```elixir\n# In your config/config.exs\nconfig :paper_trail, timestamps_type: :utc_datetime\n```\n\nNote: You will need to recompile your deps after you have added the config for timestamps.","ref":"PaperTrail.html#version-timestamps"},{"type":"extras","title":"Suggestions - Paper Trail","doc":"- PaperTrail.Version(s) order matter,\n- Don't delete your paper_trail versions, instead you can merge them\n- If you have a question or a problem, do not hesitate to create an issue or submit a pull request","ref":"PaperTrail.html#suggestions"},{"type":"extras","title":"Contributing - Paper Trail","doc":"```\nset -a\nsource .env\nmix test --trace\n```\n\n# Credits\nMany thanks to:\n- [Jose Pablo Castro](https://github.com/josepablocastro) - Built the repo configuration for paper_trail\n- [Harold Tafur](https://github.com/hdtafur) - Built the `:ecto_options` option for PaperTrail inserts\n- [Florian Gerhardt](https://github.com/FlorianGerhardt) - Fixed rare compile errors for PaperTrail repos\n- [Alex Antonov](https://github.com/asiniy) - Original inventor of the originator feature\n- [Moritz Schmale](https://github.com/narrowtux) - UUID primary keys feature\n- [Jason Draper](https://github.com/drapergeek) - UUID primary keys feature\n- [Jonatan Männchen](https://github.com/maennchen) - Added non-regular :binary_id UUID support for originator\n- [Josh Taylor](https://github.com/joshuataylor) - Maintenance and new feature suggestions\n- [Mitchell Henke](https://github.com/mitchellhenke) - Fixed weird elixir compiler warnings\n- [Iván González](https://github.com/dreamingechoes) - Multi tenancy feature and some minor refactors\n- [Teo Choong Ping](https://github.com/seymores) - Fixed paper_trail references for newer Elixir versions\n- [devvit](https://github.com/devvit) - Added non-regular primary key tracking support\n- [rustamtolipov](https://github.com/rustamtolipov) - Added support for Ecto v3\n- [gabrielpra1](https://github.com/gabrielpra1) - Added enhanced support for Ecto.Changeset\n- [Darren Thompson](https://github.com/DiscoStarslayer) - Added PaperTrail.Multi which makes paper trail transactions more usable\n- [Harold Tafur](https://github.com/hdtafur) - Made PaperTrail.insert accept :ecto_options params(ie. upsert options)\n- [Attila Szabo](https://github.com/szaboat) - Made %Version[:inserted_at] accept different ecto datetime options\n- [Rafael Scheffer](https://github.com/rschef) - Built PaperTrail.Serializer that unifies %Version{} serialization\n- [Kian Meng Ang](https://github.com/kianmeng) - Improved documentation\n- [Francisco Correia](https://github.com/fv316) - Made PaperTrail transaction keys and ecto transactions more customizable\n- [Don Barlow](https://github.com/ottobar) - Made :initial_version_key configurable for `strict_mode` inserts\n- [Christoph Schmatzler](https://github.com/cschmatzler) - Built PaperTrail.insert_or_update feature\n- [Izel Nakri](https://github.com/izelnakri) - The Originator of this library. See what I did there ;)\n\nAdditional thanks to:\n- [Ruby paper_trail gem](https://github.com/airblade/paper_trail) - Initial inspiration of this project.\n- [Ecto](https://github.com/elixir-ecto/ecto) - For the great API.","ref":"PaperTrail.html#contributing"},{"type":"extras","title":"License - Paper Trail","doc":"This source code is licensed under the MIT license. Copyright (c) 2016-present Izel Nakri.","ref":"PaperTrail.html#license"},{"type":"extras","title":"Voodoo","doc":"# Voodoo\n\n`Voodoo` is a drop-in replacement for the old-style Phoenix path helpers (before `Phoenix.VerifiedRoutes` was introduced) which is more convenient to use.","ref":"Voodoo.html"},{"type":"extras","title":"Untangle","doc":"# Untangle\n\nLogging/inspecting data, and timing functions, with code location information.","ref":"Untangle.html"},{"type":"extras","title":"Logging/inspecting - Untangle","doc":"`Untangle` provides alternatives for `IO.inspect` and the macros in Elixir's `Logger` to output code location information. It also provides a polyfill for `dbg` which was introduce in Elixir 1.14\n\n![screenshot](priv/screenshot.png \"Screenshot showing sample logs (shown when running the library tests)\")\n\nThe first argument is `inspect`ed and the second argument (if provided) is used as a label:\n\n```\n> import Untangle\nUntangle\n> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\n> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change `warn` or `info` for `debug` if you only need it during development :-)","ref":"Untangle.html#logging-inspecting"},{"type":"extras","title":"Timing functions - Untangle","doc":"You can decorate functions to measure and log their execution time:\n\n```\nuse Untangle\n\n@decorate time()\ndef fun(), do: :stuff\n```\n\nwill output something like `[info] Time to run MyModule.fun/0: 1 ms`","ref":"Untangle.html#timing-functions"},{"type":"extras","title":"Installation - Untangle","doc":"If [available in Hex](https://hex.pm/docs/publish), the package can be installed\nby adding `untangle` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [\n {:untangle, \"~> 0.3\"}\n ]\nend\n```\n\n# Configure as default `dbg/2` handler","ref":"Untangle.html#installation"},{"type":"extras","title":"In config/config.exs - Untangle","doc":"`config :elixir, :dbg_callback, {Untangle, :custom_dbg, []}`\n\n# Docs\n\nThe docs can be found at [https://hexdocs.pm/untangle](https://hexdocs.pm/untangle).","ref":"Untangle.html#in-config-config-exs"},{"type":"extras","title":"Copyright and License - Untangle","doc":"Copyright (c) 2022 Bonfire contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Untangle.html#copyright-and-license"},{"type":"extras","title":"Arrows","doc":"# Arrows\n\nA handful of (mostly) arrow macros with superpowers.","ref":"Arrows.html"},{"type":"extras","title":"Installation - Arrows","doc":"The package can be installed by adding `arrows` to your list of dependencies in `mix.exs`: \n\n```elixir\ndef deps do\n [\n {:arrows, \"~> 0.2.0\"}\n ]\nend\n```\n\nOr via git:\n```elixir\ndef deps do\n [\n {:arrows, git: \"https://github.com/bonfire-networks/arrows\", branch: \"main\"}\n ]\nend\n```","ref":"Arrows.html#installation"},{"type":"extras","title":"Documentation - Arrows","doc":"The Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). \n\nHere is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where\n double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"Arrows.html#documentation"},{"type":"extras","title":"Ok-pipe - Arrows","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.\n\n\nDocumentation can be found at [https://hexdocs.pm/arrows](https://hexdocs.pm/arrows).","ref":"Arrows.html#ok-pipe"},{"type":"extras","title":"Exto","doc":"# Exto\n\n[![hex.pm](https://img.shields.io/hexpm/v/exto)](https://hex.pm/packages/exto)\n[hexdocs](https://hexdocs.pm/exto)\n\n`Exto` provides configuration-driven Ecto schema extensibility","ref":"Exto.html"},{"type":"extras","title":"Usage - Exto","doc":"","ref":"Exto.html#usage"},{"type":"extras","title":"Example Schema - Exto","doc":"```elixir\ndefmodule My.Schema do\n use Ecto.Schema\n import Exto, only: [flex_schema: 1]\n\n schema \"my_table\" do\n field :name, :string # just normal schema things\n flex_schema(:my_app) # boom! give me the stuff\n end\nend\n```\n\nOr if you want the `Access` protocol to be auto-implemented on the struct (because [the reasoning](https://hexdocs.pm/elixir/Access.html#module-maps-and-structs) for not having it on structs doesn't apply as much when using Exto), you can pull in the `Accessible` library by simply using `use Exto` instead of `import Exto`.","ref":"Exto.html#example-schema"},{"type":"extras","title":"Example configuration - Exto","doc":"```elixir\nconfig :my_app, My.Schema,\n belongs_to: [\n foo: Foo, # belongs_to :foo, Foo\n bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer\n ],\n field: [\n foo: :string, # field :foo, :string\n bar: {:integer, default: 4}, # field :foo, :integer, default: 4\n ],\n has_one: [\n foo: Foo, # has_one :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id\n ]\n has_many: [\n foo: Foo, # has_many :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id\n ]\n many_to_many: [\n foo: Foo, # many_to_many :foo, Foo\n bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar\n ]\n```\n\nThis example won't work very well because it is redefining `foo` and `bar` 5 times, but you get the point.\n\nReading of configuration is done during compile time. The relations will be baked in during compilation, thus:\n\n* Do not expect this to work in runtime config.\n* You will need to rebuild all dependencies which use this macro when you change their configuration.","ref":"Exto.html#example-configuration"},{"type":"extras","title":"Copyright and License - Exto","doc":"Copyright (c) 2020 Exto Contributors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Exto.html#copyright-and-license"},{"type":"extras","title":"Absinthe Client","doc":"# Absinthe Client\n\n`AbsintheClient` is an Elixir library to perform server-side queries on a local Absinthe-based GraphQL API.\n\nIt is a WIP adaption of `Absinthe.Phoenix.Controller` that can be used with LiveView or in any other context.\n\nUsage:\n\n```elixir\ndefmodule MyApp.Web.WidgetsLive do\n use MyApp.Web, :live_view\n\n use AbsintheClient, schema: Bonfire.API.GraphQL.Schema, action: [mode: :internal]\n\n def mount(params, session, socket) do\n widgets = awesome_widgets(socket)\n IO.inspect(widgets)\n\n {:ok, socket\n |> assign(\n widgets: widgets\n )}\n end\n\n # notice we use snakecase rather than camelcase\n @graphql \"\"\"\n {\n awesome_widgets\n }\n \"\"\"\n def awesome_widgets(socket), do: liveql(socket, :awesome_widgets)\n\nend\n```","ref":"AbsintheClient.html"},{"type":"extras","title":"License - Absinthe Client","doc":"See [LICENSE.md](./LICENSE.md).","ref":"AbsintheClient.html#license"},{"type":"extras","title":"Grumble","doc":"# Grumble\n\nA DSL for generating GraphQL queries","ref":"Grumble.html"},{"type":"extras","title":"Status: beta - Grumble","doc":"We use this in our tests at work to generate all the queries (because\nwe outgrew string concatenation). I'm not sure I'd want to depend on\nit in production yet because it's hard to feel like it's had a proper\nstress testing.\n\n* Needs (better) tests and documentation.\n* Missing support for some things we don't use.","ref":"Grumble.html#status-beta"},{"type":"extras","title":"Usage - Grumble","doc":"Add to your deps:\n\n```elixir\n{:grumble, \"~> 0.1.0\"}\n```\n\nSimple example:\n\n```elixir\nimport Grumble\nalias Grumble.PP\n\nIO.puts(PP.to_string(\n query(\n params: [community_id: type!(:string)],\n fields: [\n field(\n :community,\n args: [community_id: var(:community_id)],\n fields: [:id, :name]\n )\n ]\n )\n))\n```\n\nOutput:\n\n```\nquery($communityId: String!) {\n community(communityId: $communityId) {\n name\n id\n }\n}\n```","ref":"Grumble.html#usage"},{"type":"extras","title":"Guide - Grumble","doc":"Most of the useful functions are in the `Grumble` module. From there\nyou can read which arguments are understood by the relevant `new`\nfunction. We apologise for the poor documentation, please feel free to\ncontribute better docs!","ref":"Grumble.html#guide"},{"type":"extras","title":"Contributing - Grumble","doc":"Contributions are welcome, even just doc fixes or suggestions.\n\nThis project has adopted a [Code of Conduct](CONDUCT.md) based on the\nContributor Covenant. Please be nice when interacting with the community.","ref":"Grumble.html#contributing"},{"type":"extras","title":"Copyright and License - Grumble","doc":"Copyright (c) 2020 Grumble contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Grumble.html#copyright-and-license"},{"type":"extras","title":"Classic","doc":"| Package | License | Version | Link |\n|------------------------------|------------------------------------|------------|------------------------------------------------------------------|\n| absinthe | MIT | 1.7.0 | https://hex.pm/packages/absinthe |\n| absinthe_error_payload | BSD-3; Unrecognized license | 1.1.4 | https://hex.pm/packages/absinthe_error_payload |\n| absinthe_phoenix | MIT | 2.0.2 | https://hex.pm/packages/absinthe_phoenix |\n| absinthe_plug | MIT | 1.5.8 | https://hex.pm/packages/absinthe_plug |\n| activity_pub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/activity_pub |\n| argon2_elixir | Apache 2.0 | ~> 3.0 | https://hex.pm/packages/argon2_elixir |\n| arrows | Undefined | 0.1.0 | https://github.com/bonfire-networks/arrows |\n| bamboo | MIT | 2.2.0 | https://hex.pm/packages/bamboo |\n| bamboo_smtp | MIT | 4.2.1 | https://hex.pm/packages/bamboo_smtp |\n| benchee | MIT | 1.1.0 | https://hex.pm/packages/benchee |\n| benchee_html | MIT | 1.0.0 | https://hex.pm/packages/benchee_html |\n| benchee_json | MIT | 1.0.0 | https://hex.pm/packages/benchee_json |\n| bonfire_api_graphql | MPL 2.0 | | https://github.com/bonfire-networks/bonfire_api_graphql |\n| bonfire_boundaries | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_boundaries |\n| bonfire_classify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_classify |\n| bonfire_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_common |\n| bonfire_data_access_control | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_access_control |\n| bonfire_data_activity_pub | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_activity_pub |\n| bonfire_data_edges | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_edges |\n| bonfire_data_identity | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_identity |\n| bonfire_data_shared_user | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_shared_user |\n| bonfire_data_social | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_social |\n| bonfire_ecto | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_ecto |\n| bonfire_editor_ck | MIT | 0.1.0 | https://github.com/bonfire-networks/bonfire_editor_ck |\n| bonfire_editor_quill | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_editor_quill |\n| bonfire_epics | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_epics |\n| bonfire_fail | MPL 2.0 | | https://github.com/bonfire-networks/bonfire_fail |\n| bonfire_federate_activitypub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_federate_activitypub |\n| bonfire_files | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_files |\n| bonfire_invite_links | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_invite_links |\n| bonfire_mailer | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_mailer |\n| bonfire_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_me |\n| bonfire_search | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_search |\n| bonfire_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_social |\n| bonfire_tag | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_tag |\n| bonfire_ui_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_common |\n| bonfire_ui_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_me |\n| bonfire_ui_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_social |\n| cachex | MIT | 3.4.0 | https://hex.pm/packages/cachex |\n| certifi | BSD | 2.9.0 | https://hex.pm/packages/certifi |\n| cldr_utils | Apache 2.0 | 2.17.2 | https://hex.pm/packages/cldr_utils |\n| combine | MIT | 0.10.0 | https://hex.pm/packages/combine |\n| comeonin | BSD-3-Clause; Unrecognized license | 5.3.3 | https://hex.pm/packages/comeonin |\n| connection | Apache 2.0 | 1.1.0 | https://hex.pm/packages/connection |\n| cowboy | ISC | 2.9.0 | https://hex.pm/packages/cowboy |\n| cowboy_telemetry | Apache 2.0 | 0.4.0 | https://hex.pm/packages/cowboy_telemetry |\n| cowlib | ISC | 2.11.0 | https://hex.pm/packages/cowlib |\n| dataloader | MIT | 1.0.10 | https://hex.pm/packages/dataloader |\n| db_connection | Apache 2.0 | 2.4.2 | https://hex.pm/packages/db_connection |\n| decimal | Apache 2.0 | 2.0.0 | https://hex.pm/packages/decimal |\n| deep_merge | MIT | 1.0.0 | https://hex.pm/packages/deep_merge |\n| earmark | Apache 2.0 | 1.4.28 | https://hex.pm/packages/earmark |\n| earmark_parser | Apache 2.0 | 1.4.26 | https://hex.pm/packages/earmark_parser |\n| ecto | Apache 2.0 | 3.8.4 | https://hex.pm/packages/ecto |\n| ecto_erd | Apache 2.0 | 0.4.2 | https://hex.pm/packages/ecto_erd |\n| ecto_materialized_path | Apache 2.0 | 0.3.0 | https://github.com/bonfire-networks/ecto_materialized_path |\n| ecto_psql_extras | MIT | 0.7.4 | https://hex.pm/packages/ecto_psql_extras |\n| ecto_shorts | MIT | 1.1.1 | https://github.com/bonfire-networks/ecto_shorts |\n| ecto_sparkles | Undefined | 0.1.0 | https://github.com/bonfire-networks/ecto_sparkles |\n| ecto_sql | Apache 2.0 | 3.8.3 | https://hex.pm/packages/ecto_sql |\n| elixir_make | Apache 2.0 | ~> 0.6 | https://hex.pm/packages/elixir_make |\n| email_checker | MIT | 0.2.4 | https://hex.pm/packages/email_checker |\n| emote | Undefined | 0.1.0 | https://github.com/bonfire-networks/emote |\n| eqrcode | MIT | 0.1.10 | https://hex.pm/packages/eqrcode |\n| eternal | MIT | 1.2.2 | https://hex.pm/packages/eternal |\n| ex_aws | MIT | 2.3.2 | https://hex.pm/packages/ex_aws |\n| ex_aws_s3 | MIT | 2.3.2 | https://hex.pm/packages/ex_aws_s3 |\n| ex_cldr | Apache 2.0 | 2.30.0 | https://hex.pm/packages/ex_cldr |\n| ex_cldr_languages | Apache 2.0 | 0.3.3 | https://hex.pm/packages/ex_cldr_languages |\n| ex_cldr_plugs | Apache 2.0 | 1.0.0 | https://hex.pm/packages/ex_cldr_plugs |\n| ex_doc | Apache 2.0 | 0.28.4 | https://hex.pm/packages/ex_doc |\n| ex_machina | MIT | ~> 2.4 | https://hex.pm/packages/ex_machina |\n| ex_ulid | Apache 2.0 | 0.1.0 | https://hex.pm/packages/ex_ulid |\n| ex_unit_notifier | MIT | ~> 1.0 | https://hex.pm/packages/ex_unit_notifier |\n| exsync | BSD 3-Clause; Unrecognized license | 0.2.4 | https://hex.pm/packages/exsync |\n| faker | MIT | 0.17.0 | https://hex.pm/packages/faker |\n| fast_ngram | MIT | 1.2.0 | https://hex.pm/packages/fast_ngram |\n| faviconic | MIT | 0.1.3 | https://hex.pm/packages/faviconic |\n| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |\n| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |\n| flame_on | MIT | 0.5.0 | https://hex.pm/packages/flame_on |\n| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |\n| floki | MIT | 0.32.1 | https://hex.pm/packages/floki |\n| gen_smtp | BSD-2-Clause; Unrecognized license | 1.2.0 | https://hex.pm/packages/gen_smtp |\n| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |\n| gettext | Apache 2.0 | 0.19.1 | https://hex.pm/packages/gettext |\n| grumble | Apache 2.0 | ~> 0.1.3 | https://hex.pm/packages/grumble |\n| hackney | Apache 2.0 | 1.18.1 | https://hex.pm/packages/hackney |\n| html_entities | MIT | 0.5.2 | https://hex.pm/packages/html_entities |\n| html_sanitize_ex | MIT | 1.4.2 | https://hex.pm/packages/html_sanitize_ex |\n| http_signatures | GPL v3 | 0.1.0 | https://git.pleroma.social/pleroma/http_signatures.git |\n| httpoison | MIT | 1.8.1 | https://hex.pm/packages/httpoison |\n| idna | MIT | 6.1.1 | https://hex.pm/packages/idna |\n| inflex | Apache 2.0 | 2.1.0 | https://hex.pm/packages/inflex |\n| jason | Apache 2.0 | 1.3.0 | https://hex.pm/packages/jason |\n| jumper | MIT | 1.0.1 | https://hex.pm/packages/jumper |\n| libgraph | MIT | 0.13.3 | https://hex.pm/packages/libgraph |\n| licensir | MIT | 0.7.0 | https://github.com/bonfire-networks/licensir |\n| linkify | MIT | 0.2.0 | https://github.com/bonfire-networks/linkify |\n| makeup | BSD; Unrecognized license | 1.1.0 | https://hex.pm/packages/makeup |\n| makeup_diff | MIT | 0.1.0 | https://hex.pm/packages/makeup_diff |\n| makeup_eex | BSD; Unrecognized license | 0.1.1 | https://hex.pm/packages/makeup_eex |\n| makeup_elixir | BSD; Unrecognized license | 0.16.0 | https://hex.pm/packages/makeup_elixir |\n| makeup_erlang | BSD | 0.1.1 | https://hex.pm/packages/makeup_erlang |\n| makeup_graphql | BSD | 0.1.2 | https://hex.pm/packages/makeup_graphql |\n| makeup_html | MIT | 0.1.0 | https://hex.pm/packages/makeup_html |\n| makeup_js | MIT | 0.1.0 | https://hex.pm/packages/makeup_js |\n| makeup_sql | BSD | 0.1.0 | https://hex.pm/packages/makeup_sql |\n| meck | Apache 2.0 | 0.9.2 | https://hex.pm/packages/meck |\n| metrics | BSD | 1.0.1 | https://hex.pm/packages/metrics |\n| mime | Apache 2.0 | 1.6.0 | https://hex.pm/packages/mime |\n| mimerl | MIT | 1.2.0 | https://hex.pm/packages/mimerl |\n| mimetype_parser | MIT | 0.1.3 | https://hex.pm/packages/mimetype_parser |\n| mix_test_interactive | MIT | ~> 1.2 | https://hex.pm/packages/mix_test_interactive |\n| mix_test_watch | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_watch |\n| mix_unused | MIT; Unrecognized license | 0.4.0 | https://hex.pm/packages/mix_unused |\n| mochiweb | MIT | 2.22.0 | https://hex.pm/packages/mochiweb |\n| mock | MIT | ~> 0.3 | https://hex.pm/packages/mock |\n| mogrify | MIT | 0.9.1 | https://hex.pm/packages/mogrify |\n| mox | Apache 2.0 | ~> 1.0 | https://hex.pm/packages/mox |\n| nimble_parsec | Apache 2.0 | 1.2.3 | https://hex.pm/packages/nimble_parsec |\n| nimble_totp | Apache 2.0 | 0.2.0 | https://hex.pm/packages/nimble_totp |\n| nodeinfo | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/nodeinfo |\n| oban | Apache 2.0 | 2.8.0 | https://hex.pm/packages/oban |\n| paginator | MIT | 1.0.4 | https://github.com/bonfire-networks/paginator |\n| pane | MIT | 0.4.1 | https://hex.pm/packages/pane |\n| parse_trans | Apache 2.0 | 3.3.1 | https://hex.pm/packages/parse_trans |\n| pbkdf2_elixir | BSD-3-Clause; Unrecognized license | 2.0.0 | https://hex.pm/packages/pbkdf2_elixir |\n| periscope | Apache 2.0 | 0.4.6 | https://hex.pm/packages/periscope |\n| phoenix | MIT | 1.6.10 | https://hex.pm/packages/phoenix |\n| phoenix_ecto | MIT | 4.4.0 | https://hex.pm/packages/phoenix_ecto |\n| phoenix_gon | MIT | 0.4.1 | https://github.com/bonfire-networks/phoenix_gon |\n| phoenix_html | MIT | 3.2.0 | https://hex.pm/packages/phoenix_html |\n| phoenix_live_dashboard | MIT | 0.6.5 | https://hex.pm/packages/phoenix_live_dashboard |\n| phoenix_live_reload | MIT | 1.3.3 | https://hex.pm/packages/phoenix_live_reload |\n| phoenix_live_view | MIT | 0.17.10 | https://hex.pm/packages/phoenix_live_view |\n| phoenix_pubsub | MIT | 2.1.1 | https://hex.pm/packages/phoenix_pubsub |\n| phoenix_view | MIT | 1.1.2 | https://hex.pm/packages/phoenix_view |\n| plug | Apache 2.0 | 1.13.6 | https://hex.pm/packages/plug |\n| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |\n| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |\n| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |\n| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |\n| postgrex | Apache 2.0 | 0.16.3 | https://hex.pm/packages/postgrex |\n| pseudo_gettext | Undefined | 0.1.0 | https://github.com/tmbb/pseudo_gettext |\n| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |\n| recase | MIT | 0.7.0 | https://hex.pm/packages/recase |\n| redirect | Apache 2.0 | 0.3.0 | https://hex.pm/packages/redirect |\n| scribe | MIT | 0.10.0 | https://hex.pm/packages/scribe |\n| sentry | MIT | 8.0.6 | https://hex.pm/packages/sentry |\n| sleeplocks | MIT | 1.1.1 | https://hex.pm/packages/sleeplocks |\n| sobelow | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sobelow |\n| solid | MIT | 0.12.0 | https://hex.pm/packages/solid |\n| sourceror | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sourceror |\n| ssl_verify_fun | MIT | 1.1.6 | https://hex.pm/packages/ssl_verify_fun |\n| statistex | MIT | 1.0.0 | https://hex.pm/packages/statistex |\n| surface | MIT | 0.7.4 | https://hex.pm/packages/surface |\n| surface_heroicons | Undefined | 0.5.3 | https://github.com/rocketinsights/surface_heroicons |\n| sweet_xml | MIT | 0.7.3 | https://hex.pm/packages/sweet_xml |\n| table_rex | MIT | 3.1.1 | https://hex.pm/packages/table_rex |\n| telemetry | Apache 2.0 | 1.1.0 | https://hex.pm/packages/telemetry |\n| telemetry_metrics | Apache 2.0 | 0.6.1 | https://hex.pm/packages/telemetry_metrics |\n| telemetry_poller | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry_poller |\n| tesla | MIT | 1.4.4 | https://hex.pm/packages/tesla |\n| timex | MIT | 3.7.8 | https://hex.pm/packages/timex |\n| twinkle_star | GPL v3 | 0.1.0 | https://github.com/bonfire-networks/twinkle_star |\n| typed_struct | MIT | ~> 0.3.0 | https://hex.pm/packages/typed_struct |\n| tzdata | MIT | 1.1.1 | https://hex.pm/packages/tzdata |\n| unicode_util_compat | Apache 2.0 | 0.7.0 | https://hex.pm/packages/unicode_util_compat |\n| unsafe | MIT | 1.0.1 | https://hex.pm/packages/unsafe |\n| verbs | MIT | 0.6.1 | https://github.com/shannonwells/verbs_ex |\n| voodoo | Undefined | 0.1.0 | https://github.com/bonfire-networks/voodoo |\n| waffle | Apache 2.0 | 1.1.6 | https://hex.pm/packages/waffle |\n| wallaby | MIT | ~> 0.29.1 | https://hex.pm/packages/wallaby |\n| web_driver_client | MIT | ~> 0.2.0 | https://hex.pm/packages/web_driver_client |\n| where | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/untangle |\n| zest | Apache 2.0 | 0.1.2 | https://hex.pm/packages/zest |\n|------------------------------|------------------------------------|------------|------------------------------------------------------------------|","ref":"deps-classic.html"},{"type":"extras","title":"Cooperation","doc":"| Package | License | Version | Link |\n|------------------------------|------------------------------------|----------|------------------------------------------------------------------|\n| absinthe | MIT | 1.7.0 | https://hex.pm/packages/absinthe |\n| absinthe_client | MIT | 2.0.0 | https://github.com/bonfire-networks/absinthe_client.git |\n| absinthe_error_payload | BSD-3; Unrecognized license | 1.1.4 | https://hex.pm/packages/absinthe_error_payload |\n| absinthe_phoenix | MIT | 2.0.2 | https://hex.pm/packages/absinthe_phoenix |\n| absinthe_plug | MIT | 1.5.8 | https://hex.pm/packages/absinthe_plug |\n| activity_pub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/activity_pub |\n| argon2_elixir | Apache 2.0 | ~> 2.4 | https://hex.pm/packages/argon2_elixir |\n| arrows | Undefined | 0.1.0 | https://github.com/bonfire-networks/arrows |\n| bamboo | MIT | 2.2.0 | https://hex.pm/packages/bamboo |\n| bamboo_smtp | MIT | 4.1.0 | https://hex.pm/packages/bamboo_smtp |\n| bonfire_api_graphql | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_api_graphql |\n| bonfire_boundaries | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_boundaries |\n| bonfire_breadpub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_breadpub |\n| bonfire_classify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_classify |\n| bonfire_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_common |\n| bonfire_data_access_control | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_access_control |\n| bonfire_data_activity_pub | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_activity_pub |\n| bonfire_data_assort | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_assort |\n| bonfire_data_edges | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_edges |\n| bonfire_data_identity | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_identity |\n| bonfire_data_shared_user | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_shared_user |\n| bonfire_data_social | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_social |\n| bonfire_editor_ck | MIT | 0.1.0 | https://github.com/bonfire-networks/bonfire_editor_ck |\n| bonfire_epics | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_epics |\n| bonfire_fail | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_fail |\n| bonfire_federate_activitypub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_federate_activitypub |\n| bonfire_files | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_files |\n| bonfire_geolocate | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_geolocate |\n| bonfire_invite_links | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_invite_links |\n| bonfire_mailer | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_mailer |\n| bonfire_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_me |\n| bonfire_quantify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_quantify |\n| bonfire_search | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_search |\n| bonfire_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_social |\n| bonfire_tag | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_tag |\n| bonfire_ui_coordination | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_coordination |\n| bonfire_ui_kanban | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_kanban |\n| bonfire_ui_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_social |\n| bonfire_ui_valueflows | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_valueflows |\n| bonfire_valueflows | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_valueflows |\n| bonfire_valueflows_observe | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_valueflows_observe |\n| bonfire_website | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_website |\n| cachex | MIT | 3.4.0 | https://hex.pm/packages/cachex |\n| certifi | BSD | 2.9.0 | https://hex.pm/packages/certifi |\n| cldr_utils | Apache 2.0 | 2.17.1 | https://hex.pm/packages/cldr_utils |\n| combine | MIT | 0.10.0 | https://hex.pm/packages/combine |\n| comeonin | BSD-3-Clause; Unrecognized license | 5.3.3 | https://hex.pm/packages/comeonin |\n| connection | Apache 2.0 | 1.1.0 | https://hex.pm/packages/connection |\n| cowboy | ISC | 2.9.0 | https://hex.pm/packages/cowboy |\n| cowboy_telemetry | Apache 2.0 | 0.4.0 | https://hex.pm/packages/cowboy_telemetry |\n| cowlib | ISC | 2.11.0 | https://hex.pm/packages/cowlib |\n| dataloader | MIT | 1.0.10 | https://hex.pm/packages/dataloader |\n| db_connection | Apache 2.0 | 2.4.1 | https://hex.pm/packages/db_connection |\n| decimal | Apache 2.0 | 2.0.0 | https://hex.pm/packages/decimal |\n| earmark | Apache 2.0 | 1.4.20 | https://hex.pm/packages/earmark |\n| earmark_parser | Apache 2.0 | 1.4.18 | https://hex.pm/packages/earmark_parser |\n| ecto | Apache 2.0 | 3.7.1 | https://hex.pm/packages/ecto |\n| ecto_erd | Apache 2.0 | 0.4.1 | https://hex.pm/packages/ecto_erd |\n| ecto_materialized_path | Apache 2.0 | 0.3.0 | https://github.com/bonfire-networks/ecto_materialized_path |\n| ecto_psql_extras | MIT | 0.7.4 | https://hex.pm/packages/ecto_psql_extras |\n| ecto_ranked | MIT | 0.5.0 | https://hex.pm/packages/ecto_ranked |\n| ecto_shorts | MIT | 1.1.1 | https://github.com/bonfire-networks/ecto_shorts |\n| ecto_sparkles | Undefined | 0.1.0 | https://github.com/bonfire-networks/ecto_sparkles |\n| ecto_sql | Apache 2.0 | 3.7.2 | https://hex.pm/packages/ecto_sql |\n| eflambe | Apache 2.0 | 0.2.2 | https://hex.pm/packages/eflambe |\n| elixir_make | Apache 2.0 | ~> 0.6 | https://hex.pm/packages/elixir_make |\n| email_checker | MIT | 0.2.4 | https://hex.pm/packages/email_checker |\n| emote | Undefined | 0.1.0 | https://github.com/bonfire-networks/emote |\n| eternal | MIT | 1.2.2 | https://hex.pm/packages/eternal |\n| ex_cldr | Apache 2.0 | 2.26.1 | https://hex.pm/packages/ex_cldr |\n| ex_doc | Apache 2.0 | 0.28.1 | https://hex.pm/packages/ex_doc |\n| ex_machina | MIT | ~> 2.4 | https://hex.pm/packages/ex_machina |\n| ex_unit_notifier | MIT | ~> 1.0 | https://hex.pm/packages/ex_unit_notifier |\n| exsync | BSD 3-Clause; Unrecognized license | 0.2.4 | https://hex.pm/packages/exsync |\n| faker | MIT | 0.17.0 | https://hex.pm/packages/faker |\n| fast_ngram | MIT | 1.2.0 | https://hex.pm/packages/fast_ngram |\n| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |\n| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |\n| flame_on | MIT | 0.2.1 | https://hex.pm/packages/flame_on |\n| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |\n| floki | MIT | 0.32.0 | https://hex.pm/packages/floki |\n| gen_smtp | BSD 2-clause; Unrecognized license | 1.1.1 | https://hex.pm/packages/gen_smtp |\n| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |\n| geo_postgis | MIT | 3.4.1 | https://hex.pm/packages/geo_postgis |\n| geocoder | MIT | 1.1.4 | https://hex.pm/packages/geocoder |\n| geohash | Apache 2.0 | 1.2.2 | https://hex.pm/packages/geohash |\n| gettext | Apache 2.0 | 0.19.1 | https://hex.pm/packages/gettext |\n| git_diff | MIT | 0.6.3 | https://hex.pm/packages/git_diff |\n| grumble | Apache 2.0 | ~> 0.1.3 | https://hex.pm/packages/grumble |\n| hackney | Apache 2.0 | 1.18.1 | https://hex.pm/packages/hackney |\n| html_entities | MIT | 0.5.2 | https://hex.pm/packages/html_entities |\n| html_sanitize_ex | MIT | 1.4.2 | https://hex.pm/packages/html_sanitize_ex |\n| http_signatures | GPL v3 | 0.1.0 | https://git.pleroma.social/pleroma/http_signatures.git |\n| httpoison | MIT | 1.8.0 | https://hex.pm/packages/httpoison |\n| hut | MIT | 1.3.0 | https://hex.pm/packages/hut |\n| idna | MIT | 6.1.1 | https://hex.pm/packages/idna |\n| inflex | Apache 2.0 | 2.1.0 | https://hex.pm/packages/inflex |\n| jason | Apache 2.0 | 1.3.0 | https://hex.pm/packages/jason |\n| jumper | MIT | 1.0.1 | https://hex.pm/packages/jumper |\n| licensir | MIT | 0.7.0 | https://github.com/bonfire-networks/licensir |\n| linkify | MIT | 0.2.0 | https://github.com/bonfire-networks/linkify |\n| makeup | BSD; Unrecognized license | 1.0.5 | https://hex.pm/packages/makeup |\n| makeup_elixir | BSD; Unrecognized license | 0.15.2 | https://hex.pm/packages/makeup_elixir |\n| makeup_erlang | BSD | 0.1.1 | https://hex.pm/packages/makeup_erlang |\n| mappable | New BSD | 0.2.4 | https://hex.pm/packages/mappable |\n| meck | Apache 2.0 | 0.9.2 | https://hex.pm/packages/meck |\n| metrics | BSD | 1.0.1 | https://hex.pm/packages/metrics |\n| mime | Apache 2.0 | 1.6.0 | https://hex.pm/packages/mime |\n| mimerl | MIT | 1.2.0 | https://hex.pm/packages/mimerl |\n| mimetype_parser | MIT | 0.1.3 | https://hex.pm/packages/mimetype_parser |\n| mix_test_interactive | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_interactive |\n| mix_test_watch | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_watch |\n| mix_unused | MIT; Unrecognized license | 0.3.0 | https://hex.pm/packages/mix_unused |\n| mochiweb | MIT | 2.22.0 | https://hex.pm/packages/mochiweb |\n| mock | MIT | ~> 0.3 | https://hex.pm/packages/mock |\n| neuron | ISC | 5.0.0 | https://hex.pm/packages/neuron |\n| nimble_parsec | Apache 2.0 | 1.2.2 | https://hex.pm/packages/nimble_parsec |\n| nodeinfo | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/nodeinfo |\n| oban | Apache 2.0 | 2.8.0 | https://hex.pm/packages/oban |\n| ok | Apache 2.0 | 2.3.0 | https://hex.pm/packages/ok |\n| paginator | MIT | 1.0.4 | https://github.com/bonfire-networks/paginator |\n| pane | MIT | 0.4.1 | https://hex.pm/packages/pane |\n| parse_trans | Apache 2.0 | 3.3.1 | https://hex.pm/packages/parse_trans |\n| pbkdf2_elixir | BSD-3-Clause; Unrecognized license | 1.4.2 | https://hex.pm/packages/pbkdf2_elixir |\n| phil_columns | MIT | 3.1.0 | https://hex.pm/packages/phil_columns |\n| phoenix | MIT | 1.6.6 | https://hex.pm/packages/phoenix |\n| phoenix_ecto | MIT | 4.4.0 | https://hex.pm/packages/phoenix_ecto |\n| phoenix_gon | MIT | 0.4.1 | https://github.com/bonfire-networks/phoenix_gon |\n| phoenix_html | MIT | 3.2.0 | https://hex.pm/packages/phoenix_html |\n| phoenix_live_dashboard | MIT | 0.6.5 | https://hex.pm/packages/phoenix_live_dashboard |\n| phoenix_live_reload | MIT | 1.3.3 | https://hex.pm/packages/phoenix_live_reload |\n| phoenix_live_view | MIT | 0.17.7 | https://hex.pm/packages/phoenix_live_view |\n| phoenix_pubsub | MIT | 2.0.0 | https://hex.pm/packages/phoenix_pubsub |\n| phoenix_view | MIT | 1.1.2 | https://hex.pm/packages/phoenix_view |\n| plug | Apache 2.0 | 1.13.3 | https://hex.pm/packages/plug |\n| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |\n| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |\n| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |\n| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |\n| poolboy | Unlicense; Apache 2.0; ISC | 1.5.2 | https://hex.pm/packages/poolboy |\n| postgrex | Apache 2.0 | 0.16.2 | https://hex.pm/packages/postgrex |\n| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |\n| recase | MIT | 0.7.0 | https://hex.pm/packages/recase |\n| redirect | Apache 2.0 | 0.3.0 | https://hex.pm/packages/redirect |\n| scribe | MIT | 0.10.0 | https://hex.pm/packages/scribe |\n| sentry | MIT | 8.0.6 | https://hex.pm/packages/sentry |\n| sleeplocks | MIT | 1.1.1 | https://hex.pm/packages/sleeplocks |\n| sobelow | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sobelow |\n| sourceror | Apache 2.0 | 0.10.0 | https://hex.pm/packages/sourceror |\n| ssl_verify_fun | MIT | 1.1.6 | https://hex.pm/packages/ssl_verify_fun |\n| stream_data | Apache 2.0 | 0.5.0 | https://hex.pm/packages/stream_data |\n| surface | MIT | 0.7.1 | https://hex.pm/packages/surface |\n| surface_heroicons | Undefined | 0.5.3 | https://github.com/rocketinsights/surface_heroicons |\n| table_rex | MIT | 3.1.1 | https://hex.pm/packages/table_rex |\n| telemetry | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry |\n| telemetry_metrics | Apache 2.0 | 0.6.1 | https://hex.pm/packages/telemetry_metrics |\n| telemetry_poller | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry_poller |\n| tesla | MIT | 1.4.4 | https://hex.pm/packages/tesla |\n| timex | MIT | 3.7.6 | https://hex.pm/packages/timex |\n| towel | MIT | 0.2.1 | https://hex.pm/packages/towel |\n| twinkle_star | GPL v3 | 0.1.0 | https://github.com/bonfire-networks/twinkle_star |\n| typed_struct | MIT | ~> 0.2.1 | https://hex.pm/packages/typed_struct |\n| tzdata | MIT | 1.1.1 | https://hex.pm/packages/tzdata |\n| unicode_util_compat | Apache 2.0 | 0.7.0 | https://hex.pm/packages/unicode_util_compat |\n| unsafe | MIT | 1.0.1 | https://hex.pm/packages/unsafe |\n| verbs | MIT | 0.6.1 | https://github.com/shannonwells/verbs_ex |\n| voodoo | Undefined | 0.1.0 | https://github.com/bonfire-networks/voodoo |\n| waffle | Apache 2.0 | 1.1.6 | https://hex.pm/packages/waffle |\n| where | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/untangle |\n| zest | Apache 2.0 | 0.1.2 | https://hex.pm/packages/zest |\n|------------------------------|------------------------------------|----------|------------------------------------------------------------------|","ref":"deps-cooperation.html"}],"producer":{"name":"ex_doc","version":[48,46,51,52,46,50]},"content_type":"text/markdown"} \ No newline at end of file diff --git a/dist/search_data-E29AE5D0.js b/dist/search_data-E29AE5D0.js new file mode 100644 index 0000000000..adc8fb9787 --- /dev/null +++ b/dist/search_data-E29AE5D0.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","title":"Bonfire.Data.AccessControl.Acl","doc":"Conceptually, a complete list of all permissions for everybody.\nIn practice, it's a partial specification, and anything not\nexplicitly granted is assumed to be denied.\n\nCan be reused to secure multiple objects, thus exists independently\nof any object.","ref":"Bonfire.Data.AccessControl.Acl.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Acl.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Acl.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Circle","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Circle.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Circle.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Controlled","doc":"An object is linked to one or more `Acl`s by the `Controlled` multimixin, which pairs an object ID with an ACL ID. Because it is a multimixin, a given object can have multiple ACLs applied. In the case of overlap, permissions are combined with `false` being prioritised.","ref":"Bonfire.Data.AccessControl.Controlled.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Controlled.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Controlled.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Encircle","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Encircle.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Encircle.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Grant","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Grant.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Grant.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.InstanceAdmin","doc":"A mixin for superpowers","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.changeset/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#changeset/3"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.get/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.InstanceAdmin.put/3","doc":"","ref":"Bonfire.Data.AccessControl.InstanceAdmin.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Stereotyped","doc":"A marker that identifies special context-dependent semantics to the system.","ref":"Bonfire.Data.AccessControl.Stereotyped.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Stereotyped.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Stereotyped.html#put/3"},{"type":"module","title":"Bonfire.Data.AccessControl.Verb","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.changeset/2","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#changeset/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.delete/2","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#delete/2"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.get/3","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#get/3"},{"type":"function","title":"Bonfire.Data.AccessControl.Verb.put/3","doc":"","ref":"Bonfire.Data.AccessControl.Verb.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Actor","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.changeset/2","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#changeset/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Actor.Migration","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.create_actor_table/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#create_actor_table/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.create_actor_table/1","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#create_actor_table/1"},{"type":"function","title":"Bonfire.Data.ActivityPub.Actor.Migration.drop_actor_table/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#drop_actor_table/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.migrate_actor/0","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#migrate_actor/0"},{"type":"macro","title":"Bonfire.Data.ActivityPub.Actor.Migration.migrate_actor/1","doc":"","ref":"Bonfire.Data.ActivityPub.Actor.Migration.html#migrate_actor/1"},{"type":"module","title":"Bonfire.Data.ActivityPub.Peer","doc":"Federated instances","ref":"Bonfire.Data.ActivityPub.Peer.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.changeset/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#changeset/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peer.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peer.html#put/3"},{"type":"module","title":"Bonfire.Data.ActivityPub.Peered","doc":"Federated actors or objects","ref":"Bonfire.Data.ActivityPub.Peered.html"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.changeset/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#changeset/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.delete/2","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#delete/2"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.get/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#get/3"},{"type":"function","title":"Bonfire.Data.ActivityPub.Peered.put/3","doc":"","ref":"Bonfire.Data.ActivityPub.Peered.html#put/3"},{"type":"module","title":"Bonfire.Data.Assort.Ranked","doc":"A reusable table to link child or related items and also rank sibling items.\n\nUsage (for global ranking, otherwise you should specify scope):\n```\n{:ok, first} = Bonfire.Data.Assort.Ranked.changeset(%{item_id: \"01FGTH48ZZD08ADBHQ260KYJHW\"}) |> repo().insert\nsecond = Bonfire.Data.Assort.Ranked.changeset(%{item_id: \"01FGTH0N3YPBS5MNNAEAEVV54J\"}) |> repo().insert\n\nimport Ecto.Query\nBonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all\n\nfirst |> Bonfire.Data.Assort.Ranked.changeset(%{rank_set: :last}) |> repo().update\n\nBonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all\n```","ref":"Bonfire.Data.Assort.Ranked.html"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.changeset/2","doc":"","ref":"Bonfire.Data.Assort.Ranked.html#changeset/2"},{"type":"module","title":"Bonfire.Data.Assort.Ranked.Migration","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_ranked_table/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_ranked_table/0"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_ranked_table/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_ranked_table/1"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.create_unique_index/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#create_unique_index/1"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.Migration.drop_ranked_table/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#drop_ranked_table/0"},{"type":"function","title":"Bonfire.Data.Assort.Ranked.Migration.drop_unique_index/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#drop_unique_index/1"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.migrate_ranked/0","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#migrate_ranked/0"},{"type":"macro","title":"Bonfire.Data.Assort.Ranked.Migration.migrate_ranked/1","doc":"","ref":"Bonfire.Data.Assort.Ranked.Migration.html#migrate_ranked/1"},{"type":"module","title":"Bonfire.Data.Edges.Edge","doc":"","ref":"Bonfire.Data.Edges.Edge.html"},{"type":"function","title":"Bonfire.Data.Edges.Edge.changeset/2","doc":"","ref":"Bonfire.Data.Edges.Edge.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Edges.Edge.delete/2","doc":"","ref":"Bonfire.Data.Edges.Edge.html#delete/2"},{"type":"function","title":"Bonfire.Data.Edges.Edge.get/3","doc":"","ref":"Bonfire.Data.Edges.Edge.html#get/3"},{"type":"function","title":"Bonfire.Data.Edges.Edge.put/3","doc":"","ref":"Bonfire.Data.Edges.Edge.html#put/3"},{"type":"module","title":"Bonfire.Data.Edges.EdgeTotal","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.changeset/2","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.delete/2","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#delete/2"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.get/3","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#get/3"},{"type":"function","title":"Bonfire.Data.Edges.EdgeTotal.put/3","doc":"","ref":"Bonfire.Data.Edges.EdgeTotal.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Account","doc":"An account is an identity for authentication purposes. An account\nhas one or more credentials with which it may identify.","ref":"Bonfire.Data.Identity.Account.html"},{"type":"function","title":"Bonfire.Data.Identity.Account.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Account.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Account.delete/2","doc":"","ref":"Bonfire.Data.Identity.Account.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Account.get/3","doc":"","ref":"Bonfire.Data.Identity.Account.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Account.put/3","doc":"","ref":"Bonfire.Data.Identity.Account.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Accounted","doc":"A mixin for an account ID, indicating ownership\n\nPrimarily used for Users.","ref":"Bonfire.Data.Identity.Accounted.html"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.delete/2","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.get/3","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Accounted.put/3","doc":"","ref":"Bonfire.Data.Identity.Accounted.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Alias","doc":"","ref":"Bonfire.Data.Identity.Alias.html"},{"type":"function","title":"Bonfire.Data.Identity.Alias.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Alias.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Alias.delete/2","doc":"","ref":"Bonfire.Data.Identity.Alias.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Alias.get/3","doc":"","ref":"Bonfire.Data.Identity.Alias.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Alias.put/3","doc":"","ref":"Bonfire.Data.Identity.Alias.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.AuthSecondFactor","doc":"A mixin that stores a second factor secret to authenticate an account.","ref":"Bonfire.Data.Identity.AuthSecondFactor.html"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.changeset/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.delete/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.get/3","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.put/3","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.AuthSecondFactor.valid_totp?/2","doc":"","ref":"Bonfire.Data.Identity.AuthSecondFactor.html#valid_totp?/2"},{"type":"module","title":"Bonfire.Data.Identity.CareClosure","doc":"A recursive view of all entities taken care of by their root entities.\n\nReally, really do not query this without providing a branch_id.","ref":"Bonfire.Data.Identity.CareClosure.html"},{"type":"function","title":"Bonfire.Data.Identity.CareClosure.by_branch/1","doc":"","ref":"Bonfire.Data.Identity.CareClosure.html#by_branch/1"},{"type":"module","title":"Bonfire.Data.Identity.Caretaker","doc":"The entity responsible for something. In practice, it means that\nsomething is deleted when its caretaker is deleted.\n\nYou can think of it as being like the creator, except:\na) You can give it away.\nb) Objects can take care of arbitrary objects, such as e.g. custom\n ACLs created to permit people mentioned special permissions","ref":"Bonfire.Data.Identity.Caretaker.html"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.delete/2","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.get/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Caretaker.put/3","doc":"","ref":"Bonfire.Data.Identity.Caretaker.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Character","doc":"A username mixin that denies reuse of the same or similar usernames\neven when the username has been deleted.","ref":"Bonfire.Data.Identity.Character.html"},{"type":"function","title":"Bonfire.Data.Identity.Character.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.changeset_basic/2","doc":"","ref":"Bonfire.Data.Identity.Character.html#changeset_basic/2"},{"type":"function","title":"Bonfire.Data.Identity.Character.delete/2","doc":"","ref":"Bonfire.Data.Identity.Character.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Character.get/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.hash/1","doc":"","ref":"Bonfire.Data.Identity.Character.html#hash/1"},{"type":"function","title":"Bonfire.Data.Identity.Character.put/3","doc":"","ref":"Bonfire.Data.Identity.Character.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.Character.uniform/1","doc":"","ref":"Bonfire.Data.Identity.Character.html#uniform/1"},{"type":"module","title":"Bonfire.Data.Identity.Credential","doc":"A Mixin that provides a password for local login.","ref":"Bonfire.Data.Identity.Credential.html"},{"type":"function","title":"Bonfire.Data.Identity.Credential.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.check_password/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#check_password/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.confirmation_changeset/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#confirmation_changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.delete/2","doc":"","ref":"Bonfire.Data.Identity.Credential.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Credential.dummy_check/0","doc":"","ref":"Bonfire.Data.Identity.Credential.html#dummy_check/0"},{"type":"function","title":"Bonfire.Data.Identity.Credential.get/3","doc":"","ref":"Bonfire.Data.Identity.Credential.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Credential.hash_password/1","doc":"","ref":"Bonfire.Data.Identity.Credential.html#hash_password/1"},{"type":"function","title":"Bonfire.Data.Identity.Credential.put/3","doc":"","ref":"Bonfire.Data.Identity.Credential.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Credential.Migration","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.create_credential_table/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#create_credential_table/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.create_credential_table/1","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#create_credential_table/1"},{"type":"function","title":"Bonfire.Data.Identity.Credential.Migration.drop_credential_table/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#drop_credential_table/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.migrate_credential/0","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#migrate_credential/0"},{"type":"macro","title":"Bonfire.Data.Identity.Credential.Migration.migrate_credential/1","doc":"","ref":"Bonfire.Data.Identity.Credential.Migration.html#migrate_credential/1"},{"type":"module","title":"Bonfire.Data.Identity.Email","doc":"","ref":"Bonfire.Data.Identity.Email.html"},{"type":"function","title":"Bonfire.Data.Identity.Email.changeset/3","doc":"Options:\n email_regex: Regexp.t (default very minimal validation)\n must_confirm?: bool (default true)","ref":"Bonfire.Data.Identity.Email.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.confirm/1","doc":"Changeset function. Marks the user's email as confirmed and removes\ntheir confirmation token.","ref":"Bonfire.Data.Identity.Email.html#confirm/1"},{"type":"function","title":"Bonfire.Data.Identity.Email.delete/2","doc":"","ref":"Bonfire.Data.Identity.Email.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.get/3","doc":"","ref":"Bonfire.Data.Identity.Email.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.may_confirm?/2","doc":"","ref":"Bonfire.Data.Identity.Email.html#may_confirm?/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.may_request_confirm_email?/2","doc":"Checks whether the user should be able to request a confirm email","ref":"Bonfire.Data.Identity.Email.html#may_request_confirm_email?/2"},{"type":"function","title":"Bonfire.Data.Identity.Email.put/3","doc":"","ref":"Bonfire.Data.Identity.Email.html#put/3"},{"type":"function","title":"Bonfire.Data.Identity.Email.put_token/1","doc":"Changeset function. Unconditionally sets the user as unconfirmed,\ngenerates a confirmation token and puts an expiry on it determined\nby the `:confirm_duration` config key (default one day).","ref":"Bonfire.Data.Identity.Email.html#put_token/1"},{"type":"function","title":"Bonfire.Data.Identity.Email.should_request_or_refresh?/2","doc":"Checks whether the user should request a new confirmation token or refresh it","ref":"Bonfire.Data.Identity.Email.html#should_request_or_refresh?/2"},{"type":"type","title":"Bonfire.Data.Identity.Email.t/0","doc":"","ref":"Bonfire.Data.Identity.Email.html#t:t/0"},{"type":"module","title":"Bonfire.Data.Identity.ExtraInfo","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.changeset/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.delete/2","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.get/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.ExtraInfo.put/3","doc":"","ref":"Bonfire.Data.Identity.ExtraInfo.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Named","doc":"","ref":"Bonfire.Data.Identity.Named.html"},{"type":"function","title":"Bonfire.Data.Identity.Named.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Named.delete/2","doc":"","ref":"Bonfire.Data.Identity.Named.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Named.get/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Named.normalize_name/1","doc":"","ref":"Bonfire.Data.Identity.Named.html#normalize_name/1"},{"type":"function","title":"Bonfire.Data.Identity.Named.put/3","doc":"","ref":"Bonfire.Data.Identity.Named.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Self","doc":"","ref":"Bonfire.Data.Identity.Self.html"},{"type":"function","title":"Bonfire.Data.Identity.Self.changeset/2","doc":"","ref":"Bonfire.Data.Identity.Self.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.Self.delete/2","doc":"","ref":"Bonfire.Data.Identity.Self.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Self.get/3","doc":"","ref":"Bonfire.Data.Identity.Self.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Self.put/3","doc":"","ref":"Bonfire.Data.Identity.Self.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.Settings","doc":"A mixin that stores settings (of the instance, account, user, etc) as an Erlang Term (typically a map or keyword list) encoded to binary.","ref":"Bonfire.Data.Identity.Settings.html"},{"type":"function","title":"Bonfire.Data.Identity.Settings.changeset/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#changeset/3"},{"type":"function","title":"Bonfire.Data.Identity.Settings.delete/2","doc":"","ref":"Bonfire.Data.Identity.Settings.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.Settings.get/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.Settings.put/3","doc":"","ref":"Bonfire.Data.Identity.Settings.html#put/3"},{"type":"module","title":"Bonfire.Data.Identity.SettingsJSONSerdeData","doc":"A custom Ecto type (based on `EctoSparkles.JSONSerdeData`) for handling the serialization of arbitrary data types stored as JSON data in the database. Requires the underlying DB field to be a map / JSONB field.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.cast/1","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#cast/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#cast/2"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.dump/1","doc":"Converting the data structure to a JSON binary for storage.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#dump/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.embed_as/1","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#embed_as/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.equal?/2","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#equal?/2"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.load/1","doc":"Convert the JSON binary value from the database back to the desired term.","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#load/1"},{"type":"function","title":"Bonfire.Data.Identity.SettingsJSONSerdeData.type/0","doc":"","ref":"Bonfire.Data.Identity.SettingsJSONSerdeData.html#type/0"},{"type":"module","title":"Bonfire.Data.Identity.User","doc":"A persona. A person (account) may have more than one user, but this\nis not exposed publicly (except to local instance administrators),\nso it is as if they are different people.","ref":"Bonfire.Data.Identity.User.html"},{"type":"function","title":"Bonfire.Data.Identity.User.changeset/2","doc":"","ref":"Bonfire.Data.Identity.User.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Identity.User.delete/2","doc":"","ref":"Bonfire.Data.Identity.User.html#delete/2"},{"type":"function","title":"Bonfire.Data.Identity.User.get/3","doc":"","ref":"Bonfire.Data.Identity.User.html#get/3"},{"type":"function","title":"Bonfire.Data.Identity.User.maybe_redact/1","doc":"","ref":"Bonfire.Data.Identity.User.html#maybe_redact/1"},{"type":"function","title":"Bonfire.Data.Identity.User.put/3","doc":"","ref":"Bonfire.Data.Identity.User.html#put/3"},{"type":"module","title":"Bonfire.Data.SharedUser","doc":"A mixin for shared user personas (which multiple accounts can use)","ref":"Bonfire.Data.SharedUser.html"},{"type":"function","title":"Bonfire.Data.SharedUser.changeset/2","doc":"","ref":"Bonfire.Data.SharedUser.html#changeset/2"},{"type":"function","title":"Bonfire.Data.SharedUser.delete/2","doc":"","ref":"Bonfire.Data.SharedUser.html#delete/2"},{"type":"function","title":"Bonfire.Data.SharedUser.get/3","doc":"","ref":"Bonfire.Data.SharedUser.html#get/3"},{"type":"function","title":"Bonfire.Data.SharedUser.put/3","doc":"","ref":"Bonfire.Data.SharedUser.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.APActivity","doc":"","ref":"Bonfire.Data.Social.APActivity.html"},{"type":"function","title":"Bonfire.Data.Social.APActivity.changeset/2","doc":"","ref":"Bonfire.Data.Social.APActivity.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.APActivity.delete/2","doc":"","ref":"Bonfire.Data.Social.APActivity.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.APActivity.get/3","doc":"","ref":"Bonfire.Data.Social.APActivity.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.APActivity.put/3","doc":"","ref":"Bonfire.Data.Social.APActivity.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Activity","doc":"","ref":"Bonfire.Data.Social.Activity.html"},{"type":"function","title":"Bonfire.Data.Social.Activity.changeset/2","doc":"","ref":"Bonfire.Data.Social.Activity.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Activity.delete/2","doc":"","ref":"Bonfire.Data.Social.Activity.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Activity.get/3","doc":"","ref":"Bonfire.Data.Social.Activity.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Activity.put/3","doc":"","ref":"Bonfire.Data.Social.Activity.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Bookmark","doc":"","ref":"Bonfire.Data.Social.Bookmark.html"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.changeset/2","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.delete/2","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.get/3","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Bookmark.put/3","doc":"","ref":"Bonfire.Data.Social.Bookmark.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Boost","doc":"","ref":"Bonfire.Data.Social.Boost.html"},{"type":"function","title":"Bonfire.Data.Social.Boost.changeset/2","doc":"","ref":"Bonfire.Data.Social.Boost.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Boost.delete/2","doc":"","ref":"Bonfire.Data.Social.Boost.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Boost.get/3","doc":"","ref":"Bonfire.Data.Social.Boost.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Boost.put/3","doc":"","ref":"Bonfire.Data.Social.Boost.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Created","doc":"","ref":"Bonfire.Data.Social.Created.html"},{"type":"function","title":"Bonfire.Data.Social.Created.changeset/2","doc":"","ref":"Bonfire.Data.Social.Created.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Created.delete/2","doc":"","ref":"Bonfire.Data.Social.Created.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Created.get/3","doc":"","ref":"Bonfire.Data.Social.Created.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Created.put/3","doc":"","ref":"Bonfire.Data.Social.Created.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Emoji","doc":"","ref":"Bonfire.Data.Social.Emoji.html"},{"type":"function","title":"Bonfire.Data.Social.Emoji.changeset/2","doc":"","ref":"Bonfire.Data.Social.Emoji.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Emoji.delete/2","doc":"","ref":"Bonfire.Data.Social.Emoji.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Emoji.get/3","doc":"","ref":"Bonfire.Data.Social.Emoji.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Emoji.put/3","doc":"","ref":"Bonfire.Data.Social.Emoji.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Feed","doc":"","ref":"Bonfire.Data.Social.Feed.html"},{"type":"function","title":"Bonfire.Data.Social.Feed.changeset/2","doc":"","ref":"Bonfire.Data.Social.Feed.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Feed.delete/2","doc":"","ref":"Bonfire.Data.Social.Feed.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Feed.get/3","doc":"","ref":"Bonfire.Data.Social.Feed.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Feed.put/3","doc":"","ref":"Bonfire.Data.Social.Feed.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.FeedPublish","doc":"A multimixin for an activity/object appearing in a feed.\n\nA quite interesting thing about this model is that `feed`\nreferences `Pointer`, so it isn't only things of type `Feed` that it can\nappear in, they are just an obvious choice.","ref":"Bonfire.Data.Social.FeedPublish.html"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.changeset/2","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.delete/2","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.get/3","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.FeedPublish.put/3","doc":"","ref":"Bonfire.Data.Social.FeedPublish.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Flag","doc":"","ref":"Bonfire.Data.Social.Flag.html"},{"type":"function","title":"Bonfire.Data.Social.Flag.changeset/2","doc":"","ref":"Bonfire.Data.Social.Flag.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Flag.delete/2","doc":"","ref":"Bonfire.Data.Social.Flag.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Flag.get/3","doc":"","ref":"Bonfire.Data.Social.Flag.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Flag.put/3","doc":"","ref":"Bonfire.Data.Social.Flag.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Follow","doc":"","ref":"Bonfire.Data.Social.Follow.html"},{"type":"function","title":"Bonfire.Data.Social.Follow.changeset/2","doc":"","ref":"Bonfire.Data.Social.Follow.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Follow.delete/2","doc":"","ref":"Bonfire.Data.Social.Follow.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Follow.get/3","doc":"","ref":"Bonfire.Data.Social.Follow.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Follow.put/3","doc":"","ref":"Bonfire.Data.Social.Follow.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Like","doc":"","ref":"Bonfire.Data.Social.Like.html"},{"type":"function","title":"Bonfire.Data.Social.Like.changeset/2","doc":"","ref":"Bonfire.Data.Social.Like.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Like.delete/2","doc":"","ref":"Bonfire.Data.Social.Like.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Like.get/3","doc":"","ref":"Bonfire.Data.Social.Like.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Like.put/3","doc":"","ref":"Bonfire.Data.Social.Like.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Message","doc":"","ref":"Bonfire.Data.Social.Message.html"},{"type":"function","title":"Bonfire.Data.Social.Message.changeset/2","doc":"","ref":"Bonfire.Data.Social.Message.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Message.delete/2","doc":"","ref":"Bonfire.Data.Social.Message.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Message.get/3","doc":"","ref":"Bonfire.Data.Social.Message.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Message.put/3","doc":"","ref":"Bonfire.Data.Social.Message.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Pin","doc":"","ref":"Bonfire.Data.Social.Pin.html"},{"type":"function","title":"Bonfire.Data.Social.Pin.changeset/2","doc":"","ref":"Bonfire.Data.Social.Pin.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Pin.delete/2","doc":"","ref":"Bonfire.Data.Social.Pin.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Pin.get/3","doc":"","ref":"Bonfire.Data.Social.Pin.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Pin.put/3","doc":"","ref":"Bonfire.Data.Social.Pin.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Post","doc":"","ref":"Bonfire.Data.Social.Post.html"},{"type":"function","title":"Bonfire.Data.Social.Post.changeset/2","doc":"","ref":"Bonfire.Data.Social.Post.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Post.delete/2","doc":"","ref":"Bonfire.Data.Social.Post.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Post.get/3","doc":"","ref":"Bonfire.Data.Social.Post.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Post.put/3","doc":"","ref":"Bonfire.Data.Social.Post.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.PostContent","doc":"","ref":"Bonfire.Data.Social.PostContent.html"},{"type":"function","title":"Bonfire.Data.Social.PostContent.changeset/2","doc":"","ref":"Bonfire.Data.Social.PostContent.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.PostContent.delete/2","doc":"","ref":"Bonfire.Data.Social.PostContent.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.PostContent.get/3","doc":"","ref":"Bonfire.Data.Social.PostContent.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.PostContent.put/3","doc":"","ref":"Bonfire.Data.Social.PostContent.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Profile","doc":"","ref":"Bonfire.Data.Social.Profile.html"},{"type":"function","title":"Bonfire.Data.Social.Profile.changeset/2","doc":"","ref":"Bonfire.Data.Social.Profile.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Profile.delete/2","doc":"","ref":"Bonfire.Data.Social.Profile.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Profile.get/3","doc":"","ref":"Bonfire.Data.Social.Profile.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Profile.put/3","doc":"","ref":"Bonfire.Data.Social.Profile.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Replied","doc":"","ref":"Bonfire.Data.Social.Replied.html"},{"type":"function","title":"Bonfire.Data.Social.Replied.ancestor_ids/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#ancestor_ids/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.ancestors/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#ancestors/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.arrange/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#arrange/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.build_child/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#build_child/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.changeset/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.children/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#children/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.delete/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.depth/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#depth/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.descendants/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#descendants/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.get/3","doc":"","ref":"Bonfire.Data.Social.Replied.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Replied.make_child_of/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#make_child_of/2"},{"type":"function","title":"Bonfire.Data.Social.Replied.parent/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#parent/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.parent_id/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#parent_id/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.path/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#path/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.path_ids/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#path_ids/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.put/3","doc":"","ref":"Bonfire.Data.Social.Replied.html#put/3"},{"type":"function","title":"Bonfire.Data.Social.Replied.root/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.root?/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root?/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.root_id/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#root_id/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.siblings/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#siblings/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.subtree/1","doc":"","ref":"Bonfire.Data.Social.Replied.html#subtree/1"},{"type":"function","title":"Bonfire.Data.Social.Replied.where_depth/2","doc":"","ref":"Bonfire.Data.Social.Replied.html#where_depth/2"},{"type":"module","title":"Bonfire.Data.Social.Request","doc":"","ref":"Bonfire.Data.Social.Request.html"},{"type":"function","title":"Bonfire.Data.Social.Request.changeset/2","doc":"","ref":"Bonfire.Data.Social.Request.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Request.delete/2","doc":"","ref":"Bonfire.Data.Social.Request.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Request.get/3","doc":"","ref":"Bonfire.Data.Social.Request.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Request.put/3","doc":"","ref":"Bonfire.Data.Social.Request.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Seen","doc":"Track seen/unseen (similar to read/unread, but only indicates that it was displayed in a feed or other listing for the user, not that they actually read it) status of things (usually an `Activity`)","ref":"Bonfire.Data.Social.Seen.html"},{"type":"function","title":"Bonfire.Data.Social.Seen.changeset/2","doc":"","ref":"Bonfire.Data.Social.Seen.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Seen.delete/2","doc":"","ref":"Bonfire.Data.Social.Seen.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Seen.get/3","doc":"","ref":"Bonfire.Data.Social.Seen.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Seen.put/3","doc":"","ref":"Bonfire.Data.Social.Seen.html#put/3"},{"type":"module","title":"Bonfire.Data.Social.Sensitive","doc":"","ref":"Bonfire.Data.Social.Sensitive.html"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.changeset/2","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#changeset/2"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.delete/2","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#delete/2"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.get/3","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#get/3"},{"type":"function","title":"Bonfire.Data.Social.Sensitive.put/3","doc":"","ref":"Bonfire.Data.Social.Sensitive.html#put/3"},{"type":"module","title":"Bonfire.UI.Common","doc":"A library of common utils and helpers used across Bonfire extensions\n\n- Many common functions for web UIs \n- Common and generic re-usable components\n- Etc","ref":"Bonfire.UI.Common.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Common","doc":"","ref":"Bonfire.UI.Common.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Common","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Common.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Common.assign_error/3","doc":"","ref":"Bonfire.UI.Common.html#assign_error/3"},{"type":"function","title":"Bonfire.UI.Common.assign_flash/5","doc":"","ref":"Bonfire.UI.Common.html#assign_flash/5"},{"type":"function","title":"Bonfire.UI.Common.assign_generic/2","doc":"","ref":"Bonfire.UI.Common.html#assign_generic/2"},{"type":"function","title":"Bonfire.UI.Common.assign_generic/3","doc":"","ref":"Bonfire.UI.Common.html#assign_generic/3"},{"type":"function","title":"Bonfire.UI.Common.assign_generic_global/2","doc":"","ref":"Bonfire.UI.Common.html#assign_generic_global/2"},{"type":"function","title":"Bonfire.UI.Common.assign_global/2","doc":"","ref":"Bonfire.UI.Common.html#assign_global/2"},{"type":"function","title":"Bonfire.UI.Common.assign_global/3","doc":"","ref":"Bonfire.UI.Common.html#assign_global/3"},{"type":"function","title":"Bonfire.UI.Common.assigns/1","doc":"","ref":"Bonfire.UI.Common.html#assigns/1"},{"type":"function","title":"Bonfire.UI.Common.assigns_clean/1","doc":"","ref":"Bonfire.UI.Common.html#assigns_clean/1"},{"type":"function","title":"Bonfire.UI.Common.assigns_merge/2","doc":"","ref":"Bonfire.UI.Common.html#assigns_merge/2"},{"type":"function","title":"Bonfire.UI.Common.assigns_merge/3","doc":"","ref":"Bonfire.UI.Common.html#assigns_merge/3"},{"type":"function","title":"Bonfire.UI.Common.assigns_minimal/1","doc":"","ref":"Bonfire.UI.Common.html#assigns_minimal/1"},{"type":"function","title":"Bonfire.UI.Common.assigns_subscribe/2","doc":"","ref":"Bonfire.UI.Common.html#assigns_subscribe/2"},{"type":"function","title":"Bonfire.UI.Common.batch_update_many_async/3","doc":"","ref":"Bonfire.UI.Common.html#batch_update_many_async/3"},{"type":"function","title":"Bonfire.UI.Common.batch_update_many_async/4","doc":"","ref":"Bonfire.UI.Common.html#batch_update_many_async/4"},{"type":"function","title":"Bonfire.UI.Common.can?/4","doc":"","ref":"Bonfire.UI.Common.html#can?/4"},{"type":"function","title":"Bonfire.UI.Common.cast_public/2","doc":"Warning: this will set assigns for any/all users who subscribe to them. You want to `cast_self/2` instead if dealing with user-specific actions or private data.","ref":"Bonfire.UI.Common.html#cast_public/2"},{"type":"function","title":"Bonfire.UI.Common.cast_self/2","doc":"","ref":"Bonfire.UI.Common.html#cast_self/2"},{"type":"function","title":"Bonfire.UI.Common.component_data/1","doc":"","ref":"Bonfire.UI.Common.html#component_data/1"},{"type":"function","title":"Bonfire.UI.Common.component_props/1","doc":"","ref":"Bonfire.UI.Common.html#component_props/1"},{"type":"function","title":"Bonfire.UI.Common.copy_go/1","doc":"copies the `go` param into a query string, if any","ref":"Bonfire.UI.Common.html#copy_go/1"},{"type":"function","title":"Bonfire.UI.Common.current_url/3","doc":"","ref":"Bonfire.UI.Common.html#current_url/3"},{"type":"function","title":"Bonfire.UI.Common.current_user_or_remote_interaction/3","doc":"","ref":"Bonfire.UI.Common.html#current_user_or_remote_interaction/3"},{"type":"function","title":"Bonfire.UI.Common.declared_extension/0","doc":"","ref":"Bonfire.UI.Common.html#declared_extension/0"},{"type":"function","title":"Bonfire.UI.Common.filename_for_module_template/1","doc":"","ref":"Bonfire.UI.Common.html#filename_for_module_template/1"},{"type":"function","title":"Bonfire.UI.Common.go_query/1","doc":"Generate a query string adding a `go` redirection path to the URI (for redirecting somewhere after auth flows).\nIt is recommended to use `set_go_after/2` where possible instead.","ref":"Bonfire.UI.Common.html#go_query/1"},{"type":"function","title":"Bonfire.UI.Common.hero_icons_list/0","doc":"","ref":"Bonfire.UI.Common.html#hero_icons_list/0"},{"type":"macro","title":"Bonfire.UI.Common.live_aliases/5","doc":"","ref":"Bonfire.UI.Common.html#live_aliases/5"},{"type":"function","title":"Bonfire.UI.Common.live_render_component/2","doc":"Special LiveView helper function which allows loading LiveComponents in regular Phoenix views: `live_render_component(@conn, MyLiveComponent)`","ref":"Bonfire.UI.Common.html#live_render_component/2"},{"type":"function","title":"Bonfire.UI.Common.live_render_with_conn/2","doc":"","ref":"Bonfire.UI.Common.html#live_render_with_conn/2"},{"type":"function","title":"Bonfire.UI.Common.live_upload_files/5","doc":"","ref":"Bonfire.UI.Common.html#live_upload_files/5"},{"type":"function","title":"Bonfire.UI.Common.markdown/1","doc":"","ref":"Bonfire.UI.Common.html#markdown/1"},{"type":"function","title":"Bonfire.UI.Common.maybe_apply_or_ret/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_apply_or_ret/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_assign/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_assign/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_assign_context/2","doc":"","ref":"Bonfire.UI.Common.html#maybe_assign_context/2"},{"type":"function","title":"Bonfire.UI.Common.maybe_component/2","doc":"","ref":"Bonfire.UI.Common.html#maybe_component/2"},{"type":"function","title":"Bonfire.UI.Common.maybe_consume_uploaded_entries/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_consume_uploaded_entries/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_consume_uploaded_entry/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_consume_uploaded_entry/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_cute_gif/0","doc":"","ref":"Bonfire.UI.Common.html#maybe_cute_gif/0"},{"type":"function","title":"Bonfire.UI.Common.maybe_last_sentry_event_id/0","doc":"","ref":"Bonfire.UI.Common.html#maybe_last_sentry_event_id/0"},{"type":"function","title":"Bonfire.UI.Common.maybe_push_event/3","doc":"","ref":"Bonfire.UI.Common.html#maybe_push_event/3"},{"type":"function","title":"Bonfire.UI.Common.maybe_send_update/4","doc":"","ref":"Bonfire.UI.Common.html#maybe_send_update/4"},{"type":"function","title":"Bonfire.UI.Common.maybe_stream_insert/4","doc":"Inserts one or many items in an existing stream.\nSee `Phoenix.LiveView.stream_insert/4` for opts.","ref":"Bonfire.UI.Common.html#maybe_stream_insert/4"},{"type":"function","title":"Bonfire.UI.Common.module_default_assigns/1","doc":"","ref":"Bonfire.UI.Common.html#module_default_assigns/1"},{"type":"function","title":"Bonfire.UI.Common.opts_for_update_many_async/2","doc":"","ref":"Bonfire.UI.Common.html#opts_for_update_many_async/2"},{"type":"function","title":"Bonfire.UI.Common.patch_to/3","doc":"","ref":"Bonfire.UI.Common.html#patch_to/3"},{"type":"function","title":"Bonfire.UI.Common.path_fallback/2","doc":"","ref":"Bonfire.UI.Common.html#path_fallback/2"},{"type":"function","title":"Bonfire.UI.Common.redirect_self/1","doc":"","ref":"Bonfire.UI.Common.html#redirect_self/1"},{"type":"function","title":"Bonfire.UI.Common.redirect_to/3","doc":"","ref":"Bonfire.UI.Common.html#redirect_to/3"},{"type":"function","title":"Bonfire.UI.Common.redirect_to_previous_go/4","doc":"","ref":"Bonfire.UI.Common.html#redirect_to_previous_go/4"},{"type":"macro","title":"Bonfire.UI.Common.render_sface_or_native/1","doc":"","ref":"Bonfire.UI.Common.html#render_sface_or_native/1"},{"type":"function","title":"Bonfire.UI.Common.rich/2","doc":"","ref":"Bonfire.UI.Common.html#rich/2"},{"type":"function","title":"Bonfire.UI.Common.self_subscribe/2","doc":"Subscribe to assigns targeted at the current account/user","ref":"Bonfire.UI.Common.html#self_subscribe/2"},{"type":"function","title":"Bonfire.UI.Common.send_self/2","doc":"","ref":"Bonfire.UI.Common.html#send_self/2"},{"type":"function","title":"Bonfire.UI.Common.send_self_global/2","doc":"","ref":"Bonfire.UI.Common.html#send_self_global/2"},{"type":"function","title":"Bonfire.UI.Common.set_go_after/2","doc":"Save a `go` redirection path in the session (for redirecting somewhere after auth flows)","ref":"Bonfire.UI.Common.html#set_go_after/2"},{"type":"function","title":"Bonfire.UI.Common.socket_connected?/1","doc":"Checks if the socket is connected.","ref":"Bonfire.UI.Common.html#socket_connected?/1"},{"type":"function","title":"Examples - Bonfire.UI.Common.socket_connected?/1","doc":"iex> socket_connected?(%{socket_connected?: true})\n true\n\n iex> socket_connected?(%{socket_connected?: false})\n false\n\n iex> socket_connected?(%{__context__: %{socket_connected?: true}})\n true\n \n iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: 1})\n true\n\n iex> socket_connected?(%Phoenix.LiveView.Socket{transport_pid: nil})\n false","ref":"Bonfire.UI.Common.html#socket_connected?/1-examples"},{"type":"function","title":"Bonfire.UI.Common.templated/2","doc":"","ref":"Bonfire.UI.Common.html#templated/2"},{"type":"function","title":"Bonfire.UI.Common.templated_or_remote_markdown/2","doc":"","ref":"Bonfire.UI.Common.html#templated_or_remote_markdown/2"},{"type":"function","title":"Bonfire.UI.Common.the_object/1","doc":"","ref":"Bonfire.UI.Common.html#the_object/1"},{"type":"function","title":"Bonfire.UI.Common.undead_mount/2","doc":"Run a function and expects tuple.\nIf anything else is returned, like an error, a flash message is shown to the user.","ref":"Bonfire.UI.Common.html#undead_mount/2"},{"type":"function","title":"Bonfire.UI.Common.undead_on_mount/2","doc":"","ref":"Bonfire.UI.Common.html#undead_on_mount/2"},{"type":"function","title":"Bonfire.UI.Common.undead_render/2","doc":"","ref":"Bonfire.UI.Common.html#undead_render/2"},{"type":"function","title":"Bonfire.UI.Common.undead_update/2","doc":"","ref":"Bonfire.UI.Common.html#undead_update/2"},{"type":"function","title":"Bonfire.UI.Common.update_many_async/2","doc":"","ref":"Bonfire.UI.Common.html#update_many_async/2"},{"type":"function","title":"Bonfire.UI.Common.update_many_async/3","doc":"","ref":"Bonfire.UI.Common.html#update_many_async/3"},{"type":"module","title":"Bonfire.UI.Common.ComponentID","doc":"","ref":"Bonfire.UI.Common.ComponentID.html"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.new/3","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#new/3"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.send_assigns/5","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#send_assigns/5"},{"type":"function","title":"Bonfire.UI.Common.ComponentID.send_updates/4","doc":"","ref":"Bonfire.UI.Common.ComponentID.html#send_updates/4"},{"type":"module","title":"Bonfire.UI.Common.Endpoint.LiveReload","doc":"","ref":"Bonfire.UI.Common.Endpoint.LiveReload.html"},{"type":"module","title":"Bonfire.UI.Common.EndpointTemplate","doc":"","ref":"Bonfire.UI.Common.EndpointTemplate.html"},{"type":"function","title":"Bonfire.UI.Common.EndpointTemplate.session_options/0","doc":"","ref":"Bonfire.UI.Common.EndpointTemplate.html#session_options/0"},{"type":"module","title":"Bonfire.UI.Common.ErrorHandling","doc":"","ref":"Bonfire.UI.Common.ErrorHandling.html"},{"type":"function","title":"Bonfire.UI.Common.ErrorHandling.undead/3","doc":"","ref":"Bonfire.UI.Common.ErrorHandling.html#undead/3"},{"type":"module","title":"Bonfire.UI.Common.ErrorHelpers","doc":"Conveniences for translating and building error messages.","ref":"Bonfire.UI.Common.ErrorHelpers.html"},{"type":"function","title":"Bonfire.UI.Common.ErrorHelpers.error_tag/2","doc":"Generates tag for inlined form input errors.\n# TODO: use `Surface.Components.Form.ErrorTag` instead","ref":"Bonfire.UI.Common.ErrorHelpers.html#error_tag/2"},{"type":"function","title":"Bonfire.UI.Common.ErrorHelpers.translate_error/1","doc":"Translates an error message using gettext.","ref":"Bonfire.UI.Common.ErrorHelpers.html#translate_error/1"},{"type":"module","title":"Bonfire.UI.Common.ErrorReportingPlug","doc":"","ref":"Bonfire.UI.Common.ErrorReportingPlug.html"},{"type":"module","title":"Bonfire.UI.Common.LiveHandlers","doc":"usage examples:\n\n`phx-submit=\"Bonfire.Posts:post\"` will be routed to `Bonfire.Posts.LiveHandler.handle_event(\"post\", ...`\n\n`PubSub.broadcast(feed_id, {{Bonfire.Social.Feeds, :new_activity}, activity})` will be routed to `Bonfire.Social.Feeds.LiveHandler.handle_info({:new_activity, activity}, ...`\n\n`href=\"?Bonfire.Social.Feeds[after]=<%= e(@page_info, :end_cursor, nil) %>\"` will be routed to `Bonfire.Social.Feeds.LiveHandler.handle_params(%{\"after\" => cursor_after} ...`","ref":"Bonfire.UI.Common.LiveHandlers.html"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.assign_attrs/2","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#assign_attrs/2"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_event/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_event/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_info/4","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_info/4"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_params/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_params/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.handle_progress/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#handle_progress/5"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.maybe_from_json/1","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#maybe_from_json/1"},{"type":"function","title":"Bonfire.UI.Common.LiveHandlers.mod_delegate/5","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#mod_delegate/5"},{"type":"macro","title":"Bonfire.UI.Common.LiveHandlers.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.LiveHandlers.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs","doc":"Like a plug, but for a liveview","ref":"Bonfire.UI.Common.LivePlugs.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.maybe_send_persistent_assigns/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.html#maybe_send_persistent_assigns/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Csrf","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Csrf.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Csrf.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Csrf.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Helpers","doc":"Like a plug, but for a liveview","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Helpers.assign_default_params/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html#assign_default_params/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Helpers.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Helpers.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.Locale","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.assign_put_locale/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#assign_put_locale/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.assign_put_locale/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#assign_put_locale/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.default/2","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#default/2"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.Locale.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.Locale.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.LivePlugs.StaticChanged","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.StaticChanged.mount/3","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html#mount/3"},{"type":"function","title":"Bonfire.UI.Common.LivePlugs.StaticChanged.on_mount/4","doc":"","ref":"Bonfire.UI.Common.LivePlugs.StaticChanged.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.call/2","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.init/1","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.maybe_make_request_path_static/2","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#maybe_make_request_path_static/2"},{"type":"function","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.maybe_serve_static/2","doc":"","ref":"Bonfire.UI.Common.MaybeStaticGeneratorPlug.html#maybe_serve_static/2"},{"type":"module","title":"Bonfire.UI.Common.Modularity.DeclareHelpers","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html"},{"type":"function","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.component_props/1","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#component_props/1"},{"type":"function","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.component_type/1","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#component_type/1"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_module_optional/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_module_optional/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_nav_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_nav_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_nav_link/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_nav_link/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings/3","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings/3"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_nav_component/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_nav_component/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_settings_nav_link/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_settings_nav_link/2"},{"type":"macro","title":"Bonfire.UI.Common.Modularity.DeclareHelpers.declare_widget/2","doc":"","ref":"Bonfire.UI.Common.Modularity.DeclareHelpers.html#declare_widget/2"},{"type":"module","title":"Bonfire.UI.Common.MultiTenancyPlug","doc":"","ref":"Bonfire.UI.Common.MultiTenancyPlug.html"},{"type":"module","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.MultiselectLive.LiveHandler.html#sigil_p/2"},{"type":"behaviour","title":"Bonfire.UI.Common.NavModule","doc":"Add items to extensions' navigation sidebar.","ref":"Bonfire.UI.Common.NavModule.html"},{"type":"function","title":"Bonfire.UI.Common.NavModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.NavModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.UI.Common.NavModule.declared_nav/0","doc":"Declares a nav module, with links or nav components","ref":"Bonfire.UI.Common.NavModule.html#c:declared_nav/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.modules/0","doc":"","ref":"Bonfire.UI.Common.NavModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav/0","doc":"Load all navs","ref":"Bonfire.UI.Common.NavModule.html#nav/0"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav/1","doc":"Get navs for an extension","ref":"Bonfire.UI.Common.NavModule.html#nav/1"},{"type":"function","title":"Bonfire.UI.Common.NavModule.nav_function_error/2","doc":"","ref":"Bonfire.UI.Common.NavModule.html#nav_function_error/2"},{"type":"module","title":"Bonfire.UI.Common.Notifications","doc":"","ref":"Bonfire.UI.Common.Notifications.html"},{"type":"function","title":"Bonfire.UI.Common.Notifications.assign_notification/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#assign_notification/2"},{"type":"function","title":"Bonfire.UI.Common.Notifications.handle_event/3","doc":"","ref":"Bonfire.UI.Common.Notifications.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.Notifications.handle_info/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#handle_info/2"},{"type":"function","title":"Bonfire.UI.Common.Notifications.notify_broadcast/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#notify_broadcast/2"},{"type":"function","title":"Bonfire.UI.Common.Notifications.notify_broadcast/5","doc":"","ref":"Bonfire.UI.Common.Notifications.html#notify_broadcast/5"},{"type":"function","title":"Bonfire.UI.Common.Notifications.notify_me/4","doc":"","ref":"Bonfire.UI.Common.Notifications.html#notify_me/4"},{"type":"function","title":"Bonfire.UI.Common.Notifications.receive_flash/3","doc":"","ref":"Bonfire.UI.Common.Notifications.html#receive_flash/3"},{"type":"function","title":"Bonfire.UI.Common.Notifications.receive_notification/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#receive_notification/2"},{"type":"macro","title":"Bonfire.UI.Common.Notifications.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.Notifications.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Common.PlugProtect","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.allow_action/3","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#allow_action/3"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.block_action/3","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#block_action/3"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.call/2","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.PlugProtect.init/1","doc":"","ref":"Bonfire.UI.Common.PlugProtect.html#init/1"},{"type":"module","title":"Bonfire.UI.Common.Plugs.ActivityPub","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.call/2","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.init/1","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.maybe_redirect/1","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#maybe_redirect/1"},{"type":"function","title":"Bonfire.UI.Common.Plugs.ActivityPub.with_headers/3","doc":"","ref":"Bonfire.UI.Common.Plugs.ActivityPub.html#with_headers/3"},{"type":"module","title":"Bonfire.UI.Common.Presence","doc":"WIP for tracking online users. Used by `PersistentLive`","ref":"Bonfire.UI.Common.Presence.html"},{"type":"function","title":"Bonfire.UI.Common.Presence.child_spec/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#child_spec/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.fetch/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#fetch/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.fetchers_pids/0","doc":"","ref":"Bonfire.UI.Common.Presence.html#fetchers_pids/0"},{"type":"function","title":"Bonfire.UI.Common.Presence.get_by_key/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#get_by_key/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.handle_info/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#handle_info/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.list/0","doc":"","ref":"Bonfire.UI.Common.Presence.html#list/0"},{"type":"function","title":"Bonfire.UI.Common.Presence.list/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#list/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.list_and_maybe_subscribe_to_presence/1","doc":"","ref":"Bonfire.UI.Common.Presence.html#list_and_maybe_subscribe_to_presence/1"},{"type":"function","title":"Bonfire.UI.Common.Presence.present!/2","doc":"Join a user to the list of those who are present","ref":"Bonfire.UI.Common.Presence.html#present!/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.present?/2","doc":"Check if a given user (or the current user) is in the list of those who are present","ref":"Bonfire.UI.Common.Presence.html#present?/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.present_meta/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#present_meta/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.track/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#track/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.track/4","doc":"","ref":"Bonfire.UI.Common.Presence.html#track/4"},{"type":"function","title":"Bonfire.UI.Common.Presence.untrack/2","doc":"","ref":"Bonfire.UI.Common.Presence.html#untrack/2"},{"type":"function","title":"Bonfire.UI.Common.Presence.untrack/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#untrack/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.update/3","doc":"","ref":"Bonfire.UI.Common.Presence.html#update/3"},{"type":"function","title":"Bonfire.UI.Common.Presence.update/4","doc":"","ref":"Bonfire.UI.Common.Presence.html#update/4"},{"type":"module","title":"Bonfire.UI.Common.PreviewContentLive","doc":"A special 'modal' for previewing objects from a feed without redirecting to a new view (so we can go back to where we were in the feed)","ref":"Bonfire.UI.Common.PreviewContentLive.html"},{"type":"module","title":"Properties - Bonfire.UI.Common.PreviewContentLive","doc":"* **id** *:string, required: true* - The id of the live component (required by LiveView for stateful components).\n\n* **source_inspector_attrs** *:map, default: %{}*\n* **title_text** *:string, default: nil* - The title of the modal. Only used if no title slot is passed.\n* **title_class** *:css_class, default: nil* - The classes of the title of the modal\n* **show** *:boolean, default: false* - Force modal to be open\n* **no_header** *:boolean, default: false* - Optional prop to hide the header at the top of the modal\n* **modal_class** *:string, default: nil* - The classes of the modal.\n* **modal_assigns** *:any, default: []* - Additional assigns for the modal\n\n* **opts** *:keyword, default: []* - Additional attributes to add onto the modal wrapper","ref":"Bonfire.UI.Common.PreviewContentLive.html#module-properties"},{"type":"module","title":"Slots - Bonfire.UI.Common.PreviewContentLive","doc":"* **default, arg: [:autocomplete]** - Slots for the contents of the modal, title, buttons...\n\n* **open_btn**\n* **action_btns**\n* **cancel_btn**\n* **title**\n* **extra_contents**","ref":"Bonfire.UI.Common.PreviewContentLive.html#module-slots"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.handle_event/3","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.mount/1","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#mount/1"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.render/1","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#render/1"},{"type":"macro","title":"Bonfire.UI.Common.PreviewContentLive.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.PreviewContentLive.update/2","doc":"","ref":"Bonfire.UI.Common.PreviewContentLive.html#update/2"},{"type":"module","title":"Bonfire.UI.Common.ReusableModalLive","doc":"The classic **modal**","ref":"Bonfire.UI.Common.ReusableModalLive.html"},{"type":"module","title":"Properties - Bonfire.UI.Common.ReusableModalLive","doc":"* **id** *:string, required: true* - The id of the live component (required by LiveView for stateful components).\n\n* **source_inspector_attrs** *:map, default: %{}*\n* **title_text** *:string, default: nil* - The title of the modal. Only used if no title slot is passed.\n* **image_preview** *:boolean, default: false* - If the modal is a preview of an image, set this to true.\n* **title_class** *:css_class, default: nil* - The classes of the title of the modal\n* **modal_class** *:css_class, default: \"\"* - The classes of the modal.\n* **wrapper_class** *:css_class, default: nil* - The classes of the modal wrapper.\n* **action_btns_wrapper_class** *:css_class, default: nil* - The classes around the action/submit button(s) on the modal\n* **cancel_btn_class** *:css_class, default: nil* - The classes of the close/cancel button on the modal. Only used if no close_btn slot is passed.\n* **cancel_label** *:string, default: nil*\n* **show** *:boolean, default: false* - Force modal to be open\n* **form_opts** *:map, default: %{}*\n* **no_actions** *:boolean, default: false* - Optional prop to hide the actions at the bottom of the modal\n* **no_header** *:boolean, default: false* - Optional prop to hide the header at the top of the modal\n* **no_backdrop** *:boolean, default: false*\n* **modal_assigns** *:any, default: []* - Additional assigns to pass on to the optional modal sub-component\n\n* **opts** *:keyword, default: []* - Additional attributes to add onto the modal wrapper\n\n* **autocomplete** *:list, default: []*","ref":"Bonfire.UI.Common.ReusableModalLive.html#module-properties"},{"type":"module","title":"Slots - Bonfire.UI.Common.ReusableModalLive","doc":"* **open_btn, arg: [autocomplete: :list, value: :any]** - Slots for the contents of the modal, title, buttons...\n\n* **action_btns**\n* **cancel_btn**\n* **title**\n* **default, arg: [autocomplete: :list, value: :any]**","ref":"Bonfire.UI.Common.ReusableModalLive.html#module-slots"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.default_assigns/0","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#default_assigns/0"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.handle_event/3","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.modal_id/1","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#modal_id/1"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.mount/1","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#mount/1"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.render/1","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#render/1"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.set/3","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#set/3"},{"type":"macro","title":"Bonfire.UI.Common.ReusableModalLive.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.ReusableModalLive.update/2","doc":"","ref":"Bonfire.UI.Common.ReusableModalLive.html#update/2"},{"type":"module","title":"Bonfire.UI.Common.Routes","doc":"","ref":"Bonfire.UI.Common.Routes.html"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_authed/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_authed/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_guest/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_guest/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.early_hints_shared/0","doc":"","ref":"Bonfire.UI.Common.Routes.html#early_hints_shared/0"},{"type":"function","title":"Bonfire.UI.Common.Routes.gon_js_config/0","doc":"Config keys to make available in JS (via Phoenix Gon lib)","ref":"Bonfire.UI.Common.Routes.html#gon_js_config/0"},{"type":"module","title":"Bonfire.UI.Common.SEO","doc":"","ref":"Bonfire.UI.Common.SEO.html"},{"type":"function","title":"Bonfire.UI.Common.SEO.config/0","doc":"Get configuration for SEO.\n\nconfig/0 will return all SEO config\nconfig/1 with SEO domain atom will return that domain's config","ref":"Bonfire.UI.Common.SEO.html#config/0"},{"type":"function","title":"Bonfire.UI.Common.SEO.open_graph_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#open_graph_config/1"},{"type":"function","title":"Bonfire.UI.Common.SEO.site_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#site_config/1"},{"type":"function","title":"Bonfire.UI.Common.SEO.twitter_config/1","doc":"","ref":"Bonfire.UI.Common.SEO.html#twitter_config/1"},{"type":"module","title":"Bonfire.UI.Common.SEOImage","doc":"","ref":"Bonfire.UI.Common.SEOImage.html"},{"type":"function","title":"Bonfire.UI.Common.SEOImage.generate_path/6","doc":"","ref":"Bonfire.UI.Common.SEOImage.html#generate_path/6"},{"type":"behaviour","title":"Bonfire.UI.Common.SettingsModule","doc":"Settings nav & components","ref":"Bonfire.UI.Common.SettingsModule.html"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#app_modules/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.component_function_error/2","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#component_function_error/2"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.components/0","doc":"Load all components at once","ref":"Bonfire.UI.Common.SettingsModule.html#components/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.components/1","doc":"Load components for an extension","ref":"Bonfire.UI.Common.SettingsModule.html#components/1"},{"type":"callback","title":"Bonfire.UI.Common.SettingsModule.declared_component/0","doc":"Declares a component component","ref":"Bonfire.UI.Common.SettingsModule.html#c:declared_component/0"},{"type":"callback","title":"Bonfire.UI.Common.SettingsModule.declared_nav/0","doc":"Declares a nav module, with links or nav components","ref":"Bonfire.UI.Common.SettingsModule.html#c:declared_nav/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.extension_has_components?/2","doc":"List extensions that have settings component(s)","ref":"Bonfire.UI.Common.SettingsModule.html#extension_has_components?/2"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules/0","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules_component/1","doc":"Get components identified by their module","ref":"Bonfire.UI.Common.SettingsModule.html#modules_component/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.modules_nav/1","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#modules_nav/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav/0","doc":"Load all navs","ref":"Bonfire.UI.Common.SettingsModule.html#nav/0"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav/1","doc":"Get navs for an extension","ref":"Bonfire.UI.Common.SettingsModule.html#nav/1"},{"type":"function","title":"Bonfire.UI.Common.SettingsModule.nav_function_error/2","doc":"","ref":"Bonfire.UI.Common.SettingsModule.html#nav_function_error/2"},{"type":"module","title":"Bonfire.UI.Common.SmartInput.LiveHandler","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.active_smart_input_component/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#active_smart_input_component/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.active_smart_input_components/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#active_smart_input_components/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.activity_type_or_reply/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#activity_type_or_reply/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.all_smart_input_components/0","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#all_smart_input_components/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.assign_open/2","doc":"Open the composer by setting assigns","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#assign_open/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.close_smart_input/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#close_smart_input/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.confirm_close_smart_input/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#confirm_close_smart_input/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.max_length/0","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#max_length/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maximize/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maximize/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maybe_from_json/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maybe_from_json/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.maybe_from_json_string/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#maybe_from_json_string/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.minimize/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#minimize/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open_type/4","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open_type/4"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.open_with_text_suggestion/3","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#open_with_text_suggestion/3"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.replace_input_next_time/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#replace_input_next_time/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.reply_to_param/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#reply_to_param/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.reset_input/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#reset_input/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.set/2","doc":"Set assigns in the smart input from anywhere in the app (whether using a live component or sticky live view)","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#set/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.set_smart_input_text/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#set_smart_input_text/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.show_main/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#show_main/2"},{"type":"macro","title":"Bonfire.UI.Common.SmartInput.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.smart_input_name/1","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#smart_input_name/1"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.switch_smart_input_type/2","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#switch_smart_input_type/2"},{"type":"function","title":"Bonfire.UI.Common.SmartInput.LiveHandler.toggle_expanded/4","doc":"","ref":"Bonfire.UI.Common.SmartInput.LiveHandler.html#toggle_expanded/4"},{"type":"behaviour","title":"Bonfire.UI.Common.SmartInputModule","doc":"Find a smart input module via the object type(s) it can create, or vice versa. Backed by a global cache of known smart input modules.\n\nTo add a module to this list, you should declare `@behaviour Bonfire.UI.Common.SmartInputModule` in it and define a `smart_input_module/0` function which returns a list of object types that it can create.\n\nExample:\n```\n@behaviour Bonfire.UI.Common.SmartInputModule\ndef smart_input_module, do: [:page, Bonfire.Pages.Page]\n```\n\nYou can then open the smart input composer / object creator using that declared type, for example:\n```\n \n```","ref":"Bonfire.UI.Common.SmartInputModule.html"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.SmartInputModule.html#app_modules/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.modules/0","doc":"","ref":"Bonfire.UI.Common.SmartInputModule.html#modules/0"},{"type":"callback","title":"Bonfire.UI.Common.SmartInputModule.smart_input_module/0","doc":"Declares a smart input module","ref":"Bonfire.UI.Common.SmartInputModule.html#c:smart_input_module/0"},{"type":"function","title":"Bonfire.UI.Common.SmartInputModule.smart_input_modules_types/0","doc":"Returns a list of smart input modules and the object type(s) it can create, and vice versa.","ref":"Bonfire.UI.Common.SmartInputModule.html#smart_input_modules_types/0"},{"type":"module","title":"Bonfire.UI.Common.StaticGenerator","doc":"Static-site generator which can take a list of URLs served by the current Phoenix server and output static HTML for them","ref":"Bonfire.UI.Common.StaticGenerator.html"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.base_path/0","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#base_path/0"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.batch/0","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#batch/0"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.file_exists_age/1","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#file_exists_age/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.file_exists_not_expired/1","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#file_exists_not_expired/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.generate/2","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#generate/2"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.get/3","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#get/3"},{"type":"function","title":"Bonfire.UI.Common.StaticGenerator.maybe_generate/2","doc":"","ref":"Bonfire.UI.Common.StaticGenerator.html#maybe_generate/2"},{"type":"module","title":"Bonfire.UI.Common.StaticGeneratorPlug","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.call/2","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#call/2"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.init/1","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#init/1"},{"type":"function","title":"Bonfire.UI.Common.StaticGeneratorPlug.make_request_path_static/2","doc":"","ref":"Bonfire.UI.Common.StaticGeneratorPlug.html#make_request_path_static/2"},{"type":"module","title":"Bonfire.UI.Common.Testing.Helpers","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_field_error/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_field_error/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_field_good/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_field_good/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash_kind/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash_kind/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_flash_message/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_flash_message/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_form_field_error/3","doc":"Helper function to test errors in form fields. Compatible with most recent versions of phoenix, unlike deprecated\nassert_field_error.","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_form_field_error/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.assert_form_field_good/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#assert_form_field_good/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/0","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/0"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.conn/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#conn/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_account!/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_account!/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_admin!/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_admin!/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_user!/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_user!/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fake_user_and_conn!/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fake_user_and_conn!/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fancy_fake_user!/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fancy_fake_user!/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.fancy_fake_user_on_test_instance/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#fancy_fake_user_on_test_instance/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_flash/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_flash/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_form_error/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_form_error/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.find_form_field_error/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#find_form_field_error/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_attr/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_attr/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_click/3","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_click/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_live/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_live/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_redirect/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_redirect/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_response/2","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_response/2"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.floki_submit/4","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#floki_submit/4"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_pubsub_wait/1","doc":"Wait for the LiveView to receive any queued PubSub broadcasts","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_pubsub_wait/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_sockets_disconnect/1","doc":"Disconnect all LiveViews associated with current user or account","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_sockets_disconnect/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.live_view_stop/1","doc":"Stop a specific LiveView","ref":"Bonfire.UI.Common.Testing.Helpers.html#live_view_stop/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.qualifiers_to_input_name/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#qualifiers_to_input_name/1"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.render_stateful/3","doc":"Render stateful Surface or LiveView components","ref":"Bonfire.UI.Common.Testing.Helpers.html#render_stateful/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.render_stateless/3","doc":"Render stateless Surface or LiveView components","ref":"Bonfire.UI.Common.Testing.Helpers.html#render_stateless/3"},{"type":"function","title":"Bonfire.UI.Common.Testing.Helpers.session_conn/1","doc":"","ref":"Bonfire.UI.Common.Testing.Helpers.html#session_conn/1"},{"type":"behaviour","title":"Bonfire.UI.Common.WidgetModule","doc":"Widgets: components that can be added to the dashboard or sidebards","ref":"Bonfire.UI.Common.WidgetModule.html"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.app_modules/0","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.UI.Common.WidgetModule.declared_widget/0","doc":"Declares a widget component","ref":"Bonfire.UI.Common.WidgetModule.html#c:declared_widget/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.modules/0","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#modules/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widget/1","doc":"Get a widget identified by module","ref":"Bonfire.UI.Common.WidgetModule.html#widget/1"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widget_function_error/2","doc":"","ref":"Bonfire.UI.Common.WidgetModule.html#widget_function_error/2"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widgets/0","doc":"Load all widgets at once","ref":"Bonfire.UI.Common.WidgetModule.html#widgets/0"},{"type":"function","title":"Bonfire.UI.Common.WidgetModule.widgets/1","doc":"Load widgets for an extension","ref":"Bonfire.UI.Common.WidgetModule.html#widgets/1"},{"type":"module","title":"Bonfire.UI.Coordination","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Coordination.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Coordination","doc":"","ref":"Bonfire.UI.Coordination.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Coordination","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Coordination.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Coordination.mailer/0","doc":"","ref":"Bonfire.UI.Coordination.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Coordination.remote_tag_id/0","doc":"","ref":"Bonfire.UI.Coordination.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.UI.Coordination.remote_tag_prefix/0","doc":"","ref":"Bonfire.UI.Coordination.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.UI.Coordination.repo/0","doc":"","ref":"Bonfire.UI.Coordination.html#repo/0"},{"type":"module","title":"Bonfire.UI.Coordination.FeedLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.FeedLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.FeedLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.ProcessLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.ProcessesLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.Routes","doc":"","ref":"Bonfire.UI.Coordination.Routes.html"},{"type":"function","title":"Bonfire.UI.Coordination.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Coordination.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Coordination.TaskLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TaskLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TaskLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.TasksLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TasksLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TasksLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Coordination.TodoLive.GraphQL","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Coordination.TodoLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Coordination.TodoLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Groups","doc":"Pages and UI components for groups in Bonfire.\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Groups.html"},{"type":"module","title":"Roadmap - Bonfire.UI.Groups","doc":"[Group Milestone](https://github.com/bonfire-networks/bonfire-app/milestone/33)","ref":"Bonfire.UI.Groups.html#module-roadmap"},{"type":"module","title":"Sponsors - Bonfire.UI.Groups","doc":"[Nlnet](https://nlnet.nl/project/Bonfire-FederatedGroups/index.html) | [Become a sponsor](https://opencollective.com/bonfire-networks)","ref":"Bonfire.UI.Groups.html#module-sponsors"},{"type":"module","title":"📖 Documentation - Bonfire.UI.Groups","doc":"* [Website](https://bonfirenetworks.org) \n* [Set up an instance](docs/DEPLOY.md) - for testing and evaluation only!\n* [Hacking on Bonfire](docs/HACKING.md) \n* [Code documentation](https://doc.bonfirenetworks.org/api-reference.html#content) \n* [Community chat](https://matrix.to/#/%23bonfire-networks:matrix.org)","ref":"Bonfire.UI.Groups.html#module-documentation"},{"type":"module","title":"Copyright and License - Bonfire.UI.Groups","doc":"Copyright (c) 2020-2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Groups.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.UI.Groups.LiveHandler","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Groups.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Groups.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Groups.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Groups.Routes","doc":"","ref":"Bonfire.UI.Groups.Routes.html"},{"type":"function","title":"Bonfire.UI.Groups.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Groups.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Groups.RuntimeConfig","doc":"","ref":"Bonfire.UI.Groups.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Groups.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Groups.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Groups.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Groups.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Kanban","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for a kanban app","ref":"Bonfire.UI.Kanban.html"},{"type":"module","title":"Handy commands - Bonfire.UI.Kanban","doc":"","ref":"Bonfire.UI.Kanban.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.UI.Kanban","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Kanban.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Kanban.mailer/0","doc":"","ref":"Bonfire.UI.Kanban.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Kanban.remote_tag_id/0","doc":"","ref":"Bonfire.UI.Kanban.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.UI.Kanban.remote_tag_prefix/0","doc":"","ref":"Bonfire.UI.Kanban.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.UI.Kanban.repo/0","doc":"","ref":"Bonfire.UI.Kanban.html#repo/0"},{"type":"module","title":"Bonfire.UI.Kanban.BoardLive.GraphQL","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Kanban.BoardLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Kanban.BoardLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Kanban.HomeLive.GraphQL","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Kanban.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Kanban.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Kanban.Routes","doc":"","ref":"Bonfire.UI.Kanban.Routes.html"},{"type":"function","title":"Bonfire.UI.Kanban.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Kanban.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Me","doc":"![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Me](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) for functionality around accounts, users, profiles, authentication, etc.\n\nThis extension is meant to be used by other extensions like [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me), which provide logic for the UI to work with.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Me.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Me.html"},{"type":"module","title":"Stack - Bonfire.UI.Me","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Me.html#module-stack"},{"type":"module","title":"Scaffolding - Bonfire.UI.Me","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Me.html#module-scaffolding"},{"type":"module","title":"Other resources - Bonfire.UI.Me","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Me.html#module-other-resources"},{"type":"module","title":"Copyright and License - Bonfire.UI.Me","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Me.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.UI.Me.mailer/0","doc":"","ref":"Bonfire.UI.Me.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Me.repo/0","doc":"","ref":"Bonfire.UI.Me.html#repo/0"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.AccountRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AccountRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AccountRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AccountRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.AdminRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AdminRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.AdminRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.AdminRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.get_current/2","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#get_current/2"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.LivePlugs.UserRequired","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.UserRequired.mount/3","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html#mount/3"},{"type":"function","title":"Bonfire.UI.Me.LivePlugs.UserRequired.on_mount/4","doc":"","ref":"Bonfire.UI.Me.LivePlugs.UserRequired.html#on_mount/4"},{"type":"module","title":"Bonfire.UI.Me.Plugs.AccountRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AccountRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AccountRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.AccountRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.AdminRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AdminRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.AdminRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.AdminRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.GuestOnly","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.GuestOnly.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.GuestOnly.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.GuestOnly.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccount.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.LoadCurrentUser.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Plugs.UserRequired","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html"},{"type":"function","title":"Bonfire.UI.Me.Plugs.UserRequired.call/2","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html#call/2"},{"type":"function","title":"Bonfire.UI.Me.Plugs.UserRequired.init/1","doc":"","ref":"Bonfire.UI.Me.Plugs.UserRequired.html#init/1"},{"type":"module","title":"Bonfire.UI.Me.Routes","doc":"","ref":"Bonfire.UI.Me.Routes.html"},{"type":"module","title":"Bonfire.UI.Me.RuntimeConfig","doc":"","ref":"Bonfire.UI.Me.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Me.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Me.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Me.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Me.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Messages.Routes","doc":"","ref":"Bonfire.UI.Messages.Routes.html"},{"type":"function","title":"Bonfire.UI.Messages.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Messages.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Messages.RuntimeConfig","doc":"","ref":"Bonfire.UI.Messages.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Messages.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Messages.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Messages.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Messages.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Moderation.RuntimeConfig","doc":"","ref":"Bonfire.UI.Moderation.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Moderation.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Moderation.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Moderation.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Moderation.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Posts.Routes","doc":"","ref":"Bonfire.UI.Posts.Routes.html"},{"type":"function","title":"Bonfire.UI.Posts.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Posts.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Posts.RuntimeConfig","doc":"","ref":"Bonfire.UI.Posts.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Posts.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Posts.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Posts.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Posts.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Reactions.Routes","doc":"","ref":"Bonfire.UI.Reactions.Routes.html"},{"type":"function","title":"Bonfire.UI.Reactions.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Reactions.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Reactions.RuntimeConfig","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.UI.Reactions.RuntimeConfig.declared_extension/0","doc":"","ref":"Bonfire.UI.Reactions.RuntimeConfig.html#declared_extension/0"},{"type":"module","title":"Bonfire.UI.Reflow.Integration","doc":"","ref":"Bonfire.UI.Reflow.Integration.html"},{"type":"function","title":"Bonfire.UI.Reflow.Integration.mailer/0","doc":"","ref":"Bonfire.UI.Reflow.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Reflow.Integration.repo/0","doc":"","ref":"Bonfire.UI.Reflow.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.InventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.MaterialsLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProcessLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProcessesLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.Reflow.ResourceLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.Reflow.Routes","doc":"","ref":"Bonfire.UI.Reflow.Routes.html"},{"type":"function","title":"Bonfire.UI.Reflow.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Reflow.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Social.Benchmark","doc":"","ref":"Bonfire.UI.Social.Benchmark.html"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_backend/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_backend/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_full_backend/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_full_backend/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_full_get/1","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_full_get/1"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_page/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_page/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_queries_without_benchee/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_queries_without_benchee/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_query_methods/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_query_methods/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.feed_render_page/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#feed_render_page/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.live_feed/1","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#live_feed/1"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.misc/0","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#misc/0"},{"type":"function","title":"Bonfire.UI.Social.Benchmark.render_feed/2","doc":"","ref":"Bonfire.UI.Social.Benchmark.html#render_feed/2"},{"type":"module","title":"Bonfire.UI.Social.Graph.RuntimeConfig","doc":"","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Social.Graph.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Social.Graph.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Social.Graph.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Social.Integration","doc":"","ref":"Bonfire.UI.Social.Integration.html"},{"type":"function","title":"Bonfire.UI.Social.Integration.mailer/0","doc":"","ref":"Bonfire.UI.Social.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.Social.Integration.repo/0","doc":"","ref":"Bonfire.UI.Social.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.Social.Routes","doc":"","ref":"Bonfire.UI.Social.Routes.html"},{"type":"function","title":"Bonfire.UI.Social.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Social.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Social.RuntimeConfig","doc":"","ref":"Bonfire.UI.Social.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Social.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Social.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Social.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Social.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.Topics","doc":"","ref":"Bonfire.UI.Topics.html"},{"type":"module","title":"Bonfire.UI.Topics.LiveHandler","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.Topics.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.Topics.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.Topics.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.Topics.Routes","doc":"","ref":"Bonfire.UI.Topics.Routes.html"},{"type":"function","title":"Bonfire.UI.Topics.Routes.declare_routes/0","doc":"","ref":"Bonfire.UI.Topics.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.UI.Topics.RuntimeConfig","doc":"","ref":"Bonfire.UI.Topics.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.Topics.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.Topics.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.Topics.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.Topics.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateResourceSpecForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateUnitForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateUnitForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateUnitForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateUnitForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.changeset/1","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html#changeset/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.send/3","doc":"","ref":"Bonfire.UI.ValueFlows.CreateValueCalculationForm.html#send/3"},{"type":"module","title":"Bonfire.UI.ValueFlows.Integration","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.declared_extension/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.mailer/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.Integration.repo/0","doc":"","ref":"Bonfire.UI.ValueFlows.Integration.html#repo/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.UI.ValueFlows.RuntimeConfig","doc":"","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.UI.ValueFlows.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.UI.ValueFlows.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.process/2","doc":"","ref":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL.html#process/2"},{"type":"module","title":"AnimalAvatarGenerator","doc":"Generate SVG avatars from a string seed. It should always return the same avatar for the corresponding seed.\n\nBased on https://www.npmjs.com/package/animal-avatar-generator (translated to Elixir, mostly by ChatGPT)","ref":"AnimalAvatarGenerator.html"},{"type":"function","title":"AnimalAvatarGenerator.avatar/2","doc":"","ref":"AnimalAvatarGenerator.html#avatar/2"},{"type":"function","title":"AnimalAvatarGenerator.avatar_face/2","doc":"","ref":"AnimalAvatarGenerator.html#avatar_face/2"},{"type":"function","title":"AnimalAvatarGenerator.brows/0","doc":"","ref":"AnimalAvatarGenerator.html#brows/0"},{"type":"function","title":"AnimalAvatarGenerator.clamp/3","doc":"","ref":"AnimalAvatarGenerator.html#clamp/3"},{"type":"function","title":"AnimalAvatarGenerator.create_background/3","doc":"","ref":"AnimalAvatarGenerator.html#create_background/3"},{"type":"function","title":"AnimalAvatarGenerator.create_blackout/1","doc":"","ref":"AnimalAvatarGenerator.html#create_blackout/1"},{"type":"function","title":"AnimalAvatarGenerator.create_svg/2","doc":"","ref":"AnimalAvatarGenerator.html#create_svg/2"},{"type":"function","title":"AnimalAvatarGenerator.darken/2","doc":"","ref":"AnimalAvatarGenerator.html#darken/2"},{"type":"function","title":"AnimalAvatarGenerator.ears/0","doc":"","ref":"AnimalAvatarGenerator.html#ears/0"},{"type":"function","title":"AnimalAvatarGenerator.empty_shape/0","doc":"","ref":"AnimalAvatarGenerator.html#empty_shape/0"},{"type":"function","title":"AnimalAvatarGenerator.eyes/0","doc":"","ref":"AnimalAvatarGenerator.html#eyes/0"},{"type":"function","title":"AnimalAvatarGenerator.faces/0","doc":"","ref":"AnimalAvatarGenerator.html#faces/0"},{"type":"function","title":"AnimalAvatarGenerator.hairs/0","doc":"","ref":"AnimalAvatarGenerator.html#hairs/0"},{"type":"function","title":"AnimalAvatarGenerator.muzzles/0","doc":"","ref":"AnimalAvatarGenerator.html#muzzles/0"},{"type":"function","title":"AnimalAvatarGenerator.patterns/0","doc":"","ref":"AnimalAvatarGenerator.html#patterns/0"},{"type":"module","title":"Arrows","doc":"A handful of (mostly) arrow macros with superpowers.","ref":"Arrows.html"},{"type":"module","title":"Installation - Arrows","doc":"The package can be installed by adding `arrows` to your list of dependencies in `mix.exs`: \n\n```elixir\ndef deps do\n [\n {:arrows, \"~> 0.2.0\"}\n ]\nend\n```\n\nOr via git:\n```elixir\ndef deps do\n [\n {:arrows, git: \"https://github.com/bonfire-networks/arrows\", branch: \"main\"}\n ]\nend\n```","ref":"Arrows.html#module-installation"},{"type":"module","title":"Documentation - Arrows","doc":"The Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). \n\nHere is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where\n double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"Arrows.html#module-documentation"},{"type":"module","title":"Ok-pipe - Arrows","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.\n\n\nDocumentation can be found at [https://hexdocs.pm/arrows](https://hexdocs.pm/arrows).","ref":"Arrows.html#module-ok-pipe"},{"type":"macro","title":"Arrows.<~>/2","doc":"Like `||`, except with the logic applied by `~>`","ref":"Arrows.html#%3C~%3E/2"},{"type":"function","title":"Arrows.from_ok/1","doc":"","ref":"Arrows.html#from_ok/1"},{"type":"function","title":"Arrows.ok/1","doc":"","ref":"Arrows.html#ok/1"},{"type":"function","title":"Arrows.ok_or/2","doc":"","ref":"Arrows.html#ok_or/2"},{"type":"function","title":"Arrows.to_ok/1","doc":"","ref":"Arrows.html#to_ok/1"},{"type":"macro","title":"Arrows.|>/2","doc":"A more flexible drop-in replacement for the standard elixir pipe operator.\n\nSpecial features are unlocked when using the `...` (ellipsis) on the right hand side:\n\n* The right hand side need not be a function, it can be any expression containing the ellipsis.\n* The ellipsis will be replaced with the result of evaluating the hand side expression.\n* You may use the ellipsis multiple times and the left hand side will be calculated exactly once.\n\nYou can do crazy stuff with the ellipsis, but remember that people have to read it!","ref":"Arrows.html#%7C%3E/2"},{"type":"macro","title":"Arrows.|||/2","doc":"","ref":"Arrows.html#%7C%7C%7C/2"},{"type":"macro","title":"Arrows.~>/2","doc":"Like `OK.~>`","ref":"Arrows.html#~%3E/2"},{"type":"module","title":"EctoSparkles","doc":"Some helpers to sparkle on top of [Ecto](https://hexdocs.pm/ecto/Ecto.html) \n\n- [`EctoSparkles.proload/3`](#proload-documentation) and `EctoSparkles.join_preload/2` to join and preload associations with less verbosity\n- [`EctoSparkles.reusable_join/5`](#reusable_join-documentation) to avoid duplicating joins \n- `EctoSparkles.Migrator` to run migrations, rollbacks, etc in a release and `EctoSparkles.AutoMigrator` to automatically run them at startup.\n- `EctoSparkles.DataMigration`: a behaviour implemented for data migrations (generally backfills).\n- `EctoSparkles.Log` to log slow or possible N+1 queries with telemetry (showing stacktraces)\n- `EctoSparkles.Changesets.Errors` to generate readable errors for changesets\n\nNOTE: you need to put something like `config :ecto_sparkles, :otp_app, :your_otp_app_name` in your app's config.\n\n\n## `proload` documentation\n\nA macro which tells Ecto to perform a join and preload of associations.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\n\nYou can make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see examples below).","ref":"EctoSparkles.html"},{"type":"module","title":"Examples using standard Ecto - EctoSparkles","doc":"```\n query\n |> join(:left, [o, activity: activity], assoc(:object), as: :object)\n |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})\n```\n\nEcto requires calling three different functions for this operation: `Query.join/4`, `Query.assoc/3` and `Query.preload/2`. \n\nHere's another example:\n\n```\n Invoice\n |> join(:left, [i], assoc(i, :customer), as: :customer)\n |> join(:left, [i], assoc(i, :lines), as: :lines)\n |> preload([lines: v, customers: c], lines: v, customer: c)\n```","ref":"EctoSparkles.html#module-examples-using-standard-ecto"},{"type":"module","title":"Example using proload - EctoSparkles","doc":"With `proload`, you can accomplish this with just one line of code:\n\n```\nproload(query, activity: [:object])\n```\n\nAnd for the other example:\n```\nproload(Invoice, [:customer, :lines])\n```\n\nAs a bonus, it automatically makes use of `reusable_join` so calling it multiple times with the same association has no ill effects.","ref":"EctoSparkles.html#module-example-using-proload"},{"type":"module","title":"Example using join_preload - EctoSparkles","doc":"`join_preload` is `proload`'s sister macro with a slightly different syntax:\n\n```\n join_preload(query, [:activity, :object])\n```\n\nand:\n```\n Invoice\n |> join_preload(:customer)\n |> join_preload(:lines)\n```\n\n\n## `reusable_join` documentation\n\nA macro similar to `Ecto.Query.join/{4,5}`, but can be called multiple times \nwith the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, its mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#module-example-using-join_preload"},{"type":"module","title":"Creating reusable joins - EctoSparkles","doc":"```elixir\nquery\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_a)\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_b)\n```","ref":"EctoSparkles.html#module-creating-reusable-joins"},{"type":"module","title":"Copyright - EctoSparkles","doc":"- Copyright (c) 2021 Bonfire developers\n- Copyright (c) 2020 Up Learn\n- Copyright (c) 2019 Joshua Nussbaum \n\n- `join_preload` was originally forked from [Ecto.Preloader](https://github.com/joshnuss/ecto_preloader), licensed under WTFPL)\n- `reusable_join` was originally forked from [QueryElf](https://gitlab.com/up-learn-uk/query-elf), licensed under Apache License Version 2.0\n- original code licensed under Apache License Version 2.0","ref":"EctoSparkles.html#module-copyright"},{"type":"macro","title":"EctoSparkles.join_preload/2","doc":"`join_preload` is a helper for preloading associations using joins.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\nYou could make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see example below).\n\nWith `EctoSparkles`, you can accomplish this with just one line of code.","ref":"EctoSparkles.html#join_preload/2"},{"type":"macro","title":"Example using just Ecto - EctoSparkles.join_preload/2","doc":"```\nimport Ecto.Query\nInvoice\n|> join(:left, [i], assoc(i, :customer), as: :customer)\n|> join(:left, [i, c], assoc(c, :account), as: :account)\n|> join(:left, [i], assoc(i, :lines), as: :lines)\n|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]})\n|> Repo.all()\n```","ref":"EctoSparkles.html#join_preload/2-example-using-just-ecto"},{"type":"macro","title":"Example using `join_preload` - EctoSparkles.join_preload/2","doc":"```\nimport EctoSparkles\nInvoice\n|> join_preload([:customer, :account])\n|> join_preload([:lines])\n|> Repo.all()\n```","ref":"EctoSparkles.html#join_preload/2-example-using-join_preload"},{"type":"macro","title":"EctoSparkles.proload/3","doc":"AKA `join_preload++`. It's more powerful, but it does it with more (and different!) syntax.\n\ne.g.\n```\nproload(query, activity: [\n :verb, :boost_count, :like_count, :replied,\n # relations under object will have their aliases prefixed with object_, i.e.\n # :object_message, :object_post, :object_post_content\n # the original names will still be used for the associations.\n object: {\"object_\", [:message, :post, :post_content]}\n])\n```","ref":"EctoSparkles.html#proload/3"},{"type":"macro","title":"EctoSparkles.reusable_join/5","doc":"`reusable_join` is similar to `Ecto.Query.join/{4,5}`, but can be called multiple times with the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, it is mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#reusable_join/5"},{"type":"module","title":"EctoSparkles.AutoMigrator","doc":"Runs ecto migrations automatically on startup (add this to your app's supervision tree)","ref":"EctoSparkles.AutoMigrator.html"},{"type":"function","title":"EctoSparkles.AutoMigrator.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"EctoSparkles.AutoMigrator.html#child_spec/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.init/1","doc":"","ref":"EctoSparkles.AutoMigrator.html#init/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.start_link/1","doc":"","ref":"EctoSparkles.AutoMigrator.html#start_link/1"},{"type":"function","title":"EctoSparkles.AutoMigrator.startup_migrations/0","doc":"","ref":"EctoSparkles.AutoMigrator.html#startup_migrations/0"},{"type":"module","title":"EctoSparkles.Changesets.Errors","doc":"","ref":"EctoSparkles.Changesets.Errors.html"},{"type":"function","title":"EctoSparkles.Changesets.Errors.changeset_errors_string/2","doc":"","ref":"EctoSparkles.Changesets.Errors.html#changeset_errors_string/2"},{"type":"function","title":"EctoSparkles.Changesets.Errors.error/2","doc":"","ref":"EctoSparkles.Changesets.Errors.html#error/2"},{"type":"behaviour","title":"EctoSparkles.DataMigration","doc":"A behaviour implemented by our data migrations (generally backfills).\n\nBased on [A microframework for backfill migrations in Elixir's Ecto](https://tylerayoung.com/2023/08/13/migrations/), in turn based on David Bernheisel's [template for deterministic backfills](https://fly.io/phoenix-files/backfilling-data/#batching-deterministic-data).\n\nA data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. `priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs`):\n\n```elixir\ndefmodule MyApp.Repo.Migrations.BackfillOnboardingStep do\n alias EctoSparkles.DataMigration\n use DataMigration\n \n @impl DataMigration\n def base_query do\n # NOTE: This works in cases where:\n # 1. The data can be queried with a condition that not longer applies after the migration ran, so you can repeatedly query the data and update the data until the query result is empty. For example, if a column is currently null and will be updated to not be null, then you can query for the null records and pick up where you left off.\n # 2. The migration is written in such a way that it can be ran several times on the same data without causing data loss or duplication (or crashing).\n\n from(u in \"users\", # Notice how we do not use Ecto schemas here.\n where: is_nil(u.onboarding_step),\n select: %{id: u.id}\n )\n end\n\n @impl DataMigration\n def config do\n %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}\n end\n\n @impl DataMigration\n def migrate(results) do\n Enum.each(results, fn %{id: user_id} ->\n # hooks into a context module, which is more likely to be kept up to date as the app evolves, to avoid having to update old migrations\n user_id\n |> MyApp.Users.set_onboarding_step!()\n end)\n end\nend\n```","ref":"EctoSparkles.DataMigration.html"},{"type":"callback","title":"EctoSparkles.DataMigration.base_query/0","doc":"The core of the query you want to use to SELECT a map of your data.\nThe `DataMigration.Runner` will take care of limiting this to a batch size, ordering\nit by row ID, and restricting it to rows you haven't yet handled.\nThe query *must* select a map, and that map must have an `:id` key for the\nmigration runner to reference as the last-modified row in your table.","ref":"EctoSparkles.DataMigration.html#c:base_query/0"},{"type":"callback","title":"EctoSparkles.DataMigration.config/0","doc":"","ref":"EctoSparkles.DataMigration.html#c:config/0"},{"type":"callback","title":"EctoSparkles.DataMigration.migrate/1","doc":"The callback to operate on a result set from your query.\nImplementers should `raise` an error if you're unable to process the batch.","ref":"EctoSparkles.DataMigration.html#c:migrate/1"},{"type":"module","title":"EctoSparkles.DataMigration.Config","doc":"Configuration for a `DataMigration` behaviour module, used by the `DataMigration.Runner`.\n\nbatch size: how many elements from your table to migrate at a time. \n\nthrottle time: the amount of downtime the runner should sleep between batches.\n\nasync: Whether to run the migration in an async process, meaning the execution of the rest of the migrations (and the app startup if you're auto-migrating on start) won't be delayed. WARNING: this means the migration will be marked as done as soon as it starts, so if the process is interrupted it won't be re-run automatically.\n\nfirst_id: The very first ID when sorting UUIDs in ascending order. If you use integer IDs instead, this would be 0.","ref":"EctoSparkles.DataMigration.Config.html"},{"type":"module","title":"EctoSparkles.DataMigration.Runner","doc":"Runs a `DataMigration`","ref":"EctoSparkles.DataMigration.Runner.html"},{"type":"function","title":"EctoSparkles.DataMigration.Runner.run/1","doc":"","ref":"EctoSparkles.DataMigration.Runner.html#run/1"},{"type":"module","title":"EctoSparkles.ErlangTermBinary","doc":"A custom Ecto type for handling the serialization of arbitrary\ndata types stored as binary data in the database. Requires the\nunderlying DB field to be a binary.","ref":"EctoSparkles.ErlangTermBinary.html"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.cast/1","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#cast/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"EctoSparkles.ErlangTermBinary.html#cast/2"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.dump/1","doc":"Converting the data structure to binary for storage.","ref":"EctoSparkles.ErlangTermBinary.html#dump/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.embed_as/1","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#embed_as/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.equal?/2","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#equal?/2"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.load/1","doc":"Convert the raw binary value from the database back to\nthe desired term.\n\nUses `Plug.Crypto.non_executable_binary_to_term/2` - a restricted version of `:erlang.binary_to_term/2` that forbids executable terms, such as anonymous functions.\n\nThis function restricts atoms, with the [:safe] option set, so only existing (and loaded) atoms will be deserialized.","ref":"EctoSparkles.ErlangTermBinary.html#load/1"},{"type":"function","title":"EctoSparkles.ErlangTermBinary.type/0","doc":"","ref":"EctoSparkles.ErlangTermBinary.html#type/0"},{"type":"module","title":"EctoSparkles.JSONSerdeData","doc":"A custom Ecto type for handling the serialization of arbitrary data types stored as JSON data in the database. Requires the underlying DB field to be a map / JSONB field.","ref":"EctoSparkles.JSONSerdeData.html"},{"type":"function","title":"EctoSparkles.JSONSerdeData.cast/1","doc":"","ref":"EctoSparkles.JSONSerdeData.html#cast/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.cast/2","doc":"Provides custom casting rules for params. Nothing changes here.\nWe only need to handle deserialization.","ref":"EctoSparkles.JSONSerdeData.html#cast/2"},{"type":"function","title":"EctoSparkles.JSONSerdeData.dump/1","doc":"Converting the data structure to a JSON binary for storage.","ref":"EctoSparkles.JSONSerdeData.html#dump/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.embed_as/1","doc":"","ref":"EctoSparkles.JSONSerdeData.html#embed_as/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.equal?/2","doc":"","ref":"EctoSparkles.JSONSerdeData.html#equal?/2"},{"type":"function","title":"EctoSparkles.JSONSerdeData.load/1","doc":"Convert the JSON binary value from the database back to the desired term.","ref":"EctoSparkles.JSONSerdeData.html#load/1"},{"type":"function","title":"EctoSparkles.JSONSerdeData.type/0","doc":"","ref":"EctoSparkles.JSONSerdeData.html#type/0"},{"type":"module","title":"EctoSparkles.Log","doc":"Log Ecto queries, and output warnings for slow or possible n+1 queries\n\nTo set up, simply add `EctoSparkles.Log.setup(YourApp.Repo)` in your app's main `Application.start/2` module.","ref":"EctoSparkles.Log.html"},{"type":"function","title":"EctoSparkles.Log.check_if_n_plus_1/1","doc":"","ref":"EctoSparkles.Log.html#check_if_n_plus_1/1"},{"type":"function","title":"EctoSparkles.Log.format_log/4","doc":"","ref":"EctoSparkles.Log.html#format_log/4"},{"type":"function","title":"EctoSparkles.Log.handle_event/4","doc":"","ref":"EctoSparkles.Log.html#handle_event/4"},{"type":"function","title":"EctoSparkles.Log.inline_params/3","doc":"","ref":"EctoSparkles.Log.html#inline_params/3"},{"type":"function","title":"EctoSparkles.Log.log_query/4","doc":"","ref":"EctoSparkles.Log.html#log_query/4"},{"type":"function","title":"EctoSparkles.Log.setup/1","doc":"","ref":"EctoSparkles.Log.html#setup/1"},{"type":"module","title":"EctoSparkles.Migrator","doc":"","ref":"EctoSparkles.Migrator.html"},{"type":"function","title":"EctoSparkles.Migrator.create/0","doc":"","ref":"EctoSparkles.Migrator.html#create/0"},{"type":"function","title":"EctoSparkles.Migrator.create/2","doc":"","ref":"EctoSparkles.Migrator.html#create/2"},{"type":"function","title":"EctoSparkles.Migrator.migrate/0","doc":"","ref":"EctoSparkles.Migrator.html#migrate/0"},{"type":"function","title":"EctoSparkles.Migrator.migrate/1","doc":"","ref":"EctoSparkles.Migrator.html#migrate/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback/2","doc":"","ref":"EctoSparkles.Migrator.html#rollback/2"},{"type":"function","title":"EctoSparkles.Migrator.rollback_all/0","doc":"","ref":"EctoSparkles.Migrator.html#rollback_all/0"},{"type":"function","title":"EctoSparkles.Migrator.rollback_all/1","doc":"","ref":"EctoSparkles.Migrator.html#rollback_all/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback_to/1","doc":"","ref":"EctoSparkles.Migrator.html#rollback_to/1"},{"type":"function","title":"EctoSparkles.Migrator.rollback_to/2","doc":"","ref":"EctoSparkles.Migrator.html#rollback_to/2"},{"type":"function","title":"EctoSparkles.Migrator.status/0","doc":"Print the migration status for configured Repos' migrations.","ref":"EctoSparkles.Migrator.html#status/0"},{"type":"module","title":"EctoSparkles.NPlus1Detector","doc":"Checks a query against the previous one and increments counter of collisions or swaps previous query with the last one.","ref":"EctoSparkles.NPlus1Detector.html"},{"type":"function","title":"EctoSparkles.NPlus1Detector.check/1","doc":"","ref":"EctoSparkles.NPlus1Detector.html#check/1"},{"type":"function","title":"EctoSparkles.NPlus1Detector.do_check/2","doc":"","ref":"EctoSparkles.NPlus1Detector.html#do_check/2"},{"type":"module","title":"EctoSparkles.SanitiseStrings","doc":"Provides functions for sanitising input on `Ecto.Changeset` string fields.","ref":"EctoSparkles.SanitiseStrings.html"},{"type":"function","title":"EctoSparkles.SanitiseStrings.clean_html/2","doc":"","ref":"EctoSparkles.SanitiseStrings.html#clean_html/2"},{"type":"function","title":"EctoSparkles.SanitiseStrings.sanitise_strings/2","doc":"","ref":"EctoSparkles.SanitiseStrings.html#sanitise_strings/2"},{"type":"function","title":"EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"Sanitises all changes in the given changeset that apply to field which are of the `:string` `Ecto` type.\n\nBy default it uses the `HtmlSanitizeEx.strip_tags/1` function on any change that satisfies all of the following conditions:\n1. The field associated with the change is of the type `:string`.\n2. The field associated with the change is not in the blacklisted_fields list of `opts` as defined using the `:except` key in `opts`.\nNote that this function will change the value in the `:changes` map of an\n`%Ecto.Changeset{}` struct if the given changes are sanitized.","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2"},{"type":"function","title":"Examples - EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"iex> attrs = %{string_field: \" Bad \"}\n iex> result_changeset =\n ...> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.strip_all_tags()\n iex> result_changeset.changes\n %{string_field: \"Bad\"}\nFields can be exempted from sanitization via the `:except` option.\n iex> attrs = %{string_field: \" Bad \"}\n iex> result_changeset =\n ...> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])\n iex> result_changeset.changes\n %{string_field: \" Bad \"}","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2-examples"},{"type":"function","title":"You can also specify a specific scrubber (by passing a function as reference): - EctoSparkles.SanitiseStrings.strip_all_tags/2","doc":"ies> attrs\n ...> |> FakeEctoSchema.changeset()\n ...> |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)","ref":"EctoSparkles.SanitiseStrings.html#strip_all_tags/2-you-can-also-specify-a-specific-scrubber-by-passing-a-function-as-reference"},{"type":"module","title":"Exto","doc":"[![hex.pm](https://img.shields.io/hexpm/v/exto)](https://hex.pm/packages/exto)\n[hexdocs](https://hexdocs.pm/exto)\n\n`Exto` provides configuration-driven Ecto schema extensibility","ref":"Exto.html"},{"type":"module","title":"Usage - Exto","doc":"","ref":"Exto.html#module-usage"},{"type":"module","title":"Example Schema - Exto","doc":"```elixir\ndefmodule My.Schema do\n use Ecto.Schema\n import Exto, only: [flex_schema: 1]\n\n schema \"my_table\" do\n field :name, :string # just normal schema things\n flex_schema(:my_app) # boom! give me the stuff\n end\nend\n```\n\nOr if you want the `Access` protocol to be auto-implemented on the struct (because [the reasoning](https://hexdocs.pm/elixir/Access.html#module-maps-and-structs) for not having it on structs doesn't apply as much when using Exto), you can pull in the `Accessible` library by simply using `use Exto` instead of `import Exto`.","ref":"Exto.html#module-example-schema"},{"type":"module","title":"Example configuration - Exto","doc":"```elixir\nconfig :my_app, My.Schema,\n belongs_to: [\n foo: Foo, # belongs_to :foo, Foo\n bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer\n ],\n field: [\n foo: :string, # field :foo, :string\n bar: {:integer, default: 4}, # field :foo, :integer, default: 4\n ],\n has_one: [\n foo: Foo, # has_one :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id\n ]\n has_many: [\n foo: Foo, # has_many :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id\n ]\n many_to_many: [\n foo: Foo, # many_to_many :foo, Foo\n bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar\n ]\n```\n\nThis example won't work very well because it is redefining `foo` and `bar` 5 times, but you get the point.\n\nReading of configuration is done during compile time. The relations will be baked in during compilation, thus:\n\n* Do not expect this to work in runtime config.\n* You will need to rebuild all dependencies which use this macro when you change their configuration.","ref":"Exto.html#module-example-configuration"},{"type":"module","title":"Copyright and License - Exto","doc":"Copyright (c) 2020 Exto Contributors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Exto.html#module-copyright-and-license"},{"type":"macro","title":"Exto.flex_schema/1","doc":"Adds additional associations dynamically based on the config found under the name of the current module for the given OTP application. \n\nEach key maps to an Ecto.Schema function:\n\n* `belongs_to`\n* `field`\n* `has_many`\n* `has_one`\n* `many_to_many`\n\nEach of these keys should map to a keyword list where the key is the name of the field or association and the value is one of:\n\n* A type\n* A tuple of type and options (keyword list)","ref":"Exto.html#flex_schema/1"},{"type":"module","title":"Needle","doc":"> One foreign key to rule them all and in the darkness, bind them. - Gandalf, paraphrased.\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle)](https://hex.pm/packages/needle)\n[hexdocs](https://hexdocs.pm/needle)","ref":"Needle.html"},{"type":"module","title":"Intro - Needle","doc":"Bonfire uses the excellent PostgreSQL database for most data storage. PostgreSQL allows us to make a wide range of queries and to make them relatively fast while upholding data integrity guarantees.\n\nPostgres is a relational schema-led database - it expects you to pre-define tables and the fields in each table (represented in tabular form, i.e. as a collection of tables with each table consisting of a set of rows and columns). Fields can contain data or a reference to a row in another table. \n\nThis usually means that a field containing a reference has to be pre-defined with a foreign key pointing to a specific field (typically a primary key, like an ID column) *in a specific table*. \n\nA simple example would be a blogging app, which might have a `post` table with `author` field that references the `user` table.\n\nA social network, by contrast, is actually a graph of objects. Objects need to be able to refer to other objects by their ID without knowing their type. \n\nA simple example would be likes, you might have a `likes` table with `liked_post_id` field that references the `post` table. But you don't just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add `liked_video_id`, `liked_image_id`, etc?\n\nWe needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Needle`.\n\nThis guide is a brief introduction to Needle. It assumes some foundational knowledge:\n\n* Basic understanding of how relational databases like Postgresql work, in particular:\n * Tables being made up of fields.\n * What a primary key is and why it's useful.\n * Foreign keys and relationships between tables (1 to 1, 1 to Many, Many to 1, Many to Many).\n * Views as virtual tables backed by a SQL query.\n\n* Basic understanding of Elixir (enough to follow the examples).\n* Basic working knowledge of the [Ecto](https://hexdocs.pm/ecto/Ecto.html) database library (schema and migration definitions)","ref":"Needle.html#module-intro"},{"type":"module","title":"What is Needle? - Needle","doc":"A means of foreign keying many tables in one field. Designed for highly interlinked data in highly dynamic schemata where tracking all the foreign keys is neither desired nor practical.\n\n> A universal foreign key is actually a hard problem. Many approaches are on offer with a variety of tradeoffs. If plugging into Bonfire's Needle-based core extensions isn't a requirement for you (i.e. you don't need to put things into feeds or use boundaries for access-control) should carefully consider a variety of approaches rather than just blindly adopting the one that fitted our project's needs the best!","ref":"Needle.html#module-what-is-needle"},{"type":"module","title":"Identifying objects - the UID type - Needle","doc":"All referenceable objects in the system have a unique ID (primary key) whose type is the `Needle.UID`. `UUIDv7` and [ULIDs](https://github.com/ulid/spec) are a lot like standard `UUID` in that you can generate unique ones independently of the database. It's also a little different, being made up of two parts:\n\n* The current timestamp, to millisecond precision.\n* Strong random padding for uniqueness.\n\nThis means that it naturally sorts by time to the millisecond (close enough for us), giving us a performance advantage compared to queries ordered by a separate creation datetime field (by contrast, UUIDv4 is randomly distributed).\n\nIf you've only worked with integer primary keys before, you are probably used to letting the database dispense an ID for you. With `ULID` (or `UUID`), IDs can be known *before* they are stored, greatly easing the process of storing a graph of data and allowing us to do more of the preparation work outside of a transaction for increased performance.\n\nIn PostgreSQL, we actually store `UUIDv7` and `ULID`s as `UUID` columns, thanks to both being the same size (and the lack of specific column types shipping with postgresql). You mostly will not notice this because it's handled for you, but there are a few places it can come up:\n\n* Ecto debug and error output may show either binary values or UUID-formatted values.\n* Hand-written SQL may need to convert table IDs to the `UUID` format before use.","ref":"Needle.html#module-identifying-objects-the-uid-type"},{"type":"module","title":"It's just a table - Needle","doc":"The `Needle` system is mostly based around a single table represented by the `Needle.Pointer` schema with the following fields:\n\n* `id` (UID) - the database-wide unique id for the object, primary key.\n* `table_id` (UID) - identifies the type of the object, references `Needle.Table`.\n* `deleted_at` (timestamp, default: `null`) - when the object was deleted.\n\nEvery object that is stored in the system will have a record in this table. It may also have records in other tables (handy for storing more than 3 fields about the object!).\n\nA `Table` is a record of a table that may be linked to by a pointer. A `Pointer` is a pointer ID and a table ID.\nWith these two ingredients, we can construct a means of pointing to any table that has a `Table` entry.\n\nBut don't worry about `Needle.Table` for now, just know that every object type will have a record there so `Needle.Pointer.table_id` can reference it.","ref":"Needle.html#module-it-s-just-a-table"},{"type":"module","title":"Installation - Needle","doc":"Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.InitPointers do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up(), do: inits(:up)\n def down(), do: inits(:down)\n\n defp inits(dir) do\n init_pointers_ulid_extra(dir) # this one is optional but recommended\n init_pointers(dir) # this one is not optional\n end\nend\n```\n\n> Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.","ref":"Needle.html#module-installation"},{"type":"module","title":"Declaring Object Types - Needle","doc":"","ref":"Needle.html#module-declaring-object-types"},{"type":"module","title":"Picking a table id - Needle","doc":"The first step to declaring a new type is picking a unique table ID in UID format. \n\nYou could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.\n\nFor example, the ID for the `Feed` table is: `1TFEEDS0NTHES0V1S0FM0RTA1S`, which can be read as \"It feeds on the souls of mortals\". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:\n\n* The alphabet is [Crockford's Base32](https://en.wikipedia.org/wiki/Base32#Crockford's_Base32).\n* They must be 26 characters in length.\n* The first character must be a digit in the range 0-7.\n\nTo help you with this, the `Needle.UID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:\n\n```\niex(1)> Needle.UID.synthesise!(\"itfeedsonthesouls\")\n\n11:20:28.299 [error] Too short, need 9 chars.\n:ok\niex(2)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortalsandothers\")\n\n11:20:31.819 [warn] Too long, chopping off last 9 chars\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(3)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortals\")\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(4)> Needle.UID.synthesise!(\"gtfeedsonthesoulsofmortals\")\n\n11:21:03.268 [warn] First character must be a digit in the range 0-7, replacing with 7\n\"7TFEEDS0NTHES0V1S0FM0RTA1S\"\n```","ref":"Needle.html#module-picking-a-table-id"},{"type":"module","title":"Virtual pointables (\"virtuals\") - Needle","doc":"`Needle.Virtual` is the simplest and most common type of object. Here's a definition of block:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block do\n\n use Needle.Virtual,\n otp_app: :bonfire_data_social,\n table_id: \"310CK1NGSTVFFAV01DSSEE1NG1\",\n source: \"bonfire_data_social_block\"\n\n alias Bonfire.Data.Edges.Edge\n\n virtual_schema do\n has_one :edge, Edge, foreign_key: :id\n end\nend\n```\n\nIt should look quite similar to a mixin definition, except that we `use` `Needle.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.\n\nThe primary limitation of a virtual is that you cannot put extra fields on it. This also means that `belongs_to` is not generally permitted because it results in adding a field, while `has_one` and `has_many` work just fine as they do not cause the creation of fields in the schema.\n\nThis is not usually a problem, as extra fields can be put into [mixins](mixins-storing-data-about-objects) or [multimixins](#multimixins) as appropriate.\n\nIn all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.\n\n> Under the hood, a virtual has a writable view (in the above example, called `bonfire_data_social_block`). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the `pointers` table for you transparently. When you delete from the view, the corresponding `pointers` entry is marked deleted for you.\n\n> Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).","ref":"Needle.html#module-virtual-pointables-virtuals"},{"type":"module","title":"Pointables - Needle","doc":"The other, lesser used, type of object is called the `Needle.Pointable`. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.\n\n> When a record is inserted into a pointable table, a copy is made in the `pointers` table for you transparently. When you delete from the table, the the corresponding `pointers` entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.\n\nPointables pay for this flexibility by being slightly more expensive than virtuals:\n\n* Records must be inserted into/deleted from two tables (the pointable's table and the `pointers` table).\n* The pointable table needs its own primary key index.\n\nThe choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.\n\nHere is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity do\n\n use Needle.Pointable,\n otp_app: :bonfire_data_social,\n table_id: \"30NF1REAPACTTAB1ENVMBER0NE\",\n source: \"bonfire_data_social_apactivity\"\n\n pointable_schema do\n field :json, :map\n end\nend\n```\n\n\n> As you can see, to declare a pointable schema, we start by using `Needle.Pointable`, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.\n\n> We then call `pointable_schema` and define any fields we wish to put directly in the table. For the most part, `pointable_schema` is like Ecto's `schema` macro, except you do not provide the table name and let it handle the primary key.\n\n> If for some reason you wished to turn ID autogeneration off, you could pass `autogenerate: false` to the options provided when using `Needle.Pointable`.","ref":"Needle.html#module-pointables"},{"type":"module","title":"Adding re-usable fields - Needle","doc":"","ref":"Needle.html#module-adding-re-usable-fields"},{"type":"module","title":"Mixins - storing data about objects - Needle","doc":"Mixins are tables which contain extra information on behalf of objects. Each object can choose to\nrecord or not record information for each mixin. Sample mixins include:\n\n* user profile (containing a name, location and summary)\n* post content (containing the title, summary, and/or html body of a post or message)\n* created (containing the id of the object creator)\n\nIn this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.\n\nMixins are just tables too! The only requirement is they have a `UID` primary key which references `Needle.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro). \n\nHere is a sample mixin definition for a user profile:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_profile\"\n\n mixin_schema do\n field :name, :string\n field :summary, :string\n field :website, :string\n field :location, :string\n end\nend\n```\n\n> Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.\n\nAside from `use`ing `Needle.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of\n`schema`, pretty similar to a standard Ecto schema, right? \n\nThe arguments to `use Needle.Mixin` are:\n\n* `otp_app`: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)\n* `source`: the underlying table name to use in the database\n\nWe will cover dynamic configuration later. For now, you can use the OTP app that includes the module.","ref":"Needle.html#module-mixins-storing-data-about-objects"},{"type":"module","title":"Multimixins - Needle","doc":"Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.\n\nFor this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Needle.Pointer` and at least one other field which will collectively be unique.\n\nAn example multimixin is used for publishing an item to feeds:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_feed_publish\"\n\n alias Needle.Pointer\n\n mixin_schema do\n belongs_to :feed, Pointer, primary_key: true\n end\nend\n```\n\nNotice that this looks very similar to defining a mixin. Indeed, the only difference is the `primary_key: true` in this line, which adds a second field to the compound primary key.\nThis results in ecto recording a compound primary key of `(id, feed_id)` for the schema (the id is added for you as with regular mixins).","ref":"Needle.html#module-multimixins"},{"type":"module","title":"Writing Migrations - Needle","doc":"Migrations are typically included along with the schemas as public APIs you can call within your project's migrations.","ref":"Needle.html#module-writing-migrations"},{"type":"module","title":"Virtuals - Needle","doc":"Most virtuals are incredibly simple to migrate for:\n\n```elixir\ndefmodule Bonfire.Data.Social.Post.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Post\n\n def migrate_post(), do: migrate_virtual(Post)\n\nend\n```\n\nIf you need to do more work, it can be a little trickier. Here's an example for `block`, which also creates a unique index on another table:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n import Bonfire.Data.Edges.Edge.Migration\n alias Bonfire.Data.Social.Block\n\n def migrate_block_view(), do: migrate_virtual(Block)\n\n def migrate_block_unique_index(), do: migrate_type_unique_index(Block)\n\n def migrate_block(dir \\\\ direction())\n\n def migrate_block(:up) do\n migrate_block_view()\n migrate_block_unique_index()\n end\n\n def migrate_block(:down) do\n migrate_block_unique_index()\n migrate_block_view()\n end\n\nend\n```\n\nNotice how we have to write our `up` and `down` versions separately to get the correct ordering of operations.","ref":"Needle.html#module-virtuals"},{"type":"module","title":"Pointables - Needle","doc":"Migration example for a `Pointable`:\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity.Migration do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.APActivity\n\n defp make_apactivity_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do\n Ecto.Migration.add :json, :jsonb\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_apactivity_table, do: make_apactivity_table([])\n defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)\n\n def drop_apactivity_table(), do: drop_pointable_table(APActivity)\n\n defp maa(:up), do: make_apactivity_table([])\n defp maa(:down) do\n quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()\n end\n\n defmacro migrate_apactivity() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(maa(:up)),\n else: unquote(maa(:down))\n end\n end\n\nend\n```\n\nAs you can see, this `Pointable` migration a little trickier to define than a `Virtual` because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Greeting do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up() do\n create_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\") do\n add :greeting, :text, null: false\n end\n end\n\n def down() do\n drop_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\")\n end\nend\n```\n\n> As you can see, it's pretty similar to defining a regular migration, except you use `create_pointable_table` and\n`drop_pointable_table`. Notice that our sentinel UID makes an appearance again here. It's *very* important that these match what we declared in the schema.","ref":"Needle.html#module-pointables"},{"type":"module","title":"Mixins - Needle","doc":"Mixins look much like pointables:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Profile\n\n # create_profile_table/{0,1}\n\n defp make_profile_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do\n Ecto.Migration.add :name, :text\n Ecto.Migration.add :summary, :text\n Ecto.Migration.add :website, :text\n Ecto.Migration.add :location, :text\n Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)\n Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_profile_table(), do: make_profile_table([])\n defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)\n\n # drop_profile_table/0\n\n def drop_profile_table(), do: drop_mixin_table(Profile)\n\n # migrate_profile/{0,1}\n\n defp mp(:up), do: make_profile_table([])\n\n defp mp(:down) do\n quote do\n Bonfire.Data.Social.Profile.Migration.drop_profile_table()\n end\n end\n\n defmacro migrate_profile() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mp(:up)),\n else: unquote(mp(:down))\n end\n end\n\nend\n```","ref":"Needle.html#module-mixins"},{"type":"module","title":"Multimixins - Needle","doc":"Similar to mixins:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.FeedPublish\n\n @feed_publish_table FeedPublish.__schema__(:source)\n\n # create_feed_publish_table/{0,1}\n\n defp make_feed_publish_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do\n Ecto.Migration.add :feed_id,\n Needle.Migration.strong_pointer(), primary_key: true\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_feed_publish_table(), do: make_feed_publish_table([])\n defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body)\n\n def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish)\n\n def migrate_feed_publish_feed_index(dir \\\\ direction(), opts \\\\ [])\n def migrate_feed_publish_feed_index(:up, opts),\n do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts))\n def migrate_feed_publish_feed_index(:down, opts),\n do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts))\n\n defp mf(:up) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table()\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n end\n end\n\n defp mf(:down) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table()\n end\n end\n\n defmacro migrate_feed_publish() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mf(:up)),\n else: unquote(mf(:down))\n end\n end\n\n defmacro migrate_feed_publish(dir), do: mf(dir)\n\nend\n```","ref":"Needle.html#module-multimixins"},{"type":"module","title":"More examples - Needle","doc":"Take a look at a few of the migrations in our data libraries. Between them, they cover most\nscenarios by now:\n\n* [bonfire_data_social](https://github.com/bonfire-networks/bonfire_data_social/)\n* [bonfire_data_access_control](https://github.com/bonfire-networks/bonfire_data_access_control/)\n* [bonfire_data_identity](https://github.com/bonfire-networks/bonfire_data_identity/)\n* [bonfire_data_edges](https://github.com/bonfire-networks/bonfire_data_edges/) (feat. bonus triggers)\n\nIf you want to know exactly what's happening, you may want to read the code for\n[Needle.Migration](https://github.com/bonfire-networks/needle/blob/main/lib/migration.ex).","ref":"Needle.html#module-more-examples"},{"type":"module","title":"Configuration and overrides - Needle","doc":"Every pointable or mixin schema is overrideable with configuration\nduring compilation (this is why using them requires an `:otp_app` to\nbe specified). For example, we could override `Needle.Table` (which\nis a pointable table) thus:\n\n```elixir\nconfig :needle, Needle.Table, source: \"my_pointers_table\"\n```\n\nThe `table_id` is also configurable, but we don't recommend you change it.\n\nIn addition, all pointable and mixin schemas permit extension with [Exto](https://github.com/bonfire-networks/exto). See the `Exto`'s docs for more information about how to extend schemas via configuration. You will probably at the very least want to insert some `has_one` for mixins off your pointables.","ref":"Needle.html#module-configuration-and-overrides"},{"type":"module","title":"Referencing Pointables - Needle","doc":"Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically `belongs_to` with `Needle.Pointer`. The table in which we do this does not itself need to necessarily be a `Pointable`.\n\n```elixir\ndefmodule MyApp.Foo do\n\n use Ecto.Schema\n\n # regular ecto table, not pointable!\n schema \"hello\" do\n belongs_to :pointer, Needle.Pointer # who knows what it points to?\n end\nend\n```\n\nYou may choose to reference a specific schema rather than Pointer if it\nwill only point to a single table. If you do this, you must ensure\nthat the referenced record exists in that table in the normal\nway. There may be some performance benefit, we didn't benchmark it.\n\nThe migration is slightly more complex, we have to decide what type of\na pointer it is. Needle come in three categories:\n\n* A strong pointer is not nullable and is deleted when the object it\n points to is deleted.\n* A weak pointer is nullable and is nilified when the object it points\n to is deleted.\n* An unbreakable pointer will raise when you attempt to delete the\n object it points to.\n\n| Type | Nullable? | On Delete |\n|-------------|-----------|-------------|\n| Strong | No | Cascade |\n| Weak | Yes | Set Null |\n| Unbreakable | No | Raise |\n\nIn this case we will use a strong pointer, because we want it to be\ndeleted if the pointed object is deleted.\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Hello do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def change() do\n create_if_not_exists table(:hello) do\n add :pointer, strong_pointer(), null: false\n add :greeting, :text, null: false\n end\n end\nend\n```\n\nIf you are pointing to a specific table instead of pointer,\n`strong_pointer/1` allows you to pass the name of that module\n(`strong_pointer/0` calls this with `Needle.Pointer`).","ref":"Needle.html#module-referencing-pointables"},{"type":"module","title":"Dereferencing Pointables - Needle","doc":"It is common that even though you have a universal foreign key, you\nwill want to issue different queries based upon the type that is being\npointed to. For this reason, it is up to you to decide how to perform\nan onward query.\n\n`Needle.Pointers.schema/1` turns a `Pointer` into an Ecto schema module name\nyou can switch against. `Needle.Pointers.plan` breaks down a list of Needle\ninto a map of ids keyed by schema module. It is handy to define some\nfunctions in your (non-library) application that can load any type of\npointer in given contexts.","ref":"Needle.html#module-dereferencing-pointables"},{"type":"module","title":"Inserting data - Needle","doc":"","ref":"Needle.html#module-inserting-data"},{"type":"module","title":"Elixir-based logic - Needle","doc":"The practical result of needle is that it pushes a certain amount of\nvalidation and consistency logic back into elixir land. It is\ntherefore your elixir code's responsibility to ensure that data is\ninserted into the appropriate mixin tables when inserting a pointable\nobject and to manage deletions as appropriate.\n\nWhen assembling queries with mixin tables, pay careful attention to\nthe type of join you are performing. An inner join is explicitly\nasking not to be shown objects that do not have a record for that\nmixin. You quite possibly wanted to left join.","ref":"Needle.html#module-elixir-based-logic"},{"type":"module","title":"Querying Needle - Needle","doc":"Since `Pointer` has a table, you can use its `table_id` field to\nfilter by pointed type. `Needle.Tables.id!/1` (or `ids!/1` for a\nlist) can be used to obtain the IDs for a table or tables.","ref":"Needle.html#module-querying-needle"},{"type":"module","title":"Tradeoffs - Needle","doc":"All solutions to the universal primary key problem have tradeofs. Here\nare what we see as the deficiencies in our approach:\n\n1. It forces a UUIDv7 or ULID on you. This is great for us, but not\n everyone. They both expose a timestamp with millisecond precision. \n If the time of creation of a resource is sensitive information for\n your purposes, they may not going to be suitable for you.\n2. Ecto has no knowledge of the specialty of `Pointer`,\n e.g. `Repo.preload` does not work and you need to specify a join\n condition to join through a pointer. Use our functions or add extra\n associations with exto configuration.\n3. Dereferencing a list of needle requires a select query per table\n type that occurs in the input set.\n4. Reliance on user attention. You have to follow the instructions\n correctly to make the system work at all.\n5. There is likely some performance impact from postgres not\n understanding the relationships between the various tables\n properly. It's hard to gauge and we haven't even tried.\n\nThese are not likely to change. If you're going to pick\nthis library, do so in the full knowledge of the tradeoffs it makes.\n\nAlternatives include (I'm sure you can think of others):\n\n* Storing the table name in a second column alongside every foreign key.\n* A compound datatype of id and table name.\n* Byte/String manipulation tricks.\n* Evil SQL hacks based upon compile time configuration.\n\nWhile we have our gripes with this approach, once you've gotten the\nhang of using it, it works out pretty well for most purposes and it's\none of the simpler options to work with.","ref":"Needle.html#module-tradeoffs"},{"type":"module","title":"Copyright and License - Needle","doc":"Copyright (c) 2020 needle Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Needle.html#module-copyright-and-license"},{"type":"function","title":"Needle.is_needle?/2","doc":"","ref":"Needle.html#is_needle?/2"},{"type":"module","title":"Needle.Changesets","doc":"","ref":"Needle.Changesets.html"},{"type":"function","title":"Needle.Changesets.build_assoc/3","doc":"Like Ecto.build_assoc/3, but can work with a Changeset","ref":"Needle.Changesets.html#build_assoc/3"},{"type":"function","title":"Needle.Changesets.built?/1","doc":"True if the schema object's current state is `:built`","ref":"Needle.Changesets.html#built?/1"},{"type":"function","title":"Needle.Changesets.cast/3","doc":"Like `Ecto.Changeset.cast` but for Pointables, Virtuals and Mixins.\n\nIf a pointable or virtual, Generates an ID if one is not present.","ref":"Needle.Changesets.html#cast/3"},{"type":"function","title":"Needle.Changesets.cast_assoc/3","doc":"","ref":"Needle.Changesets.html#cast_assoc/3"},{"type":"function","title":"Needle.Changesets.cast_belongs_to/4","doc":"","ref":"Needle.Changesets.html#cast_belongs_to/4"},{"type":"function","title":"Needle.Changesets.cast_has_many/4","doc":"","ref":"Needle.Changesets.html#cast_has_many/4"},{"type":"function","title":"Needle.Changesets.cast_has_one/4","doc":"","ref":"Needle.Changesets.html#cast_has_one/4"},{"type":"function","title":"Needle.Changesets.config_for/3","doc":"","ref":"Needle.Changesets.html#config_for/3"},{"type":"function","title":"Needle.Changesets.deleted?/1","doc":"True if the schema object's current state is `:deleted`","ref":"Needle.Changesets.html#deleted?/1"},{"type":"function","title":"Needle.Changesets.get_field/2","doc":"","ref":"Needle.Changesets.html#get_field/2"},{"type":"function","title":"Needle.Changesets.insert_verb/1","doc":"","ref":"Needle.Changesets.html#insert_verb/1"},{"type":"function","title":"Needle.Changesets.loaded?/1","doc":"True if the schema object's current state is `:loaded`","ref":"Needle.Changesets.html#loaded?/1"},{"type":"function","title":"Needle.Changesets.merge_child_errors/1","doc":"","ref":"Needle.Changesets.html#merge_child_errors/1"},{"type":"function","title":"Needle.Changesets.put_assoc/3","doc":"Like `put_assoc!/3` but doesn't raise if the association doesn't exist","ref":"Needle.Changesets.html#put_assoc/3"},{"type":"function","title":"Needle.Changesets.put_assoc!/3","doc":"Like `Ecto.Changeset.put_assoc/3` but for Pointables, Virtuals and Mixins.\n\nCopies across keys where possible.","ref":"Needle.Changesets.html#put_assoc!/3"},{"type":"function","title":"Needle.Changesets.put_id_on_mixins/3","doc":"","ref":"Needle.Changesets.html#put_id_on_mixins/3"},{"type":"function","title":"Needle.Changesets.put_new_id/2","doc":"","ref":"Needle.Changesets.html#put_new_id/2"},{"type":"function","title":"Needle.Changesets.state/1","doc":"Returns the schema object's current state.","ref":"Needle.Changesets.html#state/1"},{"type":"function","title":"Needle.Changesets.update_data/2","doc":"","ref":"Needle.Changesets.html#update_data/2"},{"type":"function","title":"Needle.Changesets.valid?/1","doc":"true if the provided changeset or list of changesets is valid.","ref":"Needle.Changesets.html#valid?/1"},{"type":"module","title":"Needle.Form","doc":"","ref":"Needle.Form.html"},{"type":"macro","title":"Needle.Form.form_schema/1","doc":"","ref":"Needle.Form.html#form_schema/1"},{"type":"function","title":"Needle.Form.using/2","doc":"","ref":"Needle.Form.html#using/2"},{"type":"module","title":"Needle.Migration","doc":"Helpers for writing Pointer-aware migrations.","ref":"Needle.Migration.html"},{"type":"function","title":"Needle.Migration.add_is_not_deleted/1","doc":"","ref":"Needle.Migration.html#add_is_not_deleted/1"},{"type":"macro","title":"Needle.Migration.create_mixin_table/3","doc":"Creates a mixin table - one with a UID primary key and no trigger","ref":"Needle.Migration.html#create_mixin_table/3"},{"type":"macro","title":"Needle.Migration.create_pointable_table/2","doc":"Creates a pointable table along with its trigger.","ref":"Needle.Migration.html#create_pointable_table/2"},{"type":"macro","title":"Needle.Migration.create_pointable_table/3","doc":"","ref":"Needle.Migration.html#create_pointable_table/3"},{"type":"macro","title":"Needle.Migration.create_pointable_table/4","doc":"","ref":"Needle.Migration.html#create_pointable_table/4"},{"type":"macro","title":"Needle.Migration.create_random_table/3","doc":"Creates a random table - one with a UUID v4 primary key.","ref":"Needle.Migration.html#create_random_table/3"},{"type":"function","title":"Needle.Migration.create_virtual/1","doc":"","ref":"Needle.Migration.html#create_virtual/1"},{"type":"function","title":"Needle.Migration.create_virtual/2","doc":"","ref":"Needle.Migration.html#create_virtual/2"},{"type":"function","title":"Needle.Migration.create_virtual_trigger_function/0","doc":"","ref":"Needle.Migration.html#create_virtual_trigger_function/0"},{"type":"function","title":"Needle.Migration.drop_mixin_table/1","doc":"Drops a mixin table.","ref":"Needle.Migration.html#drop_mixin_table/1"},{"type":"function","title":"Needle.Migration.drop_pointable_table/1","doc":"Drops a pointable table","ref":"Needle.Migration.html#drop_pointable_table/1"},{"type":"function","title":"Needle.Migration.drop_pointable_table/2","doc":"","ref":"Needle.Migration.html#drop_pointable_table/2"},{"type":"function","title":"Needle.Migration.drop_random_table/1","doc":"Drops a random table.","ref":"Needle.Migration.html#drop_random_table/1"},{"type":"function","title":"Needle.Migration.drop_table/1","doc":"","ref":"Needle.Migration.html#drop_table/1"},{"type":"function","title":"Needle.Migration.drop_virtual/1","doc":"","ref":"Needle.Migration.html#drop_virtual/1"},{"type":"function","title":"Needle.Migration.drop_virtual/2","doc":"","ref":"Needle.Migration.html#drop_virtual/2"},{"type":"function","title":"Needle.Migration.init_pointers/0","doc":"When migrating up: initialises the pointers database.\nWhen migrating down: deinitialises the pointers database.","ref":"Needle.Migration.html#init_pointers/0"},{"type":"function","title":"Needle.Migration.init_pointers/1","doc":"Given `:up`: initialises the pointers database.\nGiven `:down`: deinitialises the pointers database.","ref":"Needle.Migration.html#init_pointers/1"},{"type":"function","title":"Needle.Migration.init_pointers_ulid_extra/0","doc":"","ref":"Needle.Migration.html#init_pointers_ulid_extra/0"},{"type":"function","title":"Needle.Migration.migrate_virtual/1","doc":"","ref":"Needle.Migration.html#migrate_virtual/1"},{"type":"function","title":"Needle.Migration.migrate_virtual/2","doc":"","ref":"Needle.Migration.html#migrate_virtual/2"},{"type":"function","title":"Needle.Migration.migrate_virtual/3","doc":"","ref":"Needle.Migration.html#migrate_virtual/3"},{"type":"function","title":"Needle.Migration.pointer/2","doc":"Creates a strong, weak or unbreakable pointer depending on `type`.","ref":"Needle.Migration.html#pointer/2"},{"type":"function","title":"Needle.Migration.strong_pointer/1","doc":"A reference to a pointer for use with `add/3`. A strong pointer will\nbe deleted when the thing it's pointing to is deleted.","ref":"Needle.Migration.html#strong_pointer/1"},{"type":"function","title":"Needle.Migration.unbreakable_pointer/1","doc":"A reference to a pointer for use with `add/3`. An unbreakable\npointer will prevent the thing it's pointing to from being deleted.","ref":"Needle.Migration.html#unbreakable_pointer/1"},{"type":"function","title":"Needle.Migration.weak_pointer/1","doc":"A reference to a pointer for use with `add/3`. A weak pointer will\nbe set null when the thing it's pointing to is deleted.","ref":"Needle.Migration.html#weak_pointer/1"},{"type":"type","title":"Needle.Migration.pointer_type/0","doc":"","ref":"Needle.Migration.html#t:pointer_type/0"},{"type":"module","title":"Needle.Mixin","doc":"If a Pointer represents an object, mixins represent data about the object. Mixins collate optional\nadditional information about an object. Different types of object will typically make use of\ndifferent mixins. You can see these as aspects of the data if you like.\n\nA mixin table starts with an `id` column which references `Pointer` and forms the default primary\nkey. It is up to the user to choose which other fields go in the table, and thus what the mixin is for.\n\nUse of a mixin is typically through `has_one`:\n\n```\nhas_one :my_mixin, MyMixin, foreign_key: :id, references: :id\n```\n\nSometimes, the user may wish to add fields to the primary key by using the `primary_key: true`\noption to `add` in their migrations. This is permitted and in such case we call the resulting\nmixin a `multimixin`. Use becomes `has_many`:\n\n```\nhas_many :my_mixin, MyMixin, foreign_key: :id, references: :id\n```\n\nThus the choice of single or multi comes down to how many times you want to store that data for\nthe object. A user's profile naturally lends itself to a regular `single` mixin, whereas an\nobject's appearance in a feed would naturally lend itself to being a multimixin since the object\nmay appear in many feeds.","ref":"Needle.Mixin.html"},{"type":"module","title":"Declaring a mixin table type - Needle.Mixin","doc":"```\ndefmodule My.Mixin do\n\n use Needle.Mixin,\n otp_app: :my_app,\n source: \"postgres_table_name\"\n\n mixin_schema do\n field :is_awesome, :boolean\n end\nend\n```","ref":"Needle.Mixin.html#module-declaring-a-mixin-table-type"},{"type":"macro","title":"Needle.Mixin.mixin_schema/1","doc":"","ref":"Needle.Mixin.html#mixin_schema/1"},{"type":"function","title":"Needle.Mixin.using/2","doc":"","ref":"Needle.Mixin.html#using/2"},{"type":"exception","title":"Needle.NotFound","doc":"We could not find the requested object","ref":"Needle.NotFound.html"},{"type":"function","title":"Needle.NotFound.new/1","doc":"Creates a new NotFound","ref":"Needle.NotFound.html#new/1"},{"type":"type","title":"Needle.NotFound.t/0","doc":"","ref":"Needle.NotFound.html#t:t/0"},{"type":"module","title":"Needle.Pointable","doc":"Sets up an Ecto Schema for a Pointable table.","ref":"Needle.Pointable.html"},{"type":"module","title":"Sample Usage - Needle.Pointable","doc":"```\nuse Needle.Pointable,\n otp_app: :my_app, # your OTP application's name\n source: \"my_table\", # default name of table in database\n table_id: \"01EBTVSZJ6X02J01R1XWWPWGZW\" # unique UID to identify table\n\npointable_schema do\n # ... fields go here, if any\nend\n```","ref":"Needle.Pointable.html#module-sample-usage"},{"type":"module","title":"Overriding with configuration - Needle.Pointable","doc":"During `use` (i.e. compilation time), we will attempt to load\nconfiguration from the provided `:otp_app` under the key of the\ncurrent module. Any values provided here will override the defaults\nprovided to `use`. This allows you to configure them after the fact.\n\nAdditionally, pointables use `Exto`'s `flex_schema()`, so you can\nprovide additional configuration for those in the same place.\n\nI shall say it again because it's important: This happens at\n*compile time*. You must rebuild the app containing the pointable\nwhenever the configuration changes.","ref":"Needle.Pointable.html#module-overriding-with-configuration"},{"type":"module","title":"Introspection - Needle.Pointable","doc":"Defines a function `__pointers__/1` to introspect data. Recognised\nparameters:\n\n`:role` - `:pointable`\n`:table_id` - retrieves the UID id of the pointable table.\n`:otp_app` - retrieves the OTP application to which this belongs.","ref":"Needle.Pointable.html#module-introspection"},{"type":"macro","title":"Needle.Pointable.pointable_schema/1","doc":"","ref":"Needle.Pointable.html#pointable_schema/1"},{"type":"module","title":"Needle.Pointer","doc":"A Pointer is any object that can be referenced by its id.\n\nPointer is a simple table consisting of three fields:\n* id - the database-unique id for this pointer in UID format.\n* table_id - a type tag, references `Table`.\n* deleted_at - timestamp of when the object was deleted, null by default.\n\nTo reference `any` object, simply reference `Pointer`:\n\n```\nalias Needle.Pointer\nbelongs_to :object, Pointer\n```\n\nTo define a new object type there are two options, you should choose one:\n\n* `Virtual` - an object type with a view over `Pointer` limited by type.\n* `Pointable` - an object type with a table which is kept synchronised with `Pointer`.\n\nFor most purposes, you should use a `Virtual`. Pointable exists mostly to support existing code.\nThe major difference in practice is that you cannot add new fields to a virtual. Most of the time\nyou will want to store such extra fields in one or more mixins anyway so they may be reused.\n\nSee `Mixin` for more information about mixins.","ref":"Needle.Pointer.html"},{"type":"function","title":"Needle.Pointer.create/2","doc":"Changeset for creating a Pointer","ref":"Needle.Pointer.html#create/2"},{"type":"function","title":"Needle.Pointer.delete/2","doc":"","ref":"Needle.Pointer.html#delete/2"},{"type":"function","title":"Needle.Pointer.get/3","doc":"","ref":"Needle.Pointer.html#get/3"},{"type":"function","title":"Needle.Pointer.put/3","doc":"","ref":"Needle.Pointer.html#put/3"},{"type":"module","title":"Needle.Pointers","doc":"A context for working with Needle, a sort of global foreign key scheme.","ref":"Needle.Pointers.html"},{"type":"function","title":"Needle.Pointers.assert_points_to!/2","doc":"Return the provided pointer when it belongs to table queryable by the given table search term.","ref":"Needle.Pointers.html#assert_points_to!/2"},{"type":"function","title":"Needle.Pointers.cast!/1","doc":"Returns a Pointer, either the one provided or a synthesised one\npointing to the provided schema object. Does not hit the database or\ncause the pointer to be written to the database whatsoever.","ref":"Needle.Pointers.html#cast!/1"},{"type":"function","title":"Needle.Pointers.get_table_id!/1","doc":"","ref":"Needle.Pointers.html#get_table_id!/1"},{"type":"function","title":"Needle.Pointers.plan/1","doc":"Given a list of pointers which may or may have their pointed loaded,\nreturn a plan for preloading, a map of module name to set of loadable IDs.","ref":"Needle.Pointers.html#plan/1"},{"type":"function","title":"Needle.Pointers.query_base/1","doc":"Returns a basic query over non-deleted pointable objects in the system,\noptionally limited to one or more types.\n\nIf the type is set to a Pointable, Virtual or Mixin schema, records\nwill be selected from that schema directly. It is assumed this\nfilters deleted records by construction.\n\nOtherwise, will query from Pointer, filtering not is_nil(deleted_at)","ref":"Needle.Pointers.html#query_base/1"},{"type":"function","title":"Needle.Pointers.schema/1","doc":"","ref":"Needle.Pointers.html#schema/1"},{"type":"function","title":"Needle.Pointers.table/1","doc":"Looks up the table for a given pointer","ref":"Needle.Pointers.html#table/1"},{"type":"module","title":"Needle.Random","doc":"A securely randomly generated UUID keyed table. Not pointable.","ref":"Needle.Random.html"},{"type":"macro","title":"Needle.Random.random_schema/1","doc":"","ref":"Needle.Random.html#random_schema/1"},{"type":"function","title":"Needle.Random.using/2","doc":"","ref":"Needle.Random.html#using/2"},{"type":"module","title":"Needle.Table","doc":"One Table to rule them all. A record of a table participating in the\npointers abstraction - mandatory if participating.","ref":"Needle.Table.html"},{"type":"function","title":"Needle.Table.delete/2","doc":"","ref":"Needle.Table.html#delete/2"},{"type":"function","title":"Needle.Table.get/3","doc":"","ref":"Needle.Table.html#get/3"},{"type":"function","title":"Needle.Table.put/3","doc":"","ref":"Needle.Table.html#put/3"},{"type":"type","title":"Needle.Table.t/0","doc":"","ref":"Needle.Table.html#t:t/0"},{"type":"module","title":"Needle.Tables","doc":"A Global cache of Tables to be queried by their (Pointer) IDs, table\nnames or Ecto Schema module names.\n\nUse of the Table Service requires:\n\n1. You have run the migrations shipped with this library.\n2. You have started `Needle.Tables` before querying.\n3. All OTP applications with pointable Ecto Schemata to be added to the schema path.\n4. OTP 21.2 or greater, though we recommend using the most recent release available.\n\nWhile this module is a GenServer, it is only responsible for setup\nof the cache and then exits with :ignore having done so. It is not\nrecommended to restart the service as this will lead to a stop the\nworld garbage collection of all processes and the copying of the\nentire cache to each process that has queried it since its last\nlocal garbage collection.","ref":"Needle.Tables.html"},{"type":"function","title":"Needle.Tables.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Needle.Tables.html#child_spec/1"},{"type":"function","title":"Needle.Tables.data/0","doc":"","ref":"Needle.Tables.html#data/0"},{"type":"function","title":"Needle.Tables.id/1","doc":"Look up a table id by id, name or schema.","ref":"Needle.Tables.html#id/1"},{"type":"function","title":"Needle.Tables.id!/1","doc":"Look up a table id by id, name or schema, raise NotFound if not found.","ref":"Needle.Tables.html#id!/1"},{"type":"function","title":"Needle.Tables.ids!/1","doc":"Look up many ids at once, raise NotFound if any of them are not found","ref":"Needle.Tables.html#ids!/1"},{"type":"function","title":"Needle.Tables.mixin_modules/0","doc":"","ref":"Needle.Tables.html#mixin_modules/0"},{"type":"function","title":"Needle.Tables.schema/1","doc":"Look up a schema module by id, name or schema","ref":"Needle.Tables.html#schema/1"},{"type":"function","title":"Needle.Tables.schema!/1","doc":"Look up a schema module by id, name or schema, raise NotFound if not found","ref":"Needle.Tables.html#schema!/1"},{"type":"function","title":"Needle.Tables.schema?/1","doc":"","ref":"Needle.Tables.html#schema?/1"},{"type":"function","title":"Needle.Tables.schema_modules/0","doc":"","ref":"Needle.Tables.html#schema_modules/0"},{"type":"function","title":"Needle.Tables.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Needle.Tables.html#start_link/1"},{"type":"function","title":"Needle.Tables.table/1","doc":"Get a Table identified by name, id or module.","ref":"Needle.Tables.html#table/1"},{"type":"function","title":"Needle.Tables.table!/1","doc":"Look up a Table by name or id, raise NotFound if not found.","ref":"Needle.Tables.html#table!/1"},{"type":"type","title":"Needle.Tables.query/0","doc":"A query is either a table's (database) name or (Pointer) ID as a\nbinary or the name of its Ecto Schema Module as an atom.","ref":"Needle.Tables.html#t:query/0"},{"type":"module","title":"Needle.UID","doc":"[![hex.pm](https://img.shields.io/hexpm/v/needle_uid)](https://hex.pm/packages/needle_uid)\n[hexdocs](https://hexdocs.pm/needle_uid)\n\nHybrid prefixed UUIDv7 and ULID data type for Ecto (using [pride](https://github.com/bonfire-networks/pride) and [needle_ulid](https://github.com/bonfire-networks/needle_ulid))","ref":"Needle.UID.html"},{"type":"module","title":"Installation - Needle.UID","doc":"```elixir\n{:needle_uid, git: \"https://github.com/bonfire-networks/needle_uid\", branch: \"main\"}\n```","ref":"Needle.UID.html#module-installation"},{"type":"module","title":"Copyright and License - Needle.UID","doc":"Copyright (c) 2024 Bonfire contributors\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.UID.html#module-copyright-and-license"},{"type":"function","title":"Needle.UID.cast/2","doc":"Casts an encoded string to ID. Transforms outside data into runtime data.\n\nUsed to (potentially) convert your data into an internal normalized representation which will be part of your changesets. It also used for verifying that something is actually valid input data for your type.","ref":"Needle.UID.html#cast/2"},{"type":"function","title":"Needle.UID.cast!/2","doc":"Same as `cast/1` but raises `Ecto.CastError` on invalid arguments.","ref":"Needle.UID.html#cast!/2"},{"type":"function","title":"Needle.UID.dump/3","doc":"Converts an encoded ID into a binary. Used to get your data ready to be written to the database. Transforms anything (outside data or runtime data) into database column data","ref":"Needle.UID.html#dump/3"},{"type":"function","title":"Needle.UID.generate/1","doc":"","ref":"Needle.UID.html#generate/1"},{"type":"function","title":"Needle.UID.is_pride?/2","doc":"","ref":"Needle.UID.html#is_pride?/2"},{"type":"function","title":"Needle.UID.is_ulid?/1","doc":"Takes a string and returns true if it is a valid ULID (Universally Unique Lexicographically Sortable Identifier).","ref":"Needle.UID.html#is_ulid?/1"},{"type":"function","title":"Examples - Needle.UID.is_ulid?/1","doc":"iex> is_ulid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> is_ulid?(\"invalid_ulid\")\n false","ref":"Needle.UID.html#is_ulid?/1-examples"},{"type":"function","title":"Needle.UID.is_uuid?/2","doc":"Takes a string and returns true if it is a valid Object ID or Prefixed UUID (Universally Unique Identifier).","ref":"Needle.UID.html#is_uuid?/2"},{"type":"function","title":"Examples - Needle.UID.is_uuid?/2","doc":"iex> is_uuid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uuid?(\"test_3TUIKuXX5mNO2jSA41bsDx\")\n true\n\n iex> is_uuid?(\"invalid_uuid\")\n false","ref":"Needle.UID.html#is_uuid?/2-examples"},{"type":"function","title":"Needle.UID.load/3","doc":"Converts a binary ID into an encoded string. Transforms database column data into runtime data.","ref":"Needle.UID.html#load/3"},{"type":"function","title":"Needle.UID.synthesise!/1","doc":"translates alphanumerics into a sentinel ID value","ref":"Needle.UID.html#synthesise!/1"},{"type":"function","title":"Needle.UID.timestamp/1","doc":"Returns the timestamp of an encoded or unencoded UID","ref":"Needle.UID.html#timestamp/1"},{"type":"function","title":"Needle.UID.type/1","doc":"The underlying schema type.","ref":"Needle.UID.html#type/1"},{"type":"function","title":"Needle.UID.valid?/2","doc":"Takes a string and returns true if it is a valid UUID or ULID.","ref":"Needle.UID.html#valid?/2"},{"type":"function","title":"Examples - Needle.UID.valid?/2","doc":"iex> valid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> valid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uuid?(\"test_3TUIKuXX5mNO2jSA41bsDx\")\n true\n\n iex> valid?(\"invalid_id\")\n false","ref":"Needle.UID.html#valid?/2-examples"},{"type":"module","title":"Needle.ULID","doc":"[![hex.pm](https://img.shields.io/hexpm/v/needle_ulid)](https://hex.pm/packages/needle_ulid)\n[hexdocs](https://hexdocs.pm/needle_ulid)\n\nA ULID datatype and some postgres support for ULID operations (`min` and `max` functions and aggregates)\n\nOriginally forked from\n[ecto-ulid](https://github.com/TheRealReal/ecto-ulid) but the internals have been replaced with a dependency on [ex_ulid](https://github.com/omgnetwork/ex_ulid)","ref":"Needle.ULID.html"},{"type":"module","title":"Installation - Needle.ULID","doc":"```elixir\n{:needle_ulid, git: \"https://github.com/bonfire-networks/needle_ulid\", branch: \"main\"}\n```","ref":"Needle.ULID.html#module-installation"},{"type":"module","title":"Copyright and License - Needle.ULID","doc":"Copyright (c) 2021 Bonfire contributors.\nCopyright (c) 2018 The RealReal, Inc.\nCopyright (c) 2020 needle_ulid contributors.\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.ULID.html#module-copyright-and-license"},{"type":"function","title":"Needle.ULID.bingenerate/1","doc":"Generates a binary ULID.\n\nIf a value is provided for `timestamp`, the generated ULID will be for the provided timestamp.\nOtherwise, a ULID will be generated for the current time.\n\nArguments:\n\n* `timestamp`: A Unix timestamp with millisecond precision.","ref":"Needle.ULID.html#bingenerate/1"},{"type":"function","title":"Needle.ULID.bintimestamp/1","doc":"","ref":"Needle.ULID.html#bintimestamp/1"},{"type":"function","title":"Needle.ULID.cast/1","doc":"Casts a 26-byte encoded string to ULID or a 16-byte binary unchanged","ref":"Needle.ULID.html#cast/1"},{"type":"function","title":"Needle.ULID.cast!/1","doc":"Same as `cast/1` but raises `Ecto.CastError` on invalid arguments.","ref":"Needle.ULID.html#cast!/1"},{"type":"function","title":"Needle.ULID.decode/1","doc":"","ref":"Needle.ULID.html#decode/1"},{"type":"function","title":"Needle.ULID.dump/1","doc":"Converts a Crockford Base32 encoded ULID into a binary.","ref":"Needle.ULID.html#dump/1"},{"type":"function","title":"Needle.ULID.dump!/1","doc":"","ref":"Needle.ULID.html#dump!/1"},{"type":"function","title":"Needle.ULID.embed_as/1","doc":"","ref":"Needle.ULID.html#embed_as/1"},{"type":"function","title":"Needle.ULID.encode/2","doc":"","ref":"Needle.ULID.html#encode/2"},{"type":"function","title":"Needle.ULID.encoded_randomness/1","doc":"Returns the randomness portion of the encoded ulid","ref":"Needle.ULID.html#encoded_randomness/1"},{"type":"function","title":"Needle.ULID.encoded_timestamp/1","doc":"Returns the timestamp portion of the encoded ulid","ref":"Needle.ULID.html#encoded_timestamp/1"},{"type":"function","title":"Needle.ULID.equal?/2","doc":"","ref":"Needle.ULID.html#equal?/2"},{"type":"function","title":"Needle.ULID.generate/1","doc":"Generates a Crockford Base32 encoded ULID.\n\nIf a value is provided for `timestamp`, the generated ULID will be for the provided timestamp.\nOtherwise, a ULID will be generated for the current time.\n\nArguments:\n\n* `timestamp`: A Unix timestamp with millisecond precision.","ref":"Needle.ULID.html#generate/1"},{"type":"function","title":"Needle.ULID.load/1","doc":"Converts a binary ULID into a Crockford Base32 encoded string.","ref":"Needle.ULID.html#load/1"},{"type":"function","title":"Needle.ULID.synthesise!/1","doc":"translates alphanumerics into a sentinel ulid value","ref":"Needle.ULID.html#synthesise!/1"},{"type":"function","title":"Needle.ULID.timestamp/1","doc":"Returns the timestamp of an encoded or unencoded ULID","ref":"Needle.ULID.html#timestamp/1"},{"type":"function","title":"Needle.ULID.type/0","doc":"The underlying schema type.","ref":"Needle.ULID.html#type/0"},{"type":"function","title":"Needle.ULID.valid?/1","doc":"","ref":"Needle.ULID.html#valid?/1"},{"type":"module","title":"Needle.ULID.Migration","doc":"","ref":"Needle.ULID.Migration.html"},{"type":"function","title":"Needle.ULID.Migration.init_pointers_ulid_extra/0","doc":"","ref":"Needle.ULID.Migration.html#init_pointers_ulid_extra/0"},{"type":"function","title":"Needle.ULID.Migration.init_pointers_ulid_extra/1","doc":"","ref":"Needle.ULID.Migration.html#init_pointers_ulid_extra/1"},{"type":"module","title":"Needle.Unpointable","doc":"Has a UID primary key but is not pointable.","ref":"Needle.Unpointable.html"},{"type":"macro","title":"Needle.Unpointable.unpointable_schema/1","doc":"","ref":"Needle.Unpointable.html#unpointable_schema/1"},{"type":"function","title":"Needle.Unpointable.using/2","doc":"","ref":"Needle.Unpointable.html#using/2"},{"type":"module","title":"Needle.Virtual","doc":"Sets up an Ecto Schema for a Virtual Pointable\n\nVirtual Pointables (or just `virtuals`) are like pointables with no\nadditional columns, except instead of being backed by a table they\nare backed by a view. This is more efficient of resources but only\nworks when there are no additional columns to add.\n\nIf you need to add columns to the schema, you should use a pointable.","ref":"Needle.Virtual.html"},{"type":"module","title":"Sample Usage - Needle.Virtual","doc":"```\nuse Needle.Virtual,\n otp_app: :my_app, # your OTP application's name\n source: \"my_table\", # default name of view in database\n table_id: \"01EBTVSZJ6X02J01R1XWWPWGZW\" # valid UID to identify virtual\n\nvirtual_schema do\n # ... `has_one`, `has_many`, or *virtual* fields ONLY go here.\nend\n```","ref":"Needle.Virtual.html#module-sample-usage"},{"type":"module","title":"Overriding with configuration - Needle.Virtual","doc":"During `use` (i.e. compilation time), we will attempt to load\nconfiguration from the provided `:otp_app` under the key of the\ncurrent module. Any values provided here will override the defaults\nprovided to `use`. This allows you to configure them after the fact.\n\nAdditionally, pointables use `Exto`'s `flex_schema()`, so you can\nprovide additional configuration for those in the same place. Unlike\na regular pointable, you should not add additional\n(non-virtual) fields, but it is permitted to add `has_one` /\n`has_many` associations.\n\nI shall say it again because it's important: This happens at\n*compile time*. You must rebuild the app containing the pointable\nwhenever the configuration changes.","ref":"Needle.Virtual.html#module-overriding-with-configuration"},{"type":"module","title":"Introspection - Needle.Virtual","doc":"Defines a function `__pointers__/1` to introspect data. Recognised\nparameters:\n\n`:role` - `:virtual`.\n`:table_id` - retrieves the UID id of the virtual.\n`:otp_app` - retrieves the OTP application to which this belongs.","ref":"Needle.Virtual.html#module-introspection"},{"type":"macro","title":"Needle.Virtual.virtual_schema/1","doc":"","ref":"Needle.Virtual.html#virtual_schema/1"},{"type":"module","title":"Releaser.Git","doc":"","ref":"Releaser.Git.html"},{"type":"function","title":"Releaser.Git.add_commit_and_tag/1","doc":"This module contains some git-specific functionality","ref":"Releaser.Git.html#add_commit_and_tag/1"},{"type":"module","title":"Releaser.Publish","doc":"","ref":"Releaser.Publish.html"},{"type":"function","title":"Releaser.Publish.publish!/0","doc":"","ref":"Releaser.Publish.html#publish!/0"},{"type":"module","title":"Releaser.Tests","doc":"","ref":"Releaser.Tests.html"},{"type":"function","title":"Releaser.Tests.run_tests!/0","doc":"","ref":"Releaser.Tests.html#run_tests!/0"},{"type":"module","title":"Releaser.VersionUtils","doc":"","ref":"Releaser.VersionUtils.html"},{"type":"function","title":"Releaser.VersionUtils.bump_major/1","doc":"Some utilities to get and set version numbers in the `mix.exs` file\nand to programmatically transform version numbers.\nMaybe the `bump_*` functions should be in the standard library?\nThis script doesn't support pre-release versions or versions with build information.","ref":"Releaser.VersionUtils.html#bump_major/1"},{"type":"function","title":"Releaser.VersionUtils.bump_minor/1","doc":"","ref":"Releaser.VersionUtils.html#bump_minor/1"},{"type":"function","title":"Releaser.VersionUtils.bump_patch/1","doc":"","ref":"Releaser.VersionUtils.html#bump_patch/1"},{"type":"function","title":"Releaser.VersionUtils.bump_pre/2","doc":"","ref":"Releaser.VersionUtils.html#bump_pre/2"},{"type":"function","title":"Releaser.VersionUtils.get_version/1","doc":"","ref":"Releaser.VersionUtils.html#get_version/1"},{"type":"function","title":"Releaser.VersionUtils.set_version/2","doc":"","ref":"Releaser.VersionUtils.html#set_version/2"},{"type":"function","title":"Releaser.VersionUtils.update_version/2","doc":"","ref":"Releaser.VersionUtils.html#update_version/2"},{"type":"function","title":"Releaser.VersionUtils.version_to_string/1","doc":"","ref":"Releaser.VersionUtils.html#version_to_string/1"},{"type":"module","title":"Untangle","doc":"Logging/inspecting data, and timing functions, with code location information.","ref":"Untangle.html"},{"type":"module","title":"Logging/inspecting - Untangle","doc":"`Untangle` provides alternatives for `IO.inspect` and the macros in Elixir's `Logger` to output code location information. It also provides a polyfill for `dbg` which was introduce in Elixir 1.14\n\n![screenshot](priv/screenshot.png \"Screenshot showing sample logs (shown when running the library tests)\")\n\nThe first argument is `inspect`ed and the second argument (if provided) is used as a label:\n\n```\n> import Untangle\nUntangle\n> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\n> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change `warn` or `info` for `debug` if you only need it during development :-)","ref":"Untangle.html#module-logging-inspecting"},{"type":"module","title":"Timing functions - Untangle","doc":"You can decorate functions to measure and log their execution time:\n\n```\nuse Untangle\n\n@decorate time()\ndef fun(), do: :stuff\n```\n\nwill output something like `[info] Time to run MyModule.fun/0: 1 ms`","ref":"Untangle.html#module-timing-functions"},{"type":"module","title":"Installation - Untangle","doc":"If [available in Hex](https://hex.pm/docs/publish), the package can be installed\nby adding `untangle` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [\n {:untangle, \"~> 0.3\"}\n ]\nend\n```\n\n# Configure as default `dbg/2` handler","ref":"Untangle.html#module-installation"},{"type":"module","title":"In config/config.exs - Untangle","doc":"`config :elixir, :dbg_callback, {Untangle, :custom_dbg, []}`\n\n# Docs\n\nThe docs can be found at [https://hexdocs.pm/untangle](https://hexdocs.pm/untangle).","ref":"Untangle.html#module-in-config-config-exs"},{"type":"module","title":"Copyright and License - Untangle","doc":"Copyright (c) 2022 Bonfire contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Untangle.html#module-copyright-and-license"},{"type":"function","title":"Untangle.custom_dbg/3","doc":"Custom backend for `Kernel.dbg/2`.\nThis function provides a backend for `Kernel.dbg/2`.\nThis function:\n * may log or print information about the given `env`\n * may log or print information about `code` and its returned value (using `opts` to inspect terms)\n * returns the value returned by evaluating `code`","ref":"Untangle.html#custom_dbg/3"},{"type":"macro","title":"Untangle.debug/3","doc":"Like `dump`, but for logging at debug level","ref":"Untangle.html#debug/3"},{"type":"macro","title":"Untangle.dump/3","doc":"IO.inspect but outputs to Logger with position information, an optional label and configured not to truncate output too much.","ref":"Untangle.html#dump/3"},{"type":"macro","title":"Untangle.error/3","doc":"Similar to `dump`, but for logging at error level, and returns an error tuple:\n- an error tuple with the label, if any\n- an error tuple with the passed value otherwise\n\n```\niex> error(:value)\n### [error] :value\n{:error, :value}\n\niex> error({:error, :value})\n### [error] :value\n{:error, :value}\n\niex> error(:value, \"with label\")\n### [error] with label: :value\n{:error, \"with label\"}\n\niex> error({:error, :value}, \"with label\")\n### [error] with label: :value\n{:error, \"with label\"}\n```","ref":"Untangle.html#error/3"},{"type":"function","title":"Untangle.format_application_location/3","doc":"","ref":"Untangle.html#format_application_location/3"},{"type":"function","title":"Untangle.format_location/2","doc":"","ref":"Untangle.html#format_location/2"},{"type":"function","title":"Untangle.format_stacktrace/1","doc":"Formats the stacktrace.\n\nA stacktrace must be given as an argument. If not, the stacktrace\nis retrieved from `Process.info/2`.","ref":"Untangle.html#format_stacktrace/1"},{"type":"function","title":"Untangle.format_stacktrace_entry/1","doc":"Receives a stacktrace entry and formats it into a string.","ref":"Untangle.html#format_stacktrace_entry/1"},{"type":"function","title":"Untangle.format_stacktrace_label/2","doc":"","ref":"Untangle.html#format_stacktrace_label/2"},{"type":"function","title":"Untangle.format_stacktrace_sliced/3","doc":"","ref":"Untangle.html#format_stacktrace_sliced/3"},{"type":"macro","title":"Untangle.info/3","doc":"Like `dump`, but for logging at info level","ref":"Untangle.html#info/3"},{"type":"function","title":"Untangle.log_level?/1","doc":"","ref":"Untangle.html#log_level?/1"},{"type":"macro","title":"Untangle.maybe_dbg/3","doc":"Like `debug`, but will do nothing unless the `:debug` option is truthy","ref":"Untangle.html#maybe_dbg/3"},{"type":"macro","title":"Untangle.maybe_info/3","doc":"Like `maybe_dbg`, but requires the `:verbose` option to be set. Intended for large outputs.","ref":"Untangle.html#maybe_info/3"},{"type":"function","title":"Untangle.module_name/1","doc":"","ref":"Untangle.html#module_name/1"},{"type":"macro","title":"Untangle.smart/3","doc":"Tries to 'do what i mean'. Requires the `debug` option to be set regardless. If `verbose` is also\nset, will inspect else will attempt to print some (hopefully smaller) type-dependent summary of\nthe data (list length, map keys).","ref":"Untangle.html#smart/3"},{"type":"macro","title":"Untangle.warn/3","doc":"Like `dump`, but for logging at warn level","ref":"Untangle.html#warn/3"},{"type":"module","title":"Untangle.Time","doc":"","ref":"Untangle.Time.html"},{"type":"macro","title":"Untangle.Time.time/0","doc":"","ref":"Untangle.Time.html#time/0"},{"type":"function","title":"Untangle.Time.time/2","doc":"","ref":"Untangle.Time.html#time/2"},{"type":"module","title":"Voodoo","doc":"`Voodoo` is a drop-in replacement for the old-style Phoenix path helpers (before `Phoenix.VerifiedRoutes` was introduced) which is more convenient to use.","ref":"Voodoo.html"},{"type":"macro","title":"Voodoo.def_reverse_router/2","doc":"Generates a reverse router function with the given name based upon a\ncompiled(!) phoenix router module.\n\nMust be used outside of the router module, or else the router won't\nbe compiled yet and we won't be able to look up the routes.\n\nGenerated function wraps the existing phoenix helpers.\n\n```\ndefmodule MyAppWeb.Router do\n use MyAppWeb, :router\n # ...\nend\ndefmodule MyAppWeb.Router.Reverse do\n import Voodoo, only: [def_reverse_router: 2]\n def_reverse_router :path, for: MyAppWeb.Router\nend\n```","ref":"Voodoo.html#def_reverse_router/2"},{"type":"function","title":"Voodoo.router/1","doc":"Turns a Conn or Socket into the name of the router that routed it.","ref":"Voodoo.html#router/1"},{"type":"module","title":"Bonfire.API.GraphQL","doc":"","ref":"Bonfire.API.GraphQL.html"},{"type":"module","title":"GraphQL Introduction - Bonfire.API.GraphQL","doc":"Go to http://your-instance-url/api/ to start playing with the GraphQL API. The GraphiQL UI should autocomplete types, queries and mutations for you, and you can also explore the schema there.\n\nLet's start with a simple GraphQL thoeretical query:\n\n```graphql\nquery {\n greetings(limit: 10) {\n greeting\n to {\n name\n }\n }\n}\n```\n\nLet's break this apart:\n\n- `query {}` is how you retrieve information from GraphQL.\n- `greetings` is a `field` within the query.\n- `greetings` takes a `limit` argument, a positive integer.\n- `greetings` has two fields, `greeting` and `to`.\n- `to` has one `field`, `name`.\n\nThis query is asking for a list of (up to) 10 greetings and the people\nthey are for. Notice that the result of both `greetings` and `to` are\nmap/object structures with their own fields and that if the type has\nmultiple fields, we can select more than one field.\n\nHere is some possible data we could get returned\n\n```elixir\n%{greetings: [\n %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]}\n```\n\nWhere is the magic? Typically an object type will reside in its own\ntable in the database, so this query is actually querying two tables\nin one go. In fact, given a supporting schema, you can nest queries\narbitrarily and the backend will figure out how to run them.\n\nThe fact that you can represent arbitrarily complex queries puts quite\na lot of pressure on the backend to make it all efficient. This is\nstill a work in progress at this time.","ref":"Bonfire.API.GraphQL.html#module-graphql-introduction"},{"type":"module","title":"Absinthe Introduction - Bonfire.API.GraphQL","doc":"Every `field` is filled by a resolver. Let's take our existing query\nand define a schema for it in Absinthe's query DSL:\n\n```elixir\ndefmodule MyApp.Schema do\n # the schema macro language\n use Absinthe.Schema.Notation\n # where we will actually resolve the fields\n alias MyApp.Resolver\n\n # Our user object is pretty simple, just a name\n object :user do\n field :name, non_null(:string)\n end\n\n # This one is slightly more complicated, we have that nested `to`\n object :greeting do\n # the easy one\n field :greeting, non_null(:string)\n # the hard one. `edge` is the term for when we cross an object boundary.\n field :to, non_null(:user), do: resolve(&Resolver.to_edge/3)\n end\n\n # something to put our top level queries in, because they're just fields too!\n object :queries do\n field :greetings, non_null(list_of(non_null(:string))) do\n arg :limit, :integer # optional\n resolve &Resolver.greetings/2 # we need to manually process this one\n end\n end\n\nend\n```\n\nThere are a couple of interesting things about this:\n\n- Sprinklings of `not_null` to require that values be present (if you\n don't return them, absinthe will get upset).\n- Only two fields have explicit resolvers. Anything else will default\n to a map key lookup (which is more often than not what you want).\n- `greeting.to_edge` has a `/3` resolver and `queries.greetings` a\n `/2` resolver.\n\nTo understand the last one (and partially the middle one), we must\nunderstand how resolution works and what a parent is. The best way of\ndoing that is probably to look at the resolver code:\n\n```elixir\ndefmodule MyApp.Resolver do\n\n # For purposes of this, we will just fake the data out\n defp greetings_data() do\n [ %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]\n end\n\n # the /2 resolver takes only arguments (which in this case is just limit)\n # and an info (which we'll explain later)\n def greetings(%{limit: limit}, _info) when is_integer(limit) and limit > 0 do\n {:ok, Enum.take(greetings_data(), limit)} # absinthe expects an ok/error tuple\n end\n def greetings(_args, _info), do: {:ok, greetings_data()} # no limit\n\n # the /3 resolver takes an additional parent argument in first position.\n # `parent` here will be the `greeting` we are resolving `to` for.\n def to_edge(parent, args, info), do: Map.get(parent, :to)\n\nend\n```\n\nThe keen-eyed amongst you may have noticed I said the default resolver\nis a map lookup and our `to_edge/3` is a map lookup too, so\ntechnically we didn't need to write it. But then you wouldn't have an\nexample of a `/3` resolver! In most of the app, these will be querying\nfrom the database, not looking up in a constant.\n\nSo for every field, a resolver function is run. It defaults to a map\nlookup, but you can override it with `resolve/1`. It may or may not\nhave arguments. And all absinthe resolvers return an ok/error tuple.","ref":"Bonfire.API.GraphQL.html#module-absinthe-introduction"},{"type":"module","title":"Copyright and License - Bonfire.API.GraphQL","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.API.GraphQL.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.admin_or_not_permitted/1","doc":"","ref":"Bonfire.API.GraphQL.html#admin_or_not_permitted/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_int_ulid_id/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_int_ulid_id/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_nonnegint/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_nonnegint/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_posint/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_posint/1"},{"type":"function","title":"Bonfire.API.GraphQL.cast_ulid/1","doc":"","ref":"Bonfire.API.GraphQL.html#cast_ulid/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_account/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_account/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_not_found/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_not_found/1"},{"type":"function","title":"Bonfire.API.GraphQL.current_user_or_not_logged_in/1","doc":"","ref":"Bonfire.API.GraphQL.html#current_user_or_not_logged_in/1"},{"type":"function","title":"Bonfire.API.GraphQL.empty_page/0","doc":"","ref":"Bonfire.API.GraphQL.html#empty_page/0"},{"type":"function","title":"Bonfire.API.GraphQL.equals_or/4","doc":"","ref":"Bonfire.API.GraphQL.html#equals_or/4"},{"type":"function","title":"Bonfire.API.GraphQL.equals_or_not_permitted/2","doc":"","ref":"Bonfire.API.GraphQL.html#equals_or_not_permitted/2"},{"type":"function","title":"Bonfire.API.GraphQL.full_page_opts/3","doc":"","ref":"Bonfire.API.GraphQL.html#full_page_opts/3"},{"type":"function","title":"Bonfire.API.GraphQL.guest_only/1","doc":"","ref":"Bonfire.API.GraphQL.html#guest_only/1"},{"type":"function","title":"Bonfire.API.GraphQL.in_list?/1","doc":"Are we in a list (recursively)?","ref":"Bonfire.API.GraphQL.html#in_list?/1"},{"type":"function","title":"Bonfire.API.GraphQL.invalid_credential/0","doc":"","ref":"Bonfire.API.GraphQL.html#invalid_credential/0"},{"type":"function","title":"Bonfire.API.GraphQL.is_authenticated/1","doc":"","ref":"Bonfire.API.GraphQL.html#is_authenticated/1"},{"type":"function","title":"Bonfire.API.GraphQL.limit_page_opts/2","doc":"","ref":"Bonfire.API.GraphQL.html#limit_page_opts/2"},{"type":"function","title":"Bonfire.API.GraphQL.list_depth/1","doc":"How many lists are we in (recursively)?","ref":"Bonfire.API.GraphQL.html#list_depth/1"},{"type":"function","title":"Bonfire.API.GraphQL.not_found/0","doc":"","ref":"Bonfire.API.GraphQL.html#not_found/0"},{"type":"function","title":"Bonfire.API.GraphQL.not_in_list_or/2","doc":"","ref":"Bonfire.API.GraphQL.html#not_in_list_or/2"},{"type":"function","title":"Bonfire.API.GraphQL.not_in_list_or_empty_page/1","doc":"","ref":"Bonfire.API.GraphQL.html#not_in_list_or_empty_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.not_logged_in/0","doc":"","ref":"Bonfire.API.GraphQL.html#not_logged_in/0"},{"type":"function","title":"Bonfire.API.GraphQL.not_permitted/1","doc":"","ref":"Bonfire.API.GraphQL.html#not_permitted/1"},{"type":"function","title":"Bonfire.API.GraphQL.parent_name/1","doc":"","ref":"Bonfire.API.GraphQL.html#parent_name/1"},{"type":"function","title":"Bonfire.API.GraphQL.predicated/1","doc":"","ref":"Bonfire.API.GraphQL.html#predicated/1"},{"type":"function","title":"Bonfire.API.GraphQL.predicated/2","doc":"","ref":"Bonfire.API.GraphQL.html#predicated/2"},{"type":"function","title":"Bonfire.API.GraphQL.reproject/2","doc":"","ref":"Bonfire.API.GraphQL.html#reproject/2"},{"type":"function","title":"Bonfire.API.GraphQL.reverse_path/1","doc":"","ref":"Bonfire.API.GraphQL.html#reverse_path/1"},{"type":"function","title":"Bonfire.API.GraphQL.validate_cursor/2","doc":"","ref":"Bonfire.API.GraphQL.html#validate_cursor/2"},{"type":"function","title":"Bonfire.API.GraphQL.wanted/2","doc":"","ref":"Bonfire.API.GraphQL.html#wanted/2"},{"type":"module","title":"Bonfire.API.GraphQL.Auth","doc":"","ref":"Bonfire.API.GraphQL.Auth.html"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.account_by/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#account_by/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.build_context/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#build_context/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.login/3","doc":"Resolver for login mutation for Bonfire.API.GraphQL.CommonSchema","ref":"Bonfire.API.GraphQL.Auth.html#login/3"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.select_user/3","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#select_user/3"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.set_context_from_resolution/2","doc":"Puts the account/user data in Absinthe context (runs after on `login/3` resolver)","ref":"Bonfire.API.GraphQL.Auth.html#set_context_from_resolution/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.set_session_from_context/2","doc":"Sets session cookie based on the Absinthe context set in `set_context_from_resolution/2` (called from router's `absinthe_before_send/2` )","ref":"Bonfire.API.GraphQL.Auth.html#set_session_from_context/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.token_new/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#token_new/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.token_verify/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#token_verify/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.user_by/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#user_by/1"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.user_by/2","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#user_by/2"},{"type":"function","title":"Bonfire.API.GraphQL.Auth.username/1","doc":"","ref":"Bonfire.API.GraphQL.Auth.html#username/1"},{"type":"module","title":"Bonfire.API.GraphQL.CommonResolver","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.canonical_url_edge/3","doc":"Returns the canonical url for a thing or character","ref":"Bonfire.API.GraphQL.CommonResolver.html#canonical_url_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.context_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#context_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.context_edges/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#context_edges/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.created_at_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#created_at_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.delete/2","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#delete/2"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.display_username_edge/3","doc":"Returns the username for a character","ref":"Bonfire.API.GraphQL.CommonResolver.html#display_username_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.fetch_context_edge/2","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#fetch_context_edge/2"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.fetch_context_edges/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#fetch_context_edges/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_deleted_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_deleted_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_disabled_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_disabled_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_hidden_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_hidden_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_local_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_local_edge/3"},{"type":"function","title":"Bonfire.API.GraphQL.CommonResolver.is_public_edge/3","doc":"","ref":"Bonfire.API.GraphQL.CommonResolver.html#is_public_edge/3"},{"type":"module","title":"Bonfire.API.GraphQL.CommonSchema","doc":"","ref":"Bonfire.API.GraphQL.CommonSchema.html"},{"type":"module","title":"Bonfire.API.GraphQL.Cursor","doc":"","ref":"Bonfire.API.GraphQL.Cursor.html"},{"type":"module","title":"Bonfire.API.GraphQL.FetchFields","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchFields.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchFields.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchFields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.FetchPage","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchPage.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchPage.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchPage.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.FetchPages","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html"},{"type":"function","title":"Bonfire.API.GraphQL.FetchPages.run/1","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.FetchPages.t/0","doc":"","ref":"Bonfire.API.GraphQL.FetchPages.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Fields","doc":"","ref":"Bonfire.API.GraphQL.Fields.html"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.get/3","doc":"Returns the result corresponding to the given key, or the given default (or nil).","ref":"Bonfire.API.GraphQL.Fields.html#get/3"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.getter/2","doc":"Returns a post-batch callback function which calls get with the\nprovided key and optional default value (or nil).","ref":"Bonfire.API.GraphQL.Fields.html#getter/2"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.new/2","doc":"Creates a new Fields from the data and a grouping function","ref":"Bonfire.API.GraphQL.Fields.html#new/2"},{"type":"function","title":"Bonfire.API.GraphQL.Fields.new/3","doc":"","ref":"Bonfire.API.GraphQL.Fields.html#new/3"},{"type":"type","title":"Bonfire.API.GraphQL.Fields.t/0","doc":"","ref":"Bonfire.API.GraphQL.Fields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.JSON","doc":"The Json scalar type allows arbitrary JSON values to be passed in and out.\nRequires `{ :jason, \"~> 1.1\" }` package: https://github.com/michalmuskala/jason","ref":"Bonfire.API.GraphQL.JSON.html"},{"type":"module","title":"Bonfire.API.GraphQL.MastoCompatible.Router","doc":"","ref":"Bonfire.API.GraphQL.MastoCompatible.Router.html"},{"type":"macro","title":"Bonfire.API.GraphQL.MastoCompatible.Router.include_masto_api/0","doc":"","ref":"Bonfire.API.GraphQL.MastoCompatible.Router.html#include_masto_api/0"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.collapse/1","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#collapse/1"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors.collapse/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.CollapseErrors.html#collapse/2"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.Debug","doc":"","ref":"Bonfire.API.GraphQL.Middleware.Debug.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.Debug.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.Debug.html#call/2"},{"type":"module","title":"Bonfire.API.GraphQL.Middleware.RenderLists","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.RenderLists.call/2","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Middleware.RenderLists.collapse/1","doc":"","ref":"Bonfire.API.GraphQL.Middleware.RenderLists.html#collapse/1"},{"type":"module","title":"Bonfire.API.GraphQL.Page","doc":"","ref":"Bonfire.API.GraphQL.Page.html"},{"type":"function","title":"Bonfire.API.GraphQL.Page.new/4","doc":"","ref":"Bonfire.API.GraphQL.Page.html#new/4"},{"type":"type","title":"Bonfire.API.GraphQL.Page.t/0","doc":"","ref":"Bonfire.API.GraphQL.Page.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.PageInfo","doc":"Information about this page's relation to a larger result set","ref":"Bonfire.API.GraphQL.PageInfo.html"},{"type":"function","title":"Bonfire.API.GraphQL.PageInfo.new/4","doc":"","ref":"Bonfire.API.GraphQL.PageInfo.html#new/4"},{"type":"type","title":"Bonfire.API.GraphQL.PageInfo.t/0","doc":"","ref":"Bonfire.API.GraphQL.PageInfo.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Pages","doc":"","ref":"Bonfire.API.GraphQL.Pages.html"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.get/2","doc":"Returns a Page for the given key, defaulting to an empty one","ref":"Bonfire.API.GraphQL.Pages.html#get/2"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.getter/1","doc":"Returns a post-batch callback (i.e. the third argument to batch/3)\nfor a key which calls get() with the callback param and the key","ref":"Bonfire.API.GraphQL.Pages.html#getter/1"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.new/4","doc":"Create a new pages from a data map, counts map, cursor function and page opts","ref":"Bonfire.API.GraphQL.Pages.html#new/4"},{"type":"function","title":"Bonfire.API.GraphQL.Pages.new/5","doc":"Create a new Pages from some data rows, count rows and a\ngrouping key. Groups the data by the grouping key on insertion and\nturns the counts into a map ready for lookup on a per-row basis.\n\nNote: if the grouping key is not present in the returned data rows,\nthis function will crash. Our intuition is that this would mean an\nerror in the calling code, so we would rather raise it early.","ref":"Bonfire.API.GraphQL.Pages.html#new/5"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.counts/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:counts/0"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.data/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:data/0"},{"type":"type","title":"Bonfire.API.GraphQL.Pages.t/0","doc":"","ref":"Bonfire.API.GraphQL.Pages.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.Pagination","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.connection_paginate/3","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#connection_paginate/3"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.page/7","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#page/7"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.page_all/7","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#page_all/7"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.pages/8","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#pages/8"},{"type":"function","title":"Bonfire.API.GraphQL.Pagination.pagination_args_filter/1","doc":"","ref":"Bonfire.API.GraphQL.Pagination.html#pagination_args_filter/1"},{"type":"module","title":"Bonfire.API.GraphQL.PlugPipelines","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html"},{"type":"function","title":"Bonfire.API.GraphQL.PlugPipelines.default_pipeline/2","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html#default_pipeline/2"},{"type":"function","title":"Bonfire.API.GraphQL.PlugPipelines.run/2","doc":"","ref":"Bonfire.API.GraphQL.PlugPipelines.html#run/2"},{"type":"module","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext","doc":"GraphQL Plug to add current user to the context","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html"},{"type":"function","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext.call/2","doc":"","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html#call/2"},{"type":"function","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext.init/1","doc":"","ref":"Bonfire.API.GraphQL.Plugs.GraphQLContext.html#init/1"},{"type":"module","title":"Bonfire.API.GraphQL.QueryHelper","doc":"Helpful functions for preparing to query or test Absinthe applications.\n\nThese functions make it trivially easy to generate very large, comprehensive queries for our types in Absinthe that will resolve every field in that type (and any number of subtypes as well to a given level of depth)\n\nAdapted from https://github.com/devonestes/assertions (MIT license)","ref":"Bonfire.API.GraphQL.QueryHelper.html"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.apply_overrides/2","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#apply_overrides/2"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.camelize/1","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#camelize/1"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.do_format_fields/3","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#do_format_fields/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.document_for/4","doc":"Returns a document containing the fields in a type and any sub-types down to a limited depth of\nnesting (default `3`).\n\nThis is helpful for generating a document to use for testing your GraphQL API. This function\nwill always return all fields in the given type, ensuring that there aren't any accidental\nfields with resolver functions that aren't tested in at least some fashion.","ref":"Bonfire.API.GraphQL.QueryHelper.html#document_for/4"},{"type":"function","title":"Example - Bonfire.API.GraphQL.QueryHelper.document_for/4","doc":"iex> document_for(:user, 2)\n\n ```\n name\n age\n posts {\n title\n subtitle\n }\n comments {\n body\n }\n ```","ref":"Bonfire.API.GraphQL.QueryHelper.html#document_for/4-example"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.fields_for/3","doc":"Returns all fields in a type and any sub-types down to a limited depth of nesting (default `3`).\n\nThis is helpful for converting a struct or map into an expected response that is a bare map\nand which can be used in some of the other assertions below.","ref":"Bonfire.API.GraphQL.QueryHelper.html#fields_for/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.format_fields/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#format_fields/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.get_fields/3","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#get_fields/3"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.maybe_debug_api/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#maybe_debug_api/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.padding/1","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#padding/1"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.query_with_id/4","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#query_with_id/4"},{"type":"function","title":"Bonfire.API.GraphQL.QueryHelper.run_query_id/6","doc":"","ref":"Bonfire.API.GraphQL.QueryHelper.html#run_query_id/6"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveField","doc":"Encapsulates the flow for resolving a field in the absence of\nmultiple parents.","ref":"Bonfire.API.GraphQL.ResolveField.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveField.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveField.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveFields","doc":"Encapsulates the flow for resolving a field for potentially multiple\nparents.","ref":"Bonfire.API.GraphQL.ResolveFields.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveFields.default_getter/2","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#default_getter/2"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveFields.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#run/1"},{"type":"type","title":"Bonfire.API.GraphQL.ResolveFields.getter/0","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#t:getter/0"},{"type":"type","title":"Bonfire.API.GraphQL.ResolveFields.t/0","doc":"","ref":"Bonfire.API.GraphQL.ResolveFields.html#t:t/0"},{"type":"module","title":"Bonfire.API.GraphQL.ResolvePage","doc":"Encapsulates the flow of resolving a page in the presence of a\nsingle parent. We also currently use this as a stopgap while we\nfinish implementing some things, trading speed for correctness.","ref":"Bonfire.API.GraphQL.ResolvePage.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolvePage.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolvePage.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolvePages","doc":"Encapsulates the flow of resolving a page in the presence of a\nsingle parent. We also currently use this as a stopgap while we\nfinish implementing some things, trading speed for correctness.","ref":"Bonfire.API.GraphQL.ResolvePages.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolvePages.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolvePages.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.ResolveRootPage","doc":"Encapsulates the flow of resolving a page in the absence of parents.","ref":"Bonfire.API.GraphQL.ResolveRootPage.html"},{"type":"function","title":"Bonfire.API.GraphQL.ResolveRootPage.run/1","doc":"","ref":"Bonfire.API.GraphQL.ResolveRootPage.html#run/1"},{"type":"module","title":"Bonfire.API.GraphQL.RestAdapter","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.endpoint/3","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#endpoint/3"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.error_fn/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#error_fn/2"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.return/4","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#return/4"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.success_fn/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#success_fn/2"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.transform_data/1","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#transform_data/1"},{"type":"function","title":"Bonfire.API.GraphQL.RestAdapter.transform_data/2","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.html#transform_data/2"},{"type":"module","title":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","doc":"","ref":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig.html"},{"type":"module","title":"Bonfire.API.GraphQL.Router","doc":"","ref":"Bonfire.API.GraphQL.Router.html"},{"type":"module","title":"Bonfire.API.GraphQL.SchemaPipelines","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaPipelines.pipeline/1","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html#pipeline/1"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaPipelines.run/2","doc":"","ref":"Bonfire.API.GraphQL.SchemaPipelines.html#run/2"},{"type":"module","title":"Bonfire.API.GraphQL.SchemaUtils","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaUtils.context_types/0","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html#context_types/0"},{"type":"function","title":"Bonfire.API.GraphQL.SchemaUtils.hydrations_merge/1","doc":"","ref":"Bonfire.API.GraphQL.SchemaUtils.html#hydrations_merge/1"},{"type":"module","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_binary/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_binary/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_boolean/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_boolean/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_created_at/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_created_at/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_cursor/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_cursor/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_cursors/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_cursors/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_datetime/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_datetime/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_datetime/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_datetime/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_display_username/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_display_username/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_email/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_email/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_eq/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_eq/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_field/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_field/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_float/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_float/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_int/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_int/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_invalid_credential/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_invalid_credential/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/0","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/0"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_list/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_list/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_location/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_location/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/4","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/4"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_maps_eq/5","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_maps_eq/5"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_non_neg/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_non_neg/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_found/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_found/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_logged_in/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_logged_in/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_not_permitted/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_not_permitted/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_object/4","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_object/4"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_optional/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_optional/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_optional_field/3","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_optional_field/3"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/0","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/0"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page/6","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page/6"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_page_info/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_page_info/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_pos/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_pos/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_ulid/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_ulid/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_updated_at/2","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_updated_at/2"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_url/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_url/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_username/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_username/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.assert_uuid/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#assert_uuid/1"},{"type":"function","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions.uncamel_map/1","doc":"","ref":"Bonfire.API.GraphQL.Test.GraphQLAssertions.html#uncamel_map/1"},{"type":"module","title":"Bonfire.API.GraphQL.UserSocket","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.build_context_from_params/2","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#build_context_from_params/2"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.connect/2","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#connect/2"},{"type":"function","title":"Bonfire.API.GraphQL.UserSocket.id/1","doc":"","ref":"Bonfire.API.GraphQL.UserSocket.html#id/1"},{"type":"module","title":"Bonfire.Boundaries","doc":"Bonfire's boundaries framework provides a flexible way to control user access to specific actions and data. It ensures that users can only see and do what they're authorized to.\n\nYou can create custom groups of contacts (circles) and grant them specific permissions to interact with you and your content. They can help you take control of your online presence and ensure that your data is shared only with the people you want.\n\n> Boundaries are limits that you set for yourself or others to define what you're comfortable with.\n> These limits can be physical, like curtains or doors; digital, like sharing settings on social media; in writing, like codes of conduct; emotional, like feeling comfortable to take time for self-care; or mental, like choosing what you pay attention to. In Bonfire, boundaries can help limit the type of interactions that others may have with you or things you post.\n> Boundaries are important because they help you protect yourself, maintain your autonomy, and communicate your needs and expectations clearly.","ref":"Bonfire.Boundaries.html"},{"type":"module","title":"Glossary - Bonfire.Boundaries","doc":"| Term | Definition |\n| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **Subject** or **User** | An individual who interacts with the system. |\n| **[Circle](Bonfire.Boundaries.Circles.html)** | A categorization method for users, allowing users to group other users (e.g., colleagues, friends). |\n| **[Verb](Bonfire.Boundaries.Verbs.html)** | An action that a user can perform (e.g., read, reply). |\n| **Permission** | A value indicating whether an action is allowed (`true`), denied (`false`), or `nil`. |\n| **[Grant](Bonfire.Boundaries.Grants.html)** | Links a user or circle with a verb and permission. |\n| **[ACL](Bonfire.Boundaries.Acls.html)** | Access Control List, a collection of grants. Also called \"boundary\" or \"boundary preset\" in the app. |\n| **[Controlled](Bonfire.Boundaries.Controlleds.html)** | Links an object to one or more ACLs, to determine access based on the grants. |\n| **[Role](Bonfire.Boundaries.Roles.html)** | A group of verbs linked to a permission. |","ref":"Bonfire.Boundaries.html#module-glossary"},{"type":"module","title":"Users and Circles - Bonfire.Boundaries","doc":"Circles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.","ref":"Bonfire.Boundaries.html#module-users-and-circles"},{"type":"module","title":"Verbs - Bonfire.Boundaries","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.","ref":"Bonfire.Boundaries.html#module-verbs"},{"type":"module","title":"Permissions - Bonfire.Boundaries","doc":"A permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n- `true`: yes, the action is allowed\n- `false`: no, the action is explicitly denied (i.e. never permit)\n- `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed)","ref":"Bonfire.Boundaries.html#module-permissions"},{"type":"module","title":"Grants - Bonfire.Boundaries","doc":"A `Grant` links a `subject` (user or circle) with a `Verb` and a permission. It defines the access rights for a specific user or circle in relation to a particular action.","ref":"Bonfire.Boundaries.html#module-grants"},{"type":"module","title":"ACLs - Bonfire.Boundaries","doc":"An `Acl` is a list of `Grant`s used to define access permissions for objects.\n\nBecause a user could be in more than one circle and each circle may have a different permission, when a user attempts an action on an object, the system combines all relevant grants to determine the final permission. This combination prioritizes permissions as follows: `false > true > nil`, resulting in:\n\n| input | input | result |\n| :------ | :------ | :------ |\n| `nil` | `nil` | `nil` |\n| `nil` | `true` | `true` |\n| `nil` | `false` | `false` |\n| `true` | `nil` | `true` |\n| `true` | `true` | `true` |\n| `true` | `false` | `false` |\n| `false` | `nil` | `false` |\n| `false` | `true` | `false` |\n| `false` | `false` | `false` |\n\nIn simpler terms, a final permission is granted only if the combined result is `true`. Think of it as requiring an explicit \"yes\" for permission, while \"no\" always takes precedence. Notably, `nil` acts as a sort of \"weak no,\" it can be overridden by a `true` but not granting access on its own. This approach provides flexibility for implementing features like user blocking (`false` is crucial here).\n\nFor efficiency, `nil` is the assumed default and not stored in the database.","ref":"Bonfire.Boundaries.html#module-acls"},{"type":"module","title":"Controlled - Applying boundaries to an object - Bonfire.Boundaries","doc":"The `Controlled` [multimixin](./DATABASE.md#multimixins) link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described above.","ref":"Bonfire.Boundaries.html#module-controlled-applying-boundaries-to-an-object"},{"type":"module","title":"Roles - Bonfire.Boundaries","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.","ref":"Bonfire.Boundaries.html#module-roles"},{"type":"module","title":"Practical example: Surprise birthday party - Bonfire.Boundaries","doc":"Let's illustrate how boundaries work with a real-world example: planning a surprise party without the birthday girl finding out.","ref":"Bonfire.Boundaries.html#module-practical-example-surprise-birthday-party"},{"type":"module","title":"1. Setting up users - Bonfire.Boundaries","doc":"```elixir\niex> import Bonfire.Me.Fake\niex> organizer = fake_user!()\niex> birthday_girl = fake_user!()\niex> friends = [fake_user!(), fake_user!()]\niex> family = [fake_user!(), fake_user!()]\n```","ref":"Bonfire.Boundaries.html#module-1-setting-up-users"},{"type":"module","title":"2. Define your Circles - Bonfire.Boundaries","doc":"Organize users into relevant circles (friends and family).\n\n```elixir\niex> alias Bonfire.Boundaries.Circles\niex> {:ok, friends_circle} = Circles.create(organizer, %{named: %{name: \"friends\"}})\niex> Circles.add_to_circles(friends, friends_circle)\niex> Circles.is_encircled_by?(List.first(friends), friends_circle)\ntrue\niex> {:ok, family_circle} = Circles.create(organizer, %{named: %{name: \"family\"}})\niex> Circles.add_to_circles(family, family_circle)\n```","ref":"Bonfire.Boundaries.html#module-2-define-your-circles"},{"type":"module","title":"3. Create the ACL (boundary preset) - Bonfire.Boundaries","doc":"This boundary will control access to the surprise party plans.\n\n```elixir\niex> alias Bonfire.Boundaries.Acls\niex> {:ok, boundary} = Acls.simple_create(organizer, \"Surprise party\")\n```","ref":"Bonfire.Boundaries.html#module-3-create-the-acl-boundary-preset"},{"type":"module","title":"4. Grant permissions - Bonfire.Boundaries","doc":"Allow friends to discover, read, and respond to party plans, while family members can also edit details and send invitations.\n\n```elixir\niex> alias Bonfire.Boundaries.Grants\niex> Grants.grant(friends_circle.id, boundary.id, [:see, :read, :reply], true, current_user: organizer)\niex> Grants.grant(family_circle.id, boundary.id, [:see, :read, :reply, :edit, :invite], true, current_user: organizer)\n```\n\nPrevent the birthday person from accessing any party information.\n\n```elixir\niex> Grants.grant(birthday_girl.id, boundary.id, [:see, :read], false, current_user: organizer)\n```","ref":"Bonfire.Boundaries.html#module-4-grant-permissions"},{"type":"module","title":"5. Post about the party - Bonfire.Boundaries","doc":"```elixir\niex> alias Bonfire.Posts\niex> {:ok, party_plan} = Posts.publish(\n current_user: organizer,\n boundary: boundary.id,\n post_attrs: %{post_content: %{name: \"Surprise party!\"}})\n```","ref":"Bonfire.Boundaries.html#module-5-post-about-the-party"},{"type":"module","title":"6. Double-check applied boundaries - Bonfire.Boundaries","doc":"```elixir\niex> Boundaries.can?(List.first(friends).id, :read, party_plan.id)\ntrue\niex> Boundaries.can?(List.first(family).id, :invite, party_plan.id)\ntrue\niex> Boundaries.can?(birthday_girl.id, :see, party_plan.id)\nfalse\niex> Boundaries.load_pointer(party_plan.id, current_user: birthday_girl)\nnil\n```\n\nBy following these steps, the organizer can effectively manage access to ensure the birthday girl cannot see the party plans, while friends and family can.","ref":"Bonfire.Boundaries.html#module-6-double-check-applied-boundaries"},{"type":"module","title":"Copyright and License - Bonfire.Boundaries","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Boundaries.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Boundaries.acls_from_preset_boundary_names/1","doc":"Returns ACLs for a set of preset boundary names.","ref":"Bonfire.Boundaries.html#acls_from_preset_boundary_names/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.acls_from_preset_boundary_names/1","doc":"iex> Bonfire.Boundaries.acls_from_preset_boundary_names([\"public\"])","ref":"Bonfire.Boundaries.html#acls_from_preset_boundary_names/1-examples"},{"type":"function","title":"Bonfire.Boundaries.boundaries_normalise/1","doc":"Normalizes boundaries represented as text or list.","ref":"Bonfire.Boundaries.html#boundaries_normalise/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.boundaries_normalise/1","doc":"iex> Bonfire.Boundaries.boundaries_normalise(\"local,public\")\n [\"local\", \"public\"]\n\n iex> Bonfire.Boundaries.boundaries_normalise([\"local\", \"public\"])\n [\"local\", \"public\"]","ref":"Bonfire.Boundaries.html#boundaries_normalise/1-examples"},{"type":"function","title":"Bonfire.Boundaries.boundaries_or_default/2","doc":"Returns custom boundaries or a default set of boundaries to use","ref":"Bonfire.Boundaries.html#boundaries_or_default/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.boundaries_or_default/2","doc":"iex> Bonfire.Boundaries.boundaries_or_default([\"local\"])\n [\"local\"]\n\n iex> Bonfire.Boundaries.boundaries_or_default(nil, current_user: me)\n [{\"public\", \"Public\"}]","ref":"Bonfire.Boundaries.html#boundaries_or_default/2-examples"},{"type":"function","title":"Bonfire.Boundaries.can?/4","doc":"Checks if a subject has permission to conduct the specified action(s)/verb(s) on an object.","ref":"Bonfire.Boundaries.html#can?/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.can?/4","doc":"iex> Bonfire.Boundaries.can?(%User{id: 1}, [:see], %{id: 2})\n false","ref":"Bonfire.Boundaries.html#can?/4-examples"},{"type":"function","title":"Bonfire.Boundaries.default_boundaries/1","doc":"Returns default boundaries to use based on the provided context.","ref":"Bonfire.Boundaries.html#default_boundaries/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.default_boundaries/1","doc":"iex> Bonfire.Boundaries.default_boundaries()\n [{\"public\", \"Public\"}]\n\n iex> Bonfire.Boundaries.default_boundaries(current_user: me)\n [{\"local\", \"Local\"}]","ref":"Bonfire.Boundaries.html#default_boundaries/1-examples"},{"type":"function","title":"Bonfire.Boundaries.find_caretaker_stereotype/3","doc":"Finds a caretaker stereotype based on the specified caretaker and stereotype IDs.","ref":"Bonfire.Boundaries.html#find_caretaker_stereotype/3"},{"type":"function","title":"Bonfire.Boundaries.find_caretaker_stereotypes/3","doc":"Finds caretaker stereotypes based on the specified caretaker and stereotype IDs.","ref":"Bonfire.Boundaries.html#find_caretaker_stereotypes/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.find_caretaker_stereotypes/3","doc":"iex> Bonfire.Boundaries.find_caretaker_stereotypes(%User{id: 1}, [%{id: 2}])\n [%Needle.Pointer{id: 1}]","ref":"Bonfire.Boundaries.html#find_caretaker_stereotypes/3-examples"},{"type":"function","title":"Bonfire.Boundaries.list_grants_on/1","doc":"Lists grants for a given set of objects.","ref":"Bonfire.Boundaries.html#list_grants_on/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_grants_on/1","doc":"iex> Bonfire.Boundaries.list_grants_on([1, 2, 3])","ref":"Bonfire.Boundaries.html#list_grants_on/1-examples"},{"type":"function","title":"Bonfire.Boundaries.list_grants_on/2","doc":"Lists grants for a given set of objects and verbs.","ref":"Bonfire.Boundaries.html#list_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_grants_on/2","doc":"iex> Bonfire.Boundaries.list_grants_on([1, 2, 3], [:see, :read])","ref":"Bonfire.Boundaries.html#list_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.list_object_acls/2","doc":"Lists ACLs for a given object.","ref":"Bonfire.Boundaries.html#list_object_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.list_object_acls/2","doc":"iex> Bonfire.Boundaries.list_object_acls(%{id: 1})\n [%Bonfire.Data.AccessControl.Acl{id: 42}]","ref":"Bonfire.Boundaries.html#list_object_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.list_object_boundaries/2","doc":"Lists boundaries (ACLs and grants) for a given object \n\n iex> Bonfire.Boundaries.list_object_boundaries(%{id: 1})\n [%Bonfire.Data.AccessControl.Acl{id: 42, grants: [...]}]","ref":"Bonfire.Boundaries.html#list_object_boundaries/2"},{"type":"function","title":"Bonfire.Boundaries.load_pointer/2","doc":"Loads a pointer based on the permissions which are checked based on provided options.","ref":"Bonfire.Boundaries.html#load_pointer/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.load_pointer/2","doc":"iex> Bonfire.Boundaries.load_pointer(%{id: 1}, verbs: [:read], current_user: %{id: 2})\n %Needle.Pointer{id: 1}","ref":"Bonfire.Boundaries.html#load_pointer/2-examples"},{"type":"function","title":"Bonfire.Boundaries.load_pointers/2","doc":"Loads pointers based on boundaries (which are checked based on provided options) and returns a list of permitted pointers.","ref":"Bonfire.Boundaries.html#load_pointers/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.load_pointers/2","doc":"iex> Bonfire.Boundaries.load_pointers([%{id: 1}], verbs: [:read], current_user: %{id: 2})\n [%Needle.Pointer{id: 1}]","ref":"Bonfire.Boundaries.html#load_pointers/2-examples"},{"type":"function","title":"Bonfire.Boundaries.load_pointers!/2","doc":"Loads pointers based on boundaries (which are checked based on provided options) and raises an error if not all pointers are permitted.","ref":"Bonfire.Boundaries.html#load_pointers!/2"},{"type":"function","title":"Bonfire.Boundaries.pointer_permitted?/2","doc":"Checks if a pointer has permission based on the specified options.","ref":"Bonfire.Boundaries.html#pointer_permitted?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.pointer_permitted?/2","doc":"iex> Bonfire.Boundaries.pointer_permitted?(%{id: 1}, verbs: [:edit], current_user: %{id: 2})\n true","ref":"Bonfire.Boundaries.html#pointer_permitted?/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_boundary_from_acl/2","doc":"Converts an ACL to a preset boundary name based on the object type.","ref":"Bonfire.Boundaries.html#preset_boundary_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_boundary_from_acl/2","doc":"iex> Bonfire.Boundaries.preset_boundary_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1})\n {\"public\", \"Public\"}","ref":"Bonfire.Boundaries.html#preset_boundary_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_boundary_tuple_from_acl/2","doc":"Converts an ACL to a preset boundary tuple based on the object type.","ref":"Bonfire.Boundaries.html#preset_boundary_tuple_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_boundary_tuple_from_acl/2","doc":"iex> Bonfire.Boundaries.preset_boundary_tuple_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1})\n {\"public\", \"Public\"}\n\n iex> Bonfire.Boundaries.preset_boundary_tuple_from_acl(%Bonfire.Data.AccessControl.Acl{id: 1}, :group)\n {\"open\", \"Open\"}","ref":"Bonfire.Boundaries.html#preset_boundary_tuple_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.preset_name/2","doc":"Returns the name of a preset boundary given a list of boundaries or other boundary representation.","ref":"Bonfire.Boundaries.html#preset_name/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.preset_name/2","doc":"iex> Bonfire.Boundaries.preset_name([\"admins\", \"mentions\"])\n \"admins\"\n\n iex> Bonfire.Boundaries.preset_name(\"public_remote\", true)\n \"public_remote\"","ref":"Bonfire.Boundaries.html#preset_name/2-examples"},{"type":"function","title":"Bonfire.Boundaries.set_boundaries/3","doc":"Sets or replace boundaries for a given object.","ref":"Bonfire.Boundaries.html#set_boundaries/3"},{"type":"function","title":"Set boundaries on a black object - Bonfire.Boundaries.set_boundaries/3","doc":"iex> Bonfire.Boundaries.set_boundaries(%User{id: 1}, %{id: 2}, [boundary: \"public\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.html#set_boundaries/3-set-boundaries-on-a-black-object"},{"type":"function","title":"Replace boundaries on an existing object that previously had a preset applied - Bonfire.Boundaries.set_boundaries/3","doc":"iex> Bonfire.Boundaries.set_boundaries(%User{id: 1}, %{id: 2}, [boundary: \"local\", remove_previous_preset: \"public\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.html#set_boundaries/3-replace-boundaries-on-an-existing-object-that-previously-had-a-preset-applied"},{"type":"function","title":"Bonfire.Boundaries.take_care_of!/2","doc":"Assigns the user as the caretaker of the given object or objects, replacing the existing caretaker, if any.","ref":"Bonfire.Boundaries.html#take_care_of!/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.take_care_of!/2","doc":"iex> Bonfire.Boundaries.take_care_of!([%{id: 1}], %{id: 2})\n [%{id: 1, caretaker: %{id: 1, caretaker_id: 2, caretaker: %{id: 2}}}]","ref":"Bonfire.Boundaries.html#take_care_of!/2-examples"},{"type":"function","title":"Bonfire.Boundaries.user_default_boundaries/0","doc":"Returns the default boundaries to be set for new users from config.","ref":"Bonfire.Boundaries.html#user_default_boundaries/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.user_default_boundaries/0","doc":"iex> Bonfire.Boundaries.user_default_boundaries()\n [{\"public\", \"Public\"}]","ref":"Bonfire.Boundaries.html#user_default_boundaries/0-examples"},{"type":"function","title":"Bonfire.Boundaries.users_grants_on/2","doc":"Lists grants for a given set of users on a set of objects.","ref":"Bonfire.Boundaries.html#users_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.users_grants_on/2","doc":"iex> Bonfire.Boundaries.users_grants_on([%{id: 1}], [%{id: 2}])","ref":"Bonfire.Boundaries.html#users_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.users_grants_on/3","doc":"Lists grants for a given set of users on a set of objects, filtered by verbs.","ref":"Bonfire.Boundaries.html#users_grants_on/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.users_grants_on/3","doc":"iex> Bonfire.Boundaries.users_grants_on([%{id: 1}], [%{id: 2}], [:see, :read])\n [%Bonfire.Boundaries.Summary{object_id: 2, subject_id: 1}]","ref":"Bonfire.Boundaries.html#users_grants_on/3-examples"},{"type":"module","title":"Bonfire.Boundaries.Acls","doc":"Provides functionality for managing Access Control Lists (ACLs) in the Bonfire system.\n\nAn `Acl` is a list of `Grant`s used to define access permissions for objects. It represents fully populated access control rules that can be reused. It can be used to secure multiple objects and exists independently of any object.\n\n> ACLs (also referred to as \"preset boundaries\") enable you to make a list of circles and users and then grant specific roles or permissions to each of those. For example, you might create a \"Fitness\" ACL and grant the \"Participate\" role to your gym buddies, allowing them to interact with your fitness-related content, while granting the \"Interact\" role to your family and friends, who can view and react to your posts but not comment on them.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Acl` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Acls.html"},{"type":"function","title":"Bonfire.Boundaries.Acls.acl_grants_to_tuples/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#acl_grants_to_tuples/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.acl_id/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#acl_id/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.acls/0","doc":"Returns a list of special built-in ACLs (e.g., guest, local, activity_pub).","ref":"Bonfire.Boundaries.Acls.html#acls/0"},{"type":"function","title":"Bonfire.Boundaries.Acls.acls_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#acls_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.base_acls_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#base_acls_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.built_in_ids/0","doc":"Returns a list of built-in ACL IDs.","ref":"Bonfire.Boundaries.Acls.html#built_in_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.built_in_ids/0","doc":"iex> Bonfire.Boundaries.Acls.built_in_ids()\n [\"BUILT_IN_ACL_ID1\", \"BUILT_IN_ACL_ID2\"]","ref":"Bonfire.Boundaries.Acls.html#built_in_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.cast/3","doc":"Casts ACLs (existing ones or creating some on-the-fly) and Controlled on an object.","ref":"Bonfire.Boundaries.Acls.html#cast/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.cast/3","doc":"iex> Bonfire.Boundaries.Acls.cast(changeset, creator, [boundary: \"local\"])","ref":"Bonfire.Boundaries.Acls.html#cast/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.changeset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#changeset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.create/2","doc":"Creates a new ACL.","ref":"Bonfire.Boundaries.Acls.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.create/2","doc":"iex> Bonfire.Boundaries.Acls.create(%{named: %{name: \"New ACL\"}}, current_user: user)\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.default_exclude_ids/1","doc":"Returns a list of default IDs to exclude from queries.","ref":"Bonfire.Boundaries.Acls.html#default_exclude_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.default_exclude_ids/1","doc":"iex> Bonfire.Boundaries.Acls.default_exclude_ids()\n [\"2HEYS11ENCEDMES0CAN0TSEEME\", \"7HECVST0MAC1F0RAN0BJECTETC\", \"71MAYADM1N1STERMY0WNSTVFFS\", \"0H0STEDCANTSEE0RD0ANYTH1NG\", \"1S11ENCEDTHEMS0CAN0TP1NGME\"]","ref":"Bonfire.Boundaries.Acls.html#default_exclude_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.delete/2","doc":"Fully delete the ACL, including permissions/grants and controlled information. This will affect all objects previously shared with this ACL.","ref":"Bonfire.Boundaries.Acls.html#delete/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.edit/3","doc":"Edits an existing ACL.","ref":"Bonfire.Boundaries.Acls.html#edit/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.edit/3","doc":"iex> Bonfire.Boundaries.Acls.edit(acl_id, user, %{name: \"Updated ACL\"})\n\n iex> Bonfire.Boundaries.Acls.edit(%Acl{}, user, %{name: \"Updated ACL\"})","ref":"Bonfire.Boundaries.Acls.html#edit/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.exclude_stereotypes/1","doc":"Returns a list of stereotype IDs to exclude from queries.","ref":"Bonfire.Boundaries.Acls.html#exclude_stereotypes/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.exclude_stereotypes/1","doc":"iex> Bonfire.Boundaries.Acls.exclude_stereotypes()\n [\"2HEYS11ENCEDMES0CAN0TSEEME\", \"7HECVST0MAC1F0RAN0BJECTETC\"]\n\n iex> Bonfire.Boundaries.Acls.exclude_stereotypes(false)\n [\"2HEYS11ENCEDMES0CAN0TSEEME\"]","ref":"Bonfire.Boundaries.Acls.html#exclude_stereotypes/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get/1","doc":"Retrieves an ACL by its slug.","ref":"Bonfire.Boundaries.Acls.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get/1","doc":"iex> Bonfire.Boundaries.Acls.get(:instance_care)\n\n iex> Bonfire.Boundaries.Acls.get(:non_existent)\n nil","ref":"Bonfire.Boundaries.Acls.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get!/1","doc":"Retrieves an ACL by its slug, raising an error if not found.","ref":"Bonfire.Boundaries.Acls.html#get!/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_for_caretaker/3","doc":"Retrieves an ACL for a caretaker.","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get_for_caretaker/3","doc":"iex> Bonfire.Boundaries.Acls.get_for_caretaker(\"ACL_ID\", user)\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_for_caretaker_q/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_for_caretaker_q/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_id/1","doc":"Retrieves an ACL ID by its slug.","ref":"Bonfire.Boundaries.Acls.html#get_id/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.get_id/1","doc":"iex> Bonfire.Boundaries.Acls.get_id(:instance_care)\n \"01SETT1NGSF0R10CA11NSTANCE\"\n\n iex> Bonfire.Boundaries.Acls.get_id(:non_existent)\n nil","ref":"Bonfire.Boundaries.Acls.html#get_id/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_id!/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_id!/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_object_custom_acl/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_object_custom_acl/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.get_or_create_object_custom_acl/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#get_or_create_object_custom_acl/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.grant_tuples_from_preset/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#grant_tuples_from_preset/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_built_in?/1","doc":"Checks if an ACL is built-in.","ref":"Bonfire.Boundaries.Acls.html#is_built_in?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_built_in?/1","doc":"iex> Bonfire.Boundaries.Acls.is_built_in?(\"BUILT_IN_ACL_ID\")\n true\n\n iex> Bonfire.Boundaries.Acls.is_built_in?(\"CUSTOM_ACL_ID\")\n false","ref":"Bonfire.Boundaries.Acls.html#is_built_in?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_object_custom?/1","doc":"Checks if an ACL is a custom ACL for an object.","ref":"Bonfire.Boundaries.Acls.html#is_object_custom?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_object_custom?/1","doc":"iex> Bonfire.Boundaries.Acls.is_object_custom?(%Acl{stereotyped: %{stereotype_id: \"CUSTOM_ACL_ID\"}})\n true\n\n iex> Bonfire.Boundaries.Acls.is_object_custom?(%Acl{})\n false","ref":"Bonfire.Boundaries.Acls.html#is_object_custom?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_stereotype?/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#is_stereotype?/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.is_stereotyped?/1","doc":"Checks if an ACL is stereotyped.","ref":"Bonfire.Boundaries.Acls.html#is_stereotyped?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.is_stereotyped?/1","doc":"iex> Bonfire.Boundaries.Acls.is_stereotyped?(%Acl{stereotyped: %{stereotype_id: \"STEREOTYPE_ID\"}})\n true\n\n iex> Bonfire.Boundaries.Acls.is_stereotyped?(\"STEREOTYPE_ID\")\n true\n\n iex> Bonfire.Boundaries.Acls.is_stereotyped?(%Acl{})\n false","ref":"Bonfire.Boundaries.Acls.html#is_stereotyped?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list/1","doc":"Lists ACLs the current user is permitted to see.","ref":"Bonfire.Boundaries.Acls.html#list/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list/1","doc":"iex> Bonfire.Boundaries.Acls.list(current_user: user)\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_built_ins/1","doc":"Lists built-in ACLs.","ref":"Bonfire.Boundaries.Acls.html#list_built_ins/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_built_ins/1","doc":"iex> Bonfire.Boundaries.Acls.list_built_ins()\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list_built_ins/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my/2","doc":"Lists ACLs for a specific user.\n\nIncludes the ACLs we are the registered caretakers of that we are\npermitted to see. If any are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Acls.html#list_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_my/2","doc":"iex> Bonfire.Boundaries.Acls.list_my(user)\n [%Acl{}, %Acl{}]","ref":"Bonfire.Boundaries.Acls.html#list_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my_q/2","doc":"query for `list_my`","ref":"Bonfire.Boundaries.Acls.html#list_my_q/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_my_with_counts/2","doc":"Lists ACLs for a specific user with grant counts (how many rules ).","ref":"Bonfire.Boundaries.Acls.html#list_my_with_counts/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.list_my_with_counts/2","doc":"iex> Bonfire.Boundaries.Acls.list_my_with_counts(user)\n [%{acl: %Acl{}, grants_count: 5}, %{acl: %Acl{}, grants_count: 2}]","ref":"Bonfire.Boundaries.Acls.html#list_my_with_counts/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.list_q/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.maybe_by_ids/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#maybe_by_ids/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.maybe_search/2","doc":"","ref":"Bonfire.Boundaries.Acls.html#maybe_search/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.opts_for_dropdown/0","doc":"Returns options to use when querying for ACLs to show in a dropdown in the UI.","ref":"Bonfire.Boundaries.Acls.html#opts_for_dropdown/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.opts_for_dropdown/0","doc":"iex> Bonfire.Boundaries.Acls.opts_for_dropdown()\n [exclude_ids: [...], extra_ids_to_include: [...]]","ref":"Bonfire.Boundaries.Acls.html#opts_for_dropdown/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.opts_for_list/0","doc":"Returns options to use when querying for ACLs to show in a list.","ref":"Bonfire.Boundaries.Acls.html#opts_for_list/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.opts_for_list/0","doc":"iex> Bonfire.Boundaries.Acls.opts_for_list()\n [exclude_ids: [...]]","ref":"Bonfire.Boundaries.Acls.html#opts_for_list/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.prepare_cast/3","doc":"","ref":"Bonfire.Boundaries.Acls.html#prepare_cast/3"},{"type":"function","title":"Bonfire.Boundaries.Acls.preset_acl_ids/0","doc":"","ref":"Bonfire.Boundaries.Acls.html#preset_acl_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Acls.preset_acl_ids/2","doc":"Returns a list of ACL IDs for a preset (eg. \"local\" and \"public\").","ref":"Bonfire.Boundaries.Acls.html#preset_acl_ids/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.preview/2","doc":"Previews ACLs as they would be set based on provided opts.","ref":"Bonfire.Boundaries.Acls.html#preview/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.preview/2","doc":"iex> Bonfire.Boundaries.Acls.preview(creator, [\n preview_for_id: object_id,\n boundary: \"mentions\",\n to_circles: mentioned_users_or_custom_circles\n ])\n\n iex> Bonfire.Boundaries.Acls.preview(creator, [\n preview_for_id: object_id,\n boundary: \"clone_context\",\n context_id: context_object_id\n ])","ref":"Bonfire.Boundaries.Acls.html#preview/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.remote_public_acl_ids/0","doc":"Returns a list of ACL IDs for remote public access.","ref":"Bonfire.Boundaries.Acls.html#remote_public_acl_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.remote_public_acl_ids/0","doc":"iex> Bonfire.Boundaries.Acls.remote_public_acl_ids()\n [\"5REM0TEPE0P1E1NTERACTREACT\", \"5REM0TEPE0P1E1NTERACTREP1Y\", \"7REM0TEACT0RSCANC0NTR1BVTE\"]","ref":"Bonfire.Boundaries.Acls.html#remote_public_acl_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.set/3","doc":"Sets ACLs (existing ones or creating some on-the-fly) and Controlled on an object.","ref":"Bonfire.Boundaries.Acls.html#set/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.set/3","doc":"iex> Bonfire.Boundaries.Acls.set(%{}, creator, [boundary: \"local\"])\n {:ok, :granted}","ref":"Bonfire.Boundaries.Acls.html#set/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.simple_create/2","doc":"Creates a simple ACL with a name.","ref":"Bonfire.Boundaries.Acls.html#simple_create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.simple_create/2","doc":"iex> Bonfire.Boundaries.Acls.simple_create(user, \"My ACL\")\n {:ok, %Acl{}}","ref":"Bonfire.Boundaries.Acls.html#simple_create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.soft_delete/2","doc":"Soft-delete the ACL, meaning it will not be displayed anymore, but permissions/grants and controlled information will be preserved. This will not affect objects previously shared with this ACL.","ref":"Bonfire.Boundaries.Acls.html#soft_delete/2"},{"type":"function","title":"Bonfire.Boundaries.Acls.stereotype_ids/0","doc":"Returns a list of stereotype ACL IDs.","ref":"Bonfire.Boundaries.Acls.html#stereotype_ids/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Acls.stereotype_ids/0","doc":"iex> Bonfire.Boundaries.Acls.stereotype_ids()\n [\"STEREOTYPE_ACL_ID1\", \"STEREOTYPE_ACL_ID2\"]","ref":"Bonfire.Boundaries.Acls.html#stereotype_ids/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Acls.user_default_acl/1","doc":"","ref":"Bonfire.Boundaries.Acls.html#user_default_acl/1"},{"type":"function","title":"Bonfire.Boundaries.Acls.user_default_acls/0","doc":"","ref":"Bonfire.Boundaries.Acls.html#user_default_acls/0"},{"type":"module","title":"Bonfire.Boundaries.Acts.SetBoundaries","doc":"","ref":"Bonfire.Boundaries.Acts.SetBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Acts.SetBoundaries.run/2","doc":"","ref":"Bonfire.Boundaries.Acts.SetBoundaries.html#run/2"},{"type":"module","title":"Bonfire.Boundaries.Blocks","doc":"Handles blocking of users and instances\n\nThis module provides functions to block and unblock users or instances, check\nif a user or instance is blocked, and manage block lists. It also includes\nfederation support for ActivityPub.","ref":"Bonfire.Boundaries.Blocks.html"},{"type":"function","title":"Bonfire.Boundaries.Blocks.ap_receive_activity/3","doc":"Handles incoming Block activities from ActivityPub federation.","ref":"Bonfire.Boundaries.Blocks.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.ap_receive_activity/3","doc":"iex> Bonfire.Boundaries.Blocks.ap_receive_activity(blocker, activity, blocked)","ref":"Bonfire.Boundaries.Blocks.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.block/3","doc":"Blocks, silences, or ghosts a user or instance.","ref":"Bonfire.Boundaries.Blocks.html#block/3"},{"type":"function","title":"Block a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-block-a-user-for-current-user"},{"type":"function","title":"Block a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-block-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Silence a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :silence, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-silence-a-user-for-current-user"},{"type":"function","title":"Silence a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :silence, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-silence-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Ghost a user for current user - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :ghost, current_user: blocker)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-ghost-a-user-for-current-user"},{"type":"function","title":"Ghost a user for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.block/3","doc":"iex> Bonfire.Boundaries.Blocks.block(user, :ghost, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#block/3-ghost-a-user-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Bonfire.Boundaries.Blocks.federation_module/0","doc":"","ref":"Bonfire.Boundaries.Blocks.html#federation_module/0"},{"type":"function","title":"Bonfire.Boundaries.Blocks.instance_wide_block/2","doc":"Blocks a user or instance for everyone on the instance (for admin/mod use only).","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_block/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.instance_wide_block/2","doc":"iex> Bonfire.Boundaries.Blocks.instance_wide_block(user, :ghost)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_block/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.instance_wide_circles/1","doc":"","ref":"Bonfire.Boundaries.Blocks.html#instance_wide_circles/1"},{"type":"function","title":"Bonfire.Boundaries.Blocks.is_blocked?/3","doc":"Checks if a user or instance is blocked.","ref":"Bonfire.Boundaries.Blocks.html#is_blocked?/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.is_blocked?/3","doc":"iex> Bonfire.Boundaries.Blocks.is_blocked?(instance, :ghost, current_user: checker)\n false\n\n iex> Bonfire.Boundaries.Blocks.is_blocked?(user, :silence, :instance_wide)\n true","ref":"Bonfire.Boundaries.Blocks.html#is_blocked?/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.list/2","doc":"Lists blocked users or instances for a given block type and scope","ref":"Bonfire.Boundaries.Blocks.html#list/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.list/2","doc":"iex> Bonfire.Boundaries.Blocks.list(:ghost, :instance_wide)\n [%{id: \"123\", type: :ghost}, %{id: \"456\", type: :ghost}]\n\n iex> Bonfire.Boundaries.Blocks.list(:silence, current_user: user)\n [%{id: \"789\", type: :silence}]","ref":"Bonfire.Boundaries.Blocks.html#list/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"Blocks a remote instance.","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3"},{"type":"function","title":"Block for current user - Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"iex> Bonfire.Boundaries.Blocks.remote_instance_block(\"example.com\", :silence, current_user)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3-block-for-current-user"},{"type":"function","title":"Block for everyone on the instance (as an admin/mod) - Bonfire.Boundaries.Blocks.remote_instance_block/3","doc":"iex> Bonfire.Boundaries.Blocks.remote_instance_block(\"example.com\", :silence, :instance_wide)\n {:ok, \"Blocked\"}","ref":"Bonfire.Boundaries.Blocks.html#remote_instance_block/3-block-for-everyone-on-the-instance-as-an-admin-mod"},{"type":"function","title":"Bonfire.Boundaries.Blocks.types_blocked/1","doc":"Converts provided block types (eg. `:ghost` or `:silence`) into a list of internal block types.","ref":"Bonfire.Boundaries.Blocks.html#types_blocked/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.types_blocked/1","doc":"iex> Bonfire.Boundaries.Blocks.types_blocked([:ghost, :silence])\n [:ghost_them, :silence_them]\n\n iex> Bonfire.Boundaries.Blocks.types_blocked(:ghost)\n [:ghost_them]\n\n iex> Bonfire.Boundaries.Blocks.types_blocked(nil)\n [:silence_them, :ghost_them]","ref":"Bonfire.Boundaries.Blocks.html#types_blocked/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.unblock/3","doc":"Unblocks a user or instance.","ref":"Bonfire.Boundaries.Blocks.html#unblock/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.unblock/3","doc":"iex> Bonfire.Boundaries.Blocks.unblock(user, :ghost, current_user: unblocker)\n {:ok, \"Unblocked\"}\n\n iex> Bonfire.Boundaries.Blocks.unblock(user, :silence, :instance_wide)\n {:ok, \"Unblocked\"}","ref":"Bonfire.Boundaries.Blocks.html#unblock/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.unblock_all/2","doc":"Unblocks *all* users or instances for a given block type and scope (only used for debugging purposes)","ref":"Bonfire.Boundaries.Blocks.html#unblock_all/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Blocks.unblock_all/2","doc":"iex> Bonfire.Boundaries.Blocks.unblock_all(:ghost, :instance_wide)\n {:ok, \"All unblocked\"}","ref":"Bonfire.Boundaries.Blocks.html#unblock_all/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Blocks.user_block_circles/2","doc":"","ref":"Bonfire.Boundaries.Blocks.html#user_block_circles/2"},{"type":"module","title":"Bonfire.Boundaries.Blocks.LiveHandler","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html"},{"type":"function","title":"Bonfire.Boundaries.Blocks.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Boundaries.Blocks.LiveHandler.preload_one/2","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#preload_one/2"},{"type":"macro","title":"Bonfire.Boundaries.Blocks.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Boundaries.Blocks.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Boundaries.Circles","doc":"Functions to create, query, and manage circles, which are used to group users (for the purpose of control access to various resources).\n\nCircles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.\n\n> Circles are a tool that can be used to establish relationships. They are representations of multifaceted relationships that you have with people in your life. Circles can help you understand the different levels of intimacy and trust that you have with different people, as well the different contexts or topics which are relevant to particular relationships, and can help build stronger, healthier relationships.\n\n> In Bonfire, you can define circles based on your unique style of relationships and interests. For example, you might create a circle for your colleagues, which can help you keep track of work-related content and collaborate with them more efficiently. You could also have a locals circle, with which you may share and discover local events, news, and recommendations. You might also create a comrades circle, to stay connected with fellow activists and organise around shared goals. Finally, you could create a happy hour circle, to coordinate social gatherings with local friends or colleagues, and the crew for your inner circle. With circles, you have the flexibility to manage your relationships and social activities in a way that makes sense for you.\n\nThe corresponding Ecto schema are `Bonfire.Data.AccessControl.Circle` and `Bonfire.Data.AccessControl.Encircle` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Circles.html"},{"type":"function","title":"Bonfire.Boundaries.Circles.add_to_circles/2","doc":"Adds subject(s) to circle(s).","ref":"Bonfire.Boundaries.Circles.html#add_to_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.add_to_circles/2","doc":"iex> Bonfire.Boundaries.Circles.add_to_circles(user, circle)\n {:ok, %Encircle{}}\n\n iex> Bonfire.Boundaries.Circles.add_to_circles([user1, user2], [circle1, circle2])\n [{{:ok, %Encircle{}}, {:ok, %Encircle{}}}, {{:ok, %Encircle{}}, {:ok, %Encircle{}}}]","ref":"Bonfire.Boundaries.Circles.html#add_to_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.built_in_ids/0","doc":"Returns a list of built-in circle IDs.","ref":"Bonfire.Boundaries.Circles.html#built_in_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.changeset/2","doc":"","ref":"Bonfire.Boundaries.Circles.html#changeset/2"},{"type":"function","title":"Bonfire.Boundaries.Circles.changeset/3","doc":"","ref":"Bonfire.Boundaries.Circles.html#changeset/3"},{"type":"function","title":"Bonfire.Boundaries.Circles.circle_ids/1","doc":"Converts a list of circles to circle IDs.","ref":"Bonfire.Boundaries.Circles.html#circle_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.circle_ids/1","doc":"iex> Bonfire.Boundaries.Circles.circle_ids([:guest, :local])\n [\"guest_circle_id\", \"local_circle_id\"]\n\n iex> Bonfire.Boundaries.Circles.circle_ids(%{id: \"user_id\"})\n \"user_id\"","ref":"Bonfire.Boundaries.Circles.html#circle_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.circles/0","doc":"Returns a list of special built-in circles (e.g., guest, local, activity_pub).","ref":"Bonfire.Boundaries.Circles.html#circles/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.create/2","doc":"Creates a new circle for the provided user.","ref":"Bonfire.Boundaries.Circles.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.create/2","doc":"iex> Bonfire.Boundaries.Circles.create(user, %{named: %{name: \"My Circle\"}})\n {:ok, %Circle{id: \"new_circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.delete/2","doc":"Deletes a circle and its associated data, including membership and boundary information. This will affect all objects previously shared with members of this circle","ref":"Bonfire.Boundaries.Circles.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.delete/2","doc":"iex> Bonfire.Boundaries.Circles.delete(circle, [current_user: user])\n\n iex> Bonfire.Boundaries.Circles.delete(\"circle_id\", [current_user: user])","ref":"Bonfire.Boundaries.Circles.html#delete/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.edit/3","doc":"Edits a circle's attributes.","ref":"Bonfire.Boundaries.Circles.html#edit/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.edit/3","doc":"iex> Bonfire.Boundaries.Circles.edit(circle, user, %{name: \"Updated Circle\"})\n {:ok, %Circle{id: \"circle_id\", name: \"Updated Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#edit/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.empty_circles/1","doc":"Empties circles by removing all members.","ref":"Bonfire.Boundaries.Circles.html#empty_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.empty_circles/1","doc":"iex> Bonfire.Boundaries.Circles.empty_circles([circle1, circle2])\n {10, nil}","ref":"Bonfire.Boundaries.Circles.html#empty_circles/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.exists?/2","doc":"","ref":"Bonfire.Boundaries.Circles.html#exists?/2"},{"type":"function","title":"Bonfire.Boundaries.Circles.get/1","doc":"Retrieves a circle by its slug or ID.","ref":"Bonfire.Boundaries.Circles.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get/1","doc":"iex> Bonfire.Boundaries.Circles.get(:guest)\n %{id: \"guest_circle_id\", name: \"Guest\"}\n\n iex> Bonfire.Boundaries.Circles.get(\"circle_id\")\n %Circle{id: \"circle_id\", name: \"Custom Circle\"}","ref":"Bonfire.Boundaries.Circles.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get!/1","doc":"","ref":"Bonfire.Boundaries.Circles.html#get!/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_by_name/2","doc":"Retrieves a circle by name for a caretaker.","ref":"Bonfire.Boundaries.Circles.html#get_by_name/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_by_name/2","doc":"iex> Bonfire.Boundaries.Circles.get_by_name(\"My Circle\", user)\n {:ok, %Circle{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_by_name/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_for_caretaker/3","doc":"Retrieves a circle for a caretaker by ID.","ref":"Bonfire.Boundaries.Circles.html#get_for_caretaker/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_for_caretaker/3","doc":"iex> Bonfire.Boundaries.Circles.get_for_caretaker(\"circle_id\", user)\n {:ok, %Circle{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_for_caretaker/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_id/1","doc":"Retrieves the ID of a circle by its slug.","ref":"Bonfire.Boundaries.Circles.html#get_id/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_id/1","doc":"iex> Bonfire.Boundaries.Circles.get_id(:guest)\n \"guest_circle_id\"\n\n iex> Bonfire.Boundaries.Circles.get_id(:nonexistent)\n nil","ref":"Bonfire.Boundaries.Circles.html#get_id/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_id!/1","doc":"","ref":"Bonfire.Boundaries.Circles.html#get_id!/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_or_create/2","doc":"Retrieves or creates a circle by name for a caretaker.","ref":"Bonfire.Boundaries.Circles.html#get_or_create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_or_create/2","doc":"iex> Bonfire.Boundaries.Circles.get_or_create(\"New Circle\", user)\n {:ok, %Circle{id: \"new_circle_id\", name: \"New Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_or_create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_stereotype_circles/2","doc":"Retrieves stereotype circles for a subject.","ref":"Bonfire.Boundaries.Circles.html#get_stereotype_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_stereotype_circles/2","doc":"iex> Bonfire.Boundaries.Circles.get_stereotype_circles(user, [:follow, :block])\n [%Circle{id: \"follow_circle_id\", name: \"Follow\"}, %Circle{id: \"block_circle_id\", name: \"Block\"}]","ref":"Bonfire.Boundaries.Circles.html#get_stereotype_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.get_tuple/1","doc":"Retrieves a tuple containing the name and ID of a circle by its slug or ID.","ref":"Bonfire.Boundaries.Circles.html#get_tuple/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.get_tuple/1","doc":"iex> Bonfire.Boundaries.Circles.get_tuple(:guest)\n {\"Guest\", \"guest_circle_id\"}\n\n iex> Bonfire.Boundaries.Circles.get_tuple(\"circle_id\")\n {:my_circle, %{id: \"circle_id\", name: \"My Circle\"}}","ref":"Bonfire.Boundaries.Circles.html#get_tuple/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_built_in?/1","doc":"Checks if a circle is a built-in circle.","ref":"Bonfire.Boundaries.Circles.html#is_built_in?/1"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_encircled_by?/2","doc":"Checks if a subject is encircled by a circle or list of circles.","ref":"Bonfire.Boundaries.Circles.html#is_encircled_by?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.is_encircled_by?/2","doc":"iex> Bonfire.Boundaries.Circles.is_encircled_by?(user, circle)\n true\n\n iex> Bonfire.Boundaries.Circles.is_encircled_by?(user, [circle1, circle2])\n false","ref":"Bonfire.Boundaries.Circles.html#is_encircled_by?/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.is_stereotype?/1","doc":"Checks if a circle is a stereotype circle.","ref":"Bonfire.Boundaries.Circles.html#is_stereotype?/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.is_stereotype?/1","doc":"iex> Bonfire.Boundaries.Circles.is_stereotype?(\"7DAPE0P1E1PERM1TT0F0110WME\")\n true\n\n iex> Bonfire.Boundaries.Circles.is_stereotype?(\"custom_circle_id\")\n false","ref":"Bonfire.Boundaries.Circles.html#is_stereotype?/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.leave_all_circles/1","doc":"Removes user(s) from all circles.","ref":"Bonfire.Boundaries.Circles.html#leave_all_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.leave_all_circles/1","doc":"iex> Bonfire.Boundaries.Circles.empty_circles([circle1, circle2])\n {10, nil}","ref":"Bonfire.Boundaries.Circles.html#leave_all_circles/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_built_ins/0","doc":"Lists all built-in circles.","ref":"Bonfire.Boundaries.Circles.html#list_built_ins/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_built_ins/0","doc":"iex> Bonfire.Boundaries.Circles.list_built_ins()\n [%Circle{id: \"guest_circle_id\", name: \"Guest\"}, %Circle{id: \"local_circle_id\", name: \"Local\"}]","ref":"Bonfire.Boundaries.Circles.html#list_built_ins/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_by_ids/1","doc":"Lists circles by their IDs.","ref":"Bonfire.Boundaries.Circles.html#list_by_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_by_ids/1","doc":"iex> Bonfire.Boundaries.Circles.list_by_ids([\"circle_id1\", \"circle_id2\"])\n [%Circle{id: \"circle_id1\", name: \"Circle 1\"}, %Circle{id: \"circle_id2\", name: \"Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_by_ids/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my/2","doc":"Lists circles owned by a user.\n\nIncludes circles we are the registered caretakers of that we are\npermitted to see. If any circles are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Circles.html#list_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my/2","doc":"iex> Bonfire.Boundaries.Circles.list_my(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle 1\"}, %Circle{id: \"circle_id2\", name: \"My Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_defaults/1","doc":"Lists default circles for a user.","ref":"Bonfire.Boundaries.Circles.html#list_my_defaults/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_defaults/1","doc":"iex> Bonfire.Boundaries.Circles.list_my_defaults()\n [{\"Guest\", \"guest_circle_id\"}, {\"Local\", \"local_circle_id\"}, {\"ActivityPub\", \"activity_pub_circle_id\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my_defaults/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_with_counts/2","doc":"Lists circles owned by a user with member counts.","ref":"Bonfire.Boundaries.Circles.html#list_my_with_counts/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_with_counts/2","doc":"iex> Bonfire.Boundaries.Circles.list_my_with_counts(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle\", encircles_count: 5}]","ref":"Bonfire.Boundaries.Circles.html#list_my_with_counts/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_my_with_global/2","doc":"Lists circles owned by a user and global/built-in circles.","ref":"Bonfire.Boundaries.Circles.html#list_my_with_global/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_my_with_global/2","doc":"iex> Bonfire.Boundaries.Circles.list_my_with_global(user)\n [%Circle{id: \"circle_id1\", name: \"My Circle\"}, %Circle{id: \"global_circle_id\", name: \"Global Circle\"}]","ref":"Bonfire.Boundaries.Circles.html#list_my_with_global/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.list_visible/2","doc":"Lists visible circles for a user.","ref":"Bonfire.Boundaries.Circles.html#list_visible/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.list_visible/2","doc":"iex> Bonfire.Boundaries.Circles.list_visible(user)\n [%Circle{id: \"circle_id1\", name: \"Circle 1\"}, %Circle{id: \"circle_id2\", name: \"Circle 2\"}]","ref":"Bonfire.Boundaries.Circles.html#list_visible/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.preload_encircled_by/3","doc":"","ref":"Bonfire.Boundaries.Circles.html#preload_encircled_by/3"},{"type":"function","title":"Bonfire.Boundaries.Circles.query/1","doc":"Generates a query for circles","ref":"Bonfire.Boundaries.Circles.html#query/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query/1","doc":"iex> Bonfire.Boundaries.Circles.query(exclude_built_ins: true)","ref":"Bonfire.Boundaries.Circles.html#query/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_my/2","doc":"Generates a query for circles owned by a user.","ref":"Bonfire.Boundaries.Circles.html#query_my/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_my/2","doc":"iex> Bonfire.Boundaries.Circles.query_my(user)","ref":"Bonfire.Boundaries.Circles.html#query_my/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_my_by_id/3","doc":"Generates a query for a specific circle owned by a user.","ref":"Bonfire.Boundaries.Circles.html#query_my_by_id/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_my_by_id/3","doc":"iex> Bonfire.Boundaries.Circles.query_my_by_id(\"circle_id\", user)","ref":"Bonfire.Boundaries.Circles.html#query_my_by_id/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.query_visible/2","doc":"Generates a query for visible circles for a user.","ref":"Bonfire.Boundaries.Circles.html#query_visible/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.query_visible/2","doc":"iex> Bonfire.Boundaries.Circles.query_visible(user)\n #Ecto.Query<...>","ref":"Bonfire.Boundaries.Circles.html#query_visible/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.remove_from_circles/2","doc":"Removes a user from circles.","ref":"Bonfire.Boundaries.Circles.html#remove_from_circles/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.remove_from_circles/2","doc":"iex> Bonfire.Boundaries.Circles.remove_from_circles(user, circle)\n {1, nil}\n\n iex> Bonfire.Boundaries.Circles.remove_from_circles(user, [circle1, circle2])\n {2, nil}","ref":"Bonfire.Boundaries.Circles.html#remove_from_circles/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.stereotype_ids/0","doc":"Returns a list of stereotype circle IDs.","ref":"Bonfire.Boundaries.Circles.html#stereotype_ids/0"},{"type":"function","title":"Bonfire.Boundaries.Circles.stereotypes/1","doc":"Returns a list of stereotype IDs for a specific category.","ref":"Bonfire.Boundaries.Circles.html#stereotypes/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.stereotypes/1","doc":"iex> Bonfire.Boundaries.Circles.stereotypes(:follow)\n\n iex> Bonfire.Boundaries.Circles.stereotypes(:block)","ref":"Bonfire.Boundaries.Circles.html#stereotypes/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Circles.to_circle_ids/1","doc":"Converts a list of circles to circle IDs, including adding default circles (such as local or activity_pub when relevant)","ref":"Bonfire.Boundaries.Circles.html#to_circle_ids/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Circles.to_circle_ids/1","doc":"iex> Bonfire.Boundaries.Circles.to_circle_ids([:guest, :custom])\n [\"guest_circle_id\", \"custom_circle_id\", \"local_circle_id\", \"activity_pub_circle_id\"]","ref":"Bonfire.Boundaries.Circles.html#to_circle_ids/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Controlleds","doc":"An object is linked to one or more `Acl`s by the `Controlled` multimixin, which pairs an object ID with an ACL ID.\nBecause it is a multimixin, a given object can have multiple ACLs applied. In the case of overlap, permissions are combined with `false` being prioritised.\n\nThe `Controlled` multimixin link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described in `Bonfire.Boundaries`.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Controlled` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Controlleds.html"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.add_acls/2","doc":"Adds the given ACL to an object.","ref":"Bonfire.Boundaries.Controlleds.html#add_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.add_acls/2","doc":"iex> add_acls(object, :acl)\n {:ok, %Controlled{}}","ref":"Bonfire.Boundaries.Controlleds.html#add_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.changeset/2","doc":"Returns a changeset for a `Controlled` with the given attributes.","ref":"Bonfire.Boundaries.Controlleds.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.changeset/2","doc":"iex> changeset(%Controlled{}, %{field: value})\n %Ecto.Changeset{}","ref":"Bonfire.Boundaries.Controlleds.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.create/1","doc":"Creates a `Controlled` record with the given attributes.","ref":"Bonfire.Boundaries.Controlleds.html#create/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.create/1","doc":"iex> create(%{field: value})\n {:ok, %Controlled{}}","ref":"Bonfire.Boundaries.Controlleds.html#create/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.get_preset_on_object/1","doc":"Gets a preset ACL applied to an object, if any.","ref":"Bonfire.Boundaries.Controlleds.html#get_preset_on_object/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.get_preset_on_object/1","doc":"iex> get_preset_on_object(object)\n %ACL{}","ref":"Bonfire.Boundaries.Controlleds.html#get_preset_on_object/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.grant_role/4","doc":"Grants a role to a subject for an object.","ref":"Bonfire.Boundaries.Controlleds.html#grant_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.grant_role/4","doc":"iex> grant_role(subject_id, object, :editor)\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Controlleds.html#grant_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_acls_on_object/2","doc":"Lists ACLs applied to an object.\nOnly call this as an admin or curator of the object.","ref":"Bonfire.Boundaries.Controlleds.html#list_acls_on_object/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_acls_on_object/2","doc":"iex> list_acls_on_object(object)\n [%Acl{}]","ref":"Bonfire.Boundaries.Controlleds.html#list_acls_on_object/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_grants_by_verbs/3","doc":"Lists grants of a given verb on specified object(s).","ref":"Bonfire.Boundaries.Controlleds.html#list_grants_by_verbs/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_grants_by_verbs/3","doc":"iex> list_grants_by_verbs(objects, :read)\n\n iex> list_grants_by_verbs(objects, :edit, false)","ref":"Bonfire.Boundaries.Controlleds.html#list_grants_by_verbs/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_on_object/2","doc":"Lists ALL boundaries (ACLs and grants) applied to an object.\nOnly call this as an admin or curator of the object.","ref":"Bonfire.Boundaries.Controlleds.html#list_on_object/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_on_object/2","doc":"iex> list_on_object(object)\n [%Boundary{}]","ref":"Bonfire.Boundaries.Controlleds.html#list_on_object/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_on_objects_by_subject/2","doc":"Lists ACLs applied to the given objects by the subject (current_user).","ref":"Bonfire.Boundaries.Controlleds.html#list_on_objects_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_on_objects_by_subject/2","doc":"iex> list_on_objects_by_subject(objects, current_user)\n %{object1_id => [%Acl{}], object2_id => [%Acl{}]}","ref":"Bonfire.Boundaries.Controlleds.html#list_on_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_presets_on_objects/1","doc":"Lists presets ACLs applied to the given objects.","ref":"Bonfire.Boundaries.Controlleds.html#list_presets_on_objects/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_presets_on_objects/1","doc":"iex> list_presets_on_objects(objects)\n %{object_id => %Preset{}}","ref":"Bonfire.Boundaries.Controlleds.html#list_presets_on_objects/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_q/1","doc":"","ref":"Bonfire.Boundaries.Controlleds.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.list_subjects_by_verb/3","doc":"Lists subjects who have been granted a given verb on specified object(s).","ref":"Bonfire.Boundaries.Controlleds.html#list_subjects_by_verb/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.list_subjects_by_verb/3","doc":"iex> list_subjects_by_verb(objects, :read)\n\n iex> list_subjects_by_verb(objects, :edit, false)","ref":"Bonfire.Boundaries.Controlleds.html#list_subjects_by_verb/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Controlleds.remove_acls/2","doc":"Removes the given ACLs from an object.","ref":"Bonfire.Boundaries.Controlleds.html#remove_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Controlleds.remove_acls/2","doc":"iex> remove_acls(object, acls)","ref":"Bonfire.Boundaries.Controlleds.html#remove_acls/2-examples"},{"type":"module","title":"Bonfire.Boundaries.Debug","doc":"Debug utilities for Bonfire Boundaries.\n\nThis module provides functions to debug and inspect user circles, ACLs, and grants.","ref":"Bonfire.Boundaries.Debug.html"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_grants_on/1","doc":"Prints debug information about all grants on specific things.","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_grants_on/1","doc":"iex> Bonfire.Boundaries.Debug.debug_grants_on(things)\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [reply] | true |\n | user_2 | object_2 | [edit] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_grants_on/2","doc":"Prints debug information about grants on specific things for given verbs.","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_grants_on/2","doc":"iex> Bonfire.Boundaries.Debug.debug_grants_on(things, [:read, :edit])\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [edit] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_my_grants_on/2","doc":"Prints debug information about users' grants on specific things.","ref":"Bonfire.Boundaries.Debug.html#debug_my_grants_on/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_my_grants_on/2","doc":"iex> Bonfire.Boundaries.Debug.debug_my_grants_on(users, things)\n +------------+------------+---------+-------+\n | subject_id | object_id | verbs | value |\n +------------+------------+---------+-------+\n | user_1 | object_1 | [read] | true |\n | user_2 | object_2 | [write] | false |\n +------------+------------+---------+-------+","ref":"Bonfire.Boundaries.Debug.html#debug_my_grants_on/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_object_acls/1","doc":"Prints debug information about an object's ACLs.","ref":"Bonfire.Boundaries.Debug.html#debug_object_acls/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_object_acls/1","doc":"iex> Bonfire.Boundaries.Debug.debug_object_acls(object)\n Object: object_id\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_id | acl_name | acl_stereo| grant_verb | grant_subject | grant_value |\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_1 | Private | null | read | Friends | true |\n | acl_2 | Public | null | write | Everyone | false |\n +--------+----------+-----------+------------+---------------+-----------+","ref":"Bonfire.Boundaries.Debug.html#debug_object_acls/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_user_acls/2","doc":"Prints debug information about a user's ACLs.","ref":"Bonfire.Boundaries.Debug.html#debug_user_acls/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_user_acls/2","doc":"iex> Bonfire.Boundaries.Debug.debug_user_acls(user)\n user ACLs: user_id\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_id | acl_name | acl_stereo| grant_verb | grant_subject | grant_value |\n +--------+----------+-----------+------------+---------------+-----------+\n | acl_1 | Private | null | read | Friends | true |\n | acl_2 | Public | null | write | Everyone | false |\n +--------+----------+-----------+------------+---------------+-----------+\n\n iex> Bonfire.Boundaries.Debug.debug_user_acls(user, \"Custom label\")\n Custom label user ACLs: user_id\n ...","ref":"Bonfire.Boundaries.Debug.html#debug_user_acls/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Debug.debug_user_circles/1","doc":"Prints debug information about a user's circles.","ref":"Bonfire.Boundaries.Debug.html#debug_user_circles/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Debug.debug_user_circles/1","doc":"iex> Bonfire.Boundaries.Debug.debug_user_circles(user)\n User: user_id\n +------------+------------+\n | circle_id | circle_name|\n +------------+------------+\n | circle_1 | Friends |\n | circle_2 | Family |\n +------------+------------+","ref":"Bonfire.Boundaries.Debug.html#debug_user_circles/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Grants","doc":"A grant defines a permission (`value` boolean on a `Verb`) for a subject, within the context of an `Acl`. It defines the access rights for a specific user or circle in relation to a particular action.\n\nA permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n* `true`: yes, the action is allowed\n* `false`: no, the action is explicitly denied (i.e. never permit)\n* `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed) \n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Grant` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Grants.html"},{"type":"function","title":"Bonfire.Boundaries.Grants.change_role/4","doc":"Edit grants of an ACL based on a role.","ref":"Bonfire.Boundaries.Grants.html#change_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.change_role/4","doc":"iex> Bonfire.Boundaries.Grants.change_role(\"subject_123\", \"acl_456\", :admin, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#change_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.create/2","doc":"Creates a new grant with the given attributes and options.","ref":"Bonfire.Boundaries.Grants.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.create/2","doc":"iex> Bonfire.Boundaries.Grants.create(%{subject_id: \"123\", acl_id: \"456\", verb_id: \"789\", value: true}, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.get/1","doc":"Gets the grant configuration by a given slug.","ref":"Bonfire.Boundaries.Grants.html#get/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.get/1","doc":"iex> Bonfire.Boundaries.Grants.get(:guests_may_see_read)","ref":"Bonfire.Boundaries.Grants.html#get/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grant/5","doc":"Adds or update a grant on an Acl.\n\nTakes five parameters:\n- `subject_id`: who we are granting access to\n- `acl_id`: what ACL we're applying a grant to\n- `verb`: which verb/action\n- `value`: true, false, or nil\n- `opts`: additional options","ref":"Bonfire.Boundaries.Grants.html#grant/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grant/5","doc":"iex> Bonfire.Boundaries.Grants.grant(\"subject_123\", \"acl_456\", :read, true)","ref":"Bonfire.Boundaries.Grants.html#grant/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grant_role/4","doc":"Adds grants to an ACL based on a role.","ref":"Bonfire.Boundaries.Grants.html#grant_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grant_role/4","doc":"iex> Bonfire.Boundaries.Grants.grant_role(\"subject_123\", \"acl_456\", :admin, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#grant_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grants/0","doc":"Gets the configuration for grants.","ref":"Bonfire.Boundaries.Grants.html#grants/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grants/0","doc":"iex> Bonfire.Boundaries.Grants.grants()\n %{}","ref":"Bonfire.Boundaries.Grants.html#grants/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.grants_to_tuples/2","doc":"Converts a list of grants to a list of tuples for a given creator.","ref":"Bonfire.Boundaries.Grants.html#grants_to_tuples/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.grants_to_tuples/2","doc":"iex> Bonfire.Boundaries.Grants.grants_to_tuples(%User{}, %{grants: [%Grant{}]})\n [{%User{}, :some_role}]","ref":"Bonfire.Boundaries.Grants.html#grants_to_tuples/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.list/1","doc":"Lists the grants permitted to see.","ref":"Bonfire.Boundaries.Grants.html#list/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_for_acl/2","doc":"Lists the grants for a given ACL.","ref":"Bonfire.Boundaries.Grants.html#list_for_acl/2"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_my/1","doc":"Lists the grants we are the registered caretakers of that we are\npermitted to see. If any are created without permitting the\nuser to see them, they will not be shown.","ref":"Bonfire.Boundaries.Grants.html#list_my/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.list_q/1","doc":"","ref":"Bonfire.Boundaries.Grants.html#list_q/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.remove_role/4","doc":"Adds grants to an ACL based on a role.","ref":"Bonfire.Boundaries.Grants.html#remove_role/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.remove_role/4","doc":"iex> Bonfire.Boundaries.Grants.remove_role(\"subject_123\", \"acl_456\", :admin, [])\n {:ok, %Grant{}}","ref":"Bonfire.Boundaries.Grants.html#remove_role/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.remove_subject_from_acl/2","doc":"Removes a subject's grants from an ACL or ACLs.","ref":"Bonfire.Boundaries.Grants.html#remove_subject_from_acl/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.remove_subject_from_acl/2","doc":"iex> Bonfire.Boundaries.Grants.remove_subject_from_acl(\"subject_123\", [\"acl_456\", \"acl_789\"])\n {:ok, %{}}","ref":"Bonfire.Boundaries.Grants.html#remove_subject_from_acl/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.subject_grants/1","doc":"Returns a list of grants-per-subject from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subject_grants/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.subject_verb_grants/1","doc":"Returns a list of grants-per-verb-per-subject from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subject_verb_grants/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.subject_verb_grants/1","doc":"iex> Bonfire.Boundaries.Grants.subject_verb_grants([%Grant{}])\n %{}","ref":"Bonfire.Boundaries.Grants.html#subject_verb_grants/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.subjects/1","doc":"Returns the subject(s) from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#subjects/1"},{"type":"function","title":"Bonfire.Boundaries.Grants.upsert_or_delete/2","doc":"Inserts, updates, or deletes a grant based on the given attributes and options.","ref":"Bonfire.Boundaries.Grants.html#upsert_or_delete/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.upsert_or_delete/2","doc":"iex> Bonfire.Boundaries.Grants.upsert_or_delete(%{acl_id: \"456\", subject_id: \"123\", verb_id: \"789\", value: true}, [])\n {:ok, %Grant{}}\n\n iex> Bonfire.Boundaries.Grants.upsert_or_delete(%{acl_id: \"456\", subject_id: \"123\", verb_id: \"789\", value: nil}, [])\n {:ok, _deleted}","ref":"Bonfire.Boundaries.Grants.html#upsert_or_delete/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Grants.verb_subject_grant/1","doc":"Returns a list of grants-per-subject-per-verb from a list of grants.","ref":"Bonfire.Boundaries.Grants.html#verb_subject_grant/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Grants.verb_subject_grant/1","doc":"iex> Bonfire.Boundaries.Grants.verb_subject_grant([%Grant{}])\n %{}","ref":"Bonfire.Boundaries.Grants.html#verb_subject_grant/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Integration","doc":"","ref":"Bonfire.Boundaries.Integration.html"},{"type":"function","title":"Bonfire.Boundaries.Integration.is_local?/2","doc":"","ref":"Bonfire.Boundaries.Integration.html#is_local?/2"},{"type":"function","title":"Bonfire.Boundaries.Integration.many/3","doc":"","ref":"Bonfire.Boundaries.Integration.html#many/3"},{"type":"function","title":"Bonfire.Boundaries.Integration.repo/0","doc":"","ref":"Bonfire.Boundaries.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Boundaries.LiveHandler","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.acl_create/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#acl_create/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.boundaries_on_objects/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#boundaries_on_objects/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.circle_create/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#circle_create/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.maybe_check_boundaries/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#maybe_check_boundaries/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.maybe_redirect_to/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#maybe_redirect_to/3"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.my_acls/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#my_acls/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.my_circles_paginated/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#my_circles_paginated/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.prepare_assigns/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#prepare_assigns/1"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.remove_from_circle_tuples/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#remove_from_circle_tuples/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.scope_origin/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#scope_origin/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.set_circles_tuples/3","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#set_circles_tuples/3"},{"type":"macro","title":"Bonfire.Boundaries.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.subject_name/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#subject_name/1"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.unblock/4","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#unblock/4"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Boundaries.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Boundaries.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Boundaries.Queries","doc":"Helpers for writing common boundary-related queries, particularly for applying access control to queries.\n\nThis module provides macros and functions to assist with boundary checks and permission queries.","ref":"Bonfire.Boundaries.Queries.html"},{"type":"macro","title":"Bonfire.Boundaries.Queries.add_perms/2","doc":"A macro that calls the `add_perms(bool?, bool?)` DB function","ref":"Bonfire.Boundaries.Queries.html#add_perms/2"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.add_perms/2","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query = from(p in Summary, select: add_perms(p.read, p.write))","ref":"Bonfire.Boundaries.Queries.html#add_perms/2-examples"},{"type":"macro","title":"Bonfire.Boundaries.Queries.agg_perms/1","doc":"A macro that calls the `agg_perms(bool?)` aggregate DB function for combining permissions.","ref":"Bonfire.Boundaries.Queries.html#agg_perms/1"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.agg_perms/1","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query = from(p in Summary, group_by: p.object_id, having: agg_perms(p.value))","ref":"Bonfire.Boundaries.Queries.html#agg_perms/1-examples"},{"type":"macro","title":"Bonfire.Boundaries.Queries.boundarise/3","doc":"A macro to apply boundary checks to a query.","ref":"Bonfire.Boundaries.Queries.html#boundarise/3"},{"type":"macro","title":"Examples - Bonfire.Boundaries.Queries.boundarise/3","doc":"iex> import Bonfire.Boundaries.Queries\n iex> query_visible_posts = from(p in Post)\n |> boundarise(p.id, current_user: user)\n\n iex> query_editable_posts = from(p in Post)\n |> boundarise(p.id, verbs: [:edit], current_user: user)","ref":"Bonfire.Boundaries.Queries.html#boundarise/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.object_boundarised/2","doc":"Applies boundary checks to a query for a specific object.","ref":"Bonfire.Boundaries.Queries.html#object_boundarised/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.object_boundarised/2","doc":"iex> query = from(p in Post)\n iex> Bonfire.Boundaries.Queries.object_boundarised(query, current_user: user)","ref":"Bonfire.Boundaries.Queries.html#object_boundarised/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.permitted/1","doc":"Queries for all permitted objects for a user.","ref":"Bonfire.Boundaries.Queries.html#permitted/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.permitted/1","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.permitted(user_id)","ref":"Bonfire.Boundaries.Queries.html#permitted/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.permitted/2","doc":"Queries for permitted objects for a user with specific verbs.","ref":"Bonfire.Boundaries.Queries.html#permitted/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.permitted/2","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.permitted(user_id, [:read, :write])","ref":"Bonfire.Boundaries.Queries.html#permitted/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.query_with_summary/3","doc":"Creates a subquery to filter results based on user permissions.\n\nFilters out results that the current user is not permitted to perform *all* of the specified verbs on.","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Queries.query_with_summary/3","doc":"- `user`: The current user or their ID\n- `verbs`: A list of verbs to check permissions for (default: [:see, :read])\n- `query`: An initial query on `Summary` to filter objects (optional)","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.query_with_summary/3","doc":"iex> user_id = \"user123\"\n iex> Bonfire.Boundaries.Queries.query_with_summary(user_id, [:read, :write])","ref":"Bonfire.Boundaries.Queries.html#query_with_summary/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Queries.skip_boundary_check?/2","doc":"Checks if boundary checks should be skipped based on the provided options and object.","ref":"Bonfire.Boundaries.Queries.html#skip_boundary_check?/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Queries.skip_boundary_check?/2","doc":"iex> Bonfire.Boundaries.Queries.skip_boundary_check?([skip_boundary_check: true])\n true\n\n iex> Bonfire.Boundaries.Queries.skip_boundary_check?([], %{id: \"user123\"})\n false\n\n iex> Bonfire.Boundaries.Queries.skip_boundary_check?([current_user: %{id: \"user123\"}], %{id: \"user123\"})\n true","ref":"Bonfire.Boundaries.Queries.html#skip_boundary_check?/2-examples"},{"type":"module","title":"Bonfire.Boundaries.Roles","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.\n\nHere are some preset roles and their associated actions:\n\n- **Read**: can discover the content in lists (like feeds) and read it; request permission for another verb (e.g., request to follow).\n- **Interact**: can read, plus like an object (and notify the author); follow a user or thread; boost an object (and notify the author); pin something to highlight it.\n- **Participate**: can interact, plus reply to an activity or post; mention a user or object (and notify them); send a message.\n- **Contribute**: can participate, plus create a post or other object; tag a user or object or publish in a topic.\n- **Caretaker**: can perform all of the above actions and more, including actions like deletion.\n\nThere are also negative roles, indicating actions which you specifically do not want to allow a particular circle or user to do, such as:\n\n- **Cannot Read**: not discoverable in lists or readable, and also can't interact or participate.\n- **Cannot Interact**: cannot perform any actions related to interaction, including liking, following, boosting, and pinning, and also can't participate.\n- **Cannot Participate**: cannot perform any actions related to participation, including replying, mentioning, and sending messages.\n\nNegative permissions always take precedence over positive or undefined permissions. For example, For example, if you share something giving permission to anyone to read and reply to it, and you assign the *Cannot Participate* role to your *Likely to troll* circle, the people in that circle will be able to read the content but will not be able to reply to it.\n\n> Note that these negative roles do not grant any additional permissions. Assigning the Cannot Participate role to someone who wouldn't otherwise be able to read the content does not mean they will now have the ability to do so. Negative roles simply limit or override any permissions defined elsewhere, ensuring that the specified actions are explicitly restricted.","ref":"Bonfire.Boundaries.Roles.html"},{"type":"function","title":"Bonfire.Boundaries.Roles.cannot_role_from_verb/5","doc":"Determines a matching negative role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#cannot_role_from_verb/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.cannot_role_from_verb/5","doc":"iex> cannot_role_from_verb(verbs)","ref":"Bonfire.Boundaries.Roles.html#cannot_role_from_verb/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.create/2","doc":"Creates a role with given attributes and options.","ref":"Bonfire.Boundaries.Roles.html#create/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.create/2","doc":"iex> create(attrs, opts)","ref":"Bonfire.Boundaries.Roles.html#create/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.create/3","doc":"Creates a role with a given name, usage, and options.","ref":"Bonfire.Boundaries.Roles.html#create/3"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.create/3","doc":"iex> create(\"Admin\", :admin, opts)\n # creates an admin role with the provided options","ref":"Bonfire.Boundaries.Roles.html#create/3-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.edit_verb_permission/4","doc":"Edits a verb permission for a role","ref":"Bonfire.Boundaries.Roles.html#edit_verb_permission/4"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.edit_verb_permission/4","doc":"iex> edit_verb_permission(:admin, :read, true, opts)\n # updates the read permission for the admin role to true\n\n iex> edit_verb_permission(:admin, :read, false, opts)\n # updates the read permission for the admin role to false\n\n iex> edit_verb_permission(:admin, :read, nil, opts)\n # resets the read permission for the admin role to default","ref":"Bonfire.Boundaries.Roles.html#edit_verb_permission/4-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.get/2","doc":"Retrieves the details of a role by `role_name`.","ref":"Bonfire.Boundaries.Roles.html#get/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.get/2","doc":"iex> get(:admin)\n # returns admin role details","ref":"Bonfire.Boundaries.Roles.html#get/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.preset_boundary_role_from_acl/1","doc":"Determines the preset boundary role from an ACL summary or list of verbs.","ref":"Bonfire.Boundaries.Roles.html#preset_boundary_role_from_acl/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.preset_boundary_role_from_acl/1","doc":"iex> preset_boundary_role_from_acl(%{verbs: verbs})\n\n iex> preset_boundary_role_from_acl(verbs)","ref":"Bonfire.Boundaries.Roles.html#preset_boundary_role_from_acl/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.reset_instance_roles/0","doc":"Clears instance-wide roles from config.","ref":"Bonfire.Boundaries.Roles.html#reset_instance_roles/0"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_from_grants/2","doc":"Determines the matching role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#role_from_grants/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_from_grants/2","doc":"iex> role_from_grants(grants)","ref":"Bonfire.Boundaries.Roles.html#role_from_grants/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_from_verb/5","doc":"Determines a matching positive role (if any) from a list of verbs.","ref":"Bonfire.Boundaries.Roles.html#role_from_verb/5"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_from_verb/5","doc":"iex> role_from_verb(verbs)","ref":"Bonfire.Boundaries.Roles.html#role_from_verb/5-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.role_verbs/2","doc":"Retrieves role verbs based on the given `usage`.","ref":"Bonfire.Boundaries.Roles.html#role_verbs/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.role_verbs/2","doc":"iex> role_verbs(:all, scope: :instance)\n # returns all instance-level role verbs\n\n iex> role_verbs(nil, current_user: me)\n # returns my role verbs","ref":"Bonfire.Boundaries.Roles.html#role_verbs/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.roles_for_dropdown/2","doc":"Returns a list of roles to be used in a user's a dropdown menu.","ref":"Bonfire.Boundaries.Roles.html#roles_for_dropdown/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.roles_for_dropdown/2","doc":"iex> roles_for_dropdown(:ops, current_user: me)","ref":"Bonfire.Boundaries.Roles.html#roles_for_dropdown/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.split_tuples_can_cannot/1","doc":"Splits a list of tuples into can and cannot categories.","ref":"Bonfire.Boundaries.Roles.html#split_tuples_can_cannot/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.split_tuples_can_cannot/1","doc":"iex> split_tuples_can_cannot(tuples)\n # splits tuples into can and cannot categories","ref":"Bonfire.Boundaries.Roles.html#split_tuples_can_cannot/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Roles.verbs_for_role/2","doc":"Returns a list of positive and negative verbs for the given role.","ref":"Bonfire.Boundaries.Roles.html#verbs_for_role/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Roles.verbs_for_role/2","doc":"iex> verbs_for_role(:admin)\n {:ok, positive_verbs, negative_verbs}","ref":"Bonfire.Boundaries.Roles.html#verbs_for_role/2-examples"},{"type":"module","title":"Bonfire.Boundaries.RuntimeConfig","doc":"","ref":"Bonfire.Boundaries.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Boundaries.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.Boundaries.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Boundaries.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Boundaries.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Boundaries.Scaffold","doc":"Provides functions to create default boundary fixtures for the instance or for users.","ref":"Bonfire.Boundaries.Scaffold.html"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.create_default_boundaries/1","doc":"","ref":"Bonfire.Boundaries.Scaffold.html#create_default_boundaries/1"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.create_missing_boundaries/1","doc":"","ref":"Bonfire.Boundaries.Scaffold.html#create_missing_boundaries/1"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.insert/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.html#insert/0"},{"type":"module","title":"Bonfire.Boundaries.Scaffold.Instance","doc":"Provides functions to create default boundary fixtures for the instance.","ref":"Bonfire.Boundaries.Scaffold.Instance.html"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.activity_pub_circle/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#activity_pub_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.admin_circle/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#admin_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.custom_acl/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#custom_acl/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.fixtures/0","doc":"Prepares and returns the fixtures for ACLs, circles, verbs, named entities, and grants.","ref":"Bonfire.Boundaries.Scaffold.Instance.html#fixtures/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.global_circles/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#global_circles/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.insert/0","doc":"Prepares fixtures and inserts them into the database.","ref":"Bonfire.Boundaries.Scaffold.Instance.html#insert/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.instance_acl/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#instance_acl/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.mod_circle/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Instance.html#mod_circle/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Instance.upsert_verbs/0","doc":"Inserts or updates the verbs in the database.","ref":"Bonfire.Boundaries.Scaffold.Instance.html#upsert_verbs/0"},{"type":"module","title":"Bonfire.Boundaries.Scaffold.Users","doc":"Provides batching functionality to insert/update default boundary fixtures for all users.\n\nThe functions that define and insert user fixtures are defined in `Bonfire.Boundaries.Users` and `Bonfire.Boundaries.Users.PreparedBoundaries`.","ref":"Bonfire.Boundaries.Scaffold.Users.html"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Users.down/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Users.html#down/0"},{"type":"function","title":"Bonfire.Boundaries.Scaffold.Users.up/0","doc":"","ref":"Bonfire.Boundaries.Scaffold.Users.html#up/0"},{"type":"module","title":"Bonfire.Boundaries.Summary","doc":"View that facilities the querying of objects' boundaries. See `Bonfire.Boundaries.Queries` for how it is used.","ref":"Bonfire.Boundaries.Summary.html"},{"type":"function","title":"Bonfire.Boundaries.Summary.drop_views/1","doc":"","ref":"Bonfire.Boundaries.Summary.html#drop_views/1"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate/1","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate/1"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate_functions/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate_functions/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.migrate_views/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#migrate_views/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.refresh/0","doc":"A function that refreshes a current version of the view,\ndefined in module.\nCurrently support only materialized views.\n\n iex> Catalog.refresh\n :ok","ref":"Bonfire.Boundaries.Summary.html#refresh/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.refresh_material_view/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#refresh_material_view/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.repo/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#repo/0"},{"type":"function","title":"Bonfire.Boundaries.Summary.source/0","doc":"","ref":"Bonfire.Boundaries.Summary.html#source/0"},{"type":"module","title":"Bonfire.Boundaries.Users","doc":"Reads fixtures in configuration and creates a default boundaries setup for a user","ref":"Bonfire.Boundaries.Users.html"},{"type":"function","title":"Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"Creates the default boundaries setup for a newly-created user.","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"- `user`: The user for whom to create the default boundaries.\n - `opts`: Optional parameters for customizing the boundaries (such as whether the user is `undiscoverable` or requires `request_before_follow`)","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Users.create_default_boundaries/2","doc":"> Bonfire.Boundaries.Users.create_default_boundaries(user)","ref":"Bonfire.Boundaries.Users.html#create_default_boundaries/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"Creates any missing boundaries for an existing user. Used when the app or config has defined some new types of default boundaries.","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1"},{"type":"function","title":"Parameters - Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"- `user`: The user for whom to create the missing boundaries.\n - `opts`: Optional parameters for customizing the boundaries (not currently used)","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1-parameters"},{"type":"function","title":"Examples - Bonfire.Boundaries.Users.create_missing_boundaries/1","doc":"> Bonfire.Boundaries.Users.create_missing_boundaries(user)","ref":"Bonfire.Boundaries.Users.html#create_missing_boundaries/1-examples"},{"type":"module","title":"Bonfire.Boundaries.Users.PreparedBoundaries","doc":"This module structures the information about the default boundaries for a newly created user before they are inserted in the database.\nIt takes care of reading the configuration about the default boundaries and prepare the information for the Bonfire.Boundaries.Users module.","ref":"Bonfire.Boundaries.Users.PreparedBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Users.PreparedBoundaries.from_config/3","doc":"Creates PreparedBoundaries for a given user based on the runtime config.","ref":"Bonfire.Boundaries.Users.PreparedBoundaries.html#from_config/3"},{"type":"module","title":"Bonfire.Boundaries.Verbs","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.\n\nThe corresponding Ecto schema is `Bonfire.Data.AccessControl.Verb` which is defined in a [seperate repo](https://github.com/bonfire-networks/bonfire_data_access_control).","ref":"Bonfire.Boundaries.Verbs.html"},{"type":"function","title":"Bonfire.Boundaries.Verbs.changeset/2","doc":"Returns a changeset for the given verb and attributes.","ref":"Bonfire.Boundaries.Verbs.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.changeset/2","doc":"iex> Bonfire.Boundaries.Verbs.changeset(%{verb: :new_verb, description: \"A new verb\"})","ref":"Bonfire.Boundaries.Verbs.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.create/1","doc":"Creates a new verb with the given attributes.","ref":"Bonfire.Boundaries.Verbs.html#create/1"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.create/1","doc":"> Bonfire.Boundaries.Verbs.create(%{verb: :new_verb, description: \"A new verb\"})\n{:ok, %Verb{id: \"new_verb_id\", verb: :new_verb, description: \"A new verb\"}}","ref":"Bonfire.Boundaries.Verbs.html#create/1-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get/2","doc":"Retrieves a verb by its slug or ID.","ref":"Bonfire.Boundaries.Verbs.html#get/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get/2","doc":"iex> Bonfire.Boundaries.Verbs.get(:read)\n %{id: \"read_id\", verb: :read}\n\n iex> Bonfire.Boundaries.Verbs.get(\"read_id\")\n %{id: \"read_id\", verb: :read}\n\n iex> Bonfire.Boundaries.Verbs.get(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get!/2","doc":"Retrieves verb details by its ID or name, raising an error if not found.","ref":"Bonfire.Boundaries.Verbs.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get!/2","doc":"iex> Bonfire.Boundaries.Verbs.get!(\"read\")\n %{id: \"some_id\", verb: :read} # Example output\n\n iex> Bonfire.Boundaries.Verbs.get!(\"non_existent_id\")\n ** (RuntimeError) Missing default verb: \"non_existent_id\"","ref":"Bonfire.Boundaries.Verbs.html#get!/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_id/2","doc":"Retrieves a verb ID by its slug.","ref":"Bonfire.Boundaries.Verbs.html#get_id/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_id/2","doc":"iex> Bonfire.Boundaries.Verbs.get_id(:read)\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id(\"read\")\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get_id/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_id!/2","doc":"Retrieves a verb ID by its slug or ID, raising an error if not found.\n\n iex> Bonfire.Boundaries.Verbs.get_id!(:read)\n \"read_id\"\n\n iex> Bonfire.Boundaries.Verbs.get_id!(\"non_existent\")\n ** (RuntimeError) Missing default verb: \"non_existent\"","ref":"Bonfire.Boundaries.Verbs.html#get_id!/2"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_slug/2","doc":"Retrieves a verb slug by its ID or name.","ref":"Bonfire.Boundaries.Verbs.html#get_slug/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_slug/2","doc":"iex> Bonfire.Boundaries.Verbs.get_slug(\"read_id\")\n :read","ref":"Bonfire.Boundaries.Verbs.html#get_slug/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.get_tuple/2","doc":"Retrieves a verb tuple by its ID or name.","ref":"Bonfire.Boundaries.Verbs.html#get_tuple/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.get_tuple/2","doc":"iex> Bonfire.Boundaries.Verbs.get_tuple(\"read_id\")\n {:read, %{id: \"read_id\", verb: :read}}\n\n iex> Bonfire.Boundaries.Verbs.get_tuple(\"non_existent\")\n nil","ref":"Bonfire.Boundaries.Verbs.html#get_tuple/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.ids/2","doc":"Retrieves the IDs of the given verbs.\n\n iex> Bonfire.Boundaries.Verbs.ids([:read, :write])\n [\"read_id\", \"write_id\"]\n\n iex> Bonfire.Boundaries.Verbs.ids(:read)\n [\"read_id\"]","ref":"Bonfire.Boundaries.Verbs.html#ids/2"},{"type":"function","title":"Bonfire.Boundaries.Verbs.list/2","doc":"Lists the verbs from the specified source and key.","ref":"Bonfire.Boundaries.Verbs.html#list/2"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.list/2","doc":"iex> Bonfire.Boundaries.Verbs.list(:db, :verb)\n %{read: %Verb{id: \"read_id\", verb: :read}, write: %Verb{id: \"write_id\", verb: :write}}\n\n iex> Bonfire.Boundaries.Verbs.list(:instance, :id)\n [\"read_id\", \"write_id\"]","ref":"Bonfire.Boundaries.Verbs.html#list/2-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.list_verbs_debug/0","doc":"Returns a debug list of verbs by comparing the database and code.","ref":"Bonfire.Boundaries.Verbs.html#list_verbs_debug/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.list_verbs_debug/0","doc":"> Bonfire.Boundaries.Verbs.list_verbs_debug()\n # Example output:\n [ok: :read, error: \"Code and DB have differing IDs for the same verb\", ...]","ref":"Bonfire.Boundaries.Verbs.html#list_verbs_debug/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.slugs/0","doc":"Returns the list of verb slugs.","ref":"Bonfire.Boundaries.Verbs.html#slugs/0"},{"type":"function","title":"Examples - Bonfire.Boundaries.Verbs.slugs/0","doc":"iex> Bonfire.Boundaries.Verbs.slugs()\n [:read, :write]","ref":"Bonfire.Boundaries.Verbs.html#slugs/0-examples"},{"type":"function","title":"Bonfire.Boundaries.Verbs.verbs/0","doc":"Returns the list of verbs from the configuration.","ref":"Bonfire.Boundaries.Verbs.html#verbs/0"},{"type":"function","title":"Bonfire.Boundaries.Verbs.verbs_count/0","doc":"Returns the count of verbs in the configuration.","ref":"Bonfire.Boundaries.Verbs.html#verbs_count/0"},{"type":"module","title":"Bonfire.Boundaries.Web.ExcludeBoundaries","doc":"","ref":"Bonfire.Boundaries.Web.ExcludeBoundaries.html"},{"type":"function","title":"Bonfire.Boundaries.Web.ExcludeBoundaries.handle_event/3","doc":"","ref":"Bonfire.Boundaries.Web.ExcludeBoundaries.html#handle_event/3"},{"type":"module","title":"Bonfire.Boundaries.Web.Routes","doc":"","ref":"Bonfire.Boundaries.Web.Routes.html"},{"type":"function","title":"Bonfire.Boundaries.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Boundaries.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Common","doc":"A library of common utils and helpers used across Bonfire extensions.\n\nAn extension for [Bonfire](https://bonfire.cafe/) that contains:\n\n- Many common functions in `Bonfire.Common.Utils`\n- Path and URL generators in `Bonfire.Common.URIs`\n- Date and time helpers in `Bonfire.Common.DatesTimes`\n- Etc","ref":"Bonfire.Common.html"},{"type":"module","title":"Handy commands - Bonfire.Common","doc":"","ref":"Bonfire.Common.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Common","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Common.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Common.maybe_fallback/2","doc":"Provides a fallback value or function when the first argument is `nil`.\n\n- If the first argument is not `nil`, returns the first argument as is.\n- If both arguments are `nil`, returns `nil`.\n- If the first argument is `nil` and the second argument is a function, calls the function and returns its result.\n- If the first argument is `nil` and the second argument is not a function, returns the second argument as is.","ref":"Bonfire.Common.html#maybe_fallback/2"},{"type":"function","title":"Examples - Bonfire.Common.maybe_fallback/2","doc":"iex> maybe_fallback(\"value\", \"fallback value\")\n \"value\"\n \n iex> maybe_fallback(nil, nil)\n nil\n\n iex> maybe_fallback(nil, fn -> 1+2 end)\n 3\n\n iex> maybe_fallback(nil, \"fallback value\")\n \"fallback value\"","ref":"Bonfire.Common.html#maybe_fallback/2-examples"},{"type":"module","title":"Bonfire.Common.AntiSpam","doc":"Module to load the service adapter defined inside the configuration.\n\nSee `Bonfire.Common.AntiSpam.Provider`.","ref":"Bonfire.Common.AntiSpam.html"},{"type":"function","title":"Bonfire.Common.AntiSpam.service/0","doc":"Returns the appropriate service adapter.\n\nAccording to the config behind\n `config :mobilizon, Bonfire.Common.AntiSpam,\n service: Bonfire.Common.AntiSpam.Module`","ref":"Bonfire.Common.AntiSpam.html#service/0"},{"type":"module","title":"Bonfire.Common.AntiSpam.Akismet","doc":"Integration with Akismet.com for spam detection\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Akismet.html"},{"type":"module","title":"Bonfire.Common.AntiSpam.BumblebeeAdapter","doc":"Integration with Bumblebee model(s) for anti-spam detection.","ref":"Bonfire.Common.AntiSpam.BumblebeeAdapter.html"},{"type":"module","title":"Bonfire.Common.AntiSpam.Mock","doc":"Mock for Anti-spam Provider implementations.\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Mock.html"},{"type":"behaviour","title":"Bonfire.Common.AntiSpam.Provider","doc":"Provider Behaviour for anti-spam detection.","ref":"Bonfire.Common.AntiSpam.Provider.html"},{"type":"behaviour","title":"Supported backends - Bonfire.Common.AntiSpam.Provider","doc":"* `Bonfire.Common.AntiSpam.Akismet` [🔗](https://akismet.com/)\n\nCredit to https://joinmobilizon.org for the original code.","ref":"Bonfire.Common.AntiSpam.Provider.html#module-supported-backends"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_comment/3","doc":"Check a comment (or microblog) details","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_comment/3"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_current_user/1","doc":"Check an user/account's details","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_current_user/1"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_object/2","doc":"Check an object details (such as a blog post)","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_object/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.check_profile/2","doc":"Check profile info","ref":"Bonfire.Common.AntiSpam.Provider.html#c:check_profile/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.ready?/0","doc":"Make sure the provider is ready","ref":"Bonfire.Common.AntiSpam.Provider.html#c:ready?/0"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.report_ham/2","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#c:report_ham/2"},{"type":"callback","title":"Bonfire.Common.AntiSpam.Provider.report_spam/2","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#c:report_spam/2"},{"type":"type","title":"Bonfire.Common.AntiSpam.Provider.result/0","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#t:result/0"},{"type":"type","title":"Bonfire.Common.AntiSpam.Provider.spam_result/0","doc":"","ref":"Bonfire.Common.AntiSpam.Provider.html#t:spam_result/0"},{"type":"module","title":"Bonfire.Common.Benchmark","doc":"Simple way to measure the execution time of functions. It is preferred to use `@decorate` from `Untangle` instead.","ref":"Bonfire.Common.Benchmark.html"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/1","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/1"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/2","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/2"},{"type":"function","title":"Bonfire.Common.Benchmark.apply_timed/3","doc":"","ref":"Bonfire.Common.Benchmark.html#apply_timed/3"},{"type":"module","title":"Bonfire.Common.Cache","doc":"Helpers for caching data and operations","ref":"Bonfire.Common.Cache.html"},{"type":"function","title":"Bonfire.Common.Cache.cache_store/1","doc":"","ref":"Bonfire.Common.Cache.html#cache_store/1"},{"type":"function","title":"Bonfire.Common.Cache.cached_preloads_for_objects/3","doc":"","ref":"Bonfire.Common.Cache.html#cached_preloads_for_objects/3"},{"type":"function","title":"Bonfire.Common.Cache.get/2","doc":"","ref":"Bonfire.Common.Cache.html#get/2"},{"type":"function","title":"Bonfire.Common.Cache.get!/2","doc":"","ref":"Bonfire.Common.Cache.html#get!/2"},{"type":"function","title":"Bonfire.Common.Cache.maybe_apply_cached/3","doc":"Takes a function (or module and function names) and a set of arguments for that function, and tries to fetch the previous result of running that function from the in-memory cache, using the MFA (module name/function name/arguments used) to generate the cache key. If it's not in the cache, it executes the function, and caches and returns the result.","ref":"Bonfire.Common.Cache.html#maybe_apply_cached/3"},{"type":"function","title":"Bonfire.Common.Cache.put/3","doc":"","ref":"Bonfire.Common.Cache.html#put/3"},{"type":"function","title":"Bonfire.Common.Cache.remove/2","doc":"It removes the entry associated with a key from the cache.","ref":"Bonfire.Common.Cache.html#remove/2"},{"type":"function","title":"Bonfire.Common.Cache.remove_all/1","doc":"","ref":"Bonfire.Common.Cache.html#remove_all/1"},{"type":"function","title":"Bonfire.Common.Cache.reset/3","doc":"It removes the result of a given function from the cache.","ref":"Bonfire.Common.Cache.html#reset/3"},{"type":"module","title":"Bonfire.Common.Cache.DiskCache","doc":"","ref":"Bonfire.Common.Cache.DiskCache.html"},{"type":"module","title":"Bonfire.Common.Changelog.Github.DataGrabber","doc":"Datagrabber for changelog generation, `Versioce.Config.Changelog.datagrabber/0`\n\nUses repository history to obtain and format data.","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.fetch_issues/1","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#fetch_issues/1"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.format_issue/1","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#format_issue/1"},{"type":"function","title":"Bonfire.Common.Changelog.Github.DataGrabber.prepare_data/2","doc":"","ref":"Bonfire.Common.Changelog.Github.DataGrabber.html#prepare_data/2"},{"type":"module","title":"Bonfire.Common.Config","doc":"Helpers to get app/extension OTP config, or to override a config key. Basically a wrapper of `Application.get_env/3` and `Application.put_env/3`.","ref":"Bonfire.Common.Config.html"},{"type":"macro","title":"Bonfire.Common.Config.compilation_error/1","doc":"","ref":"Bonfire.Common.Config.html#compilation_error/1"},{"type":"function","title":"Bonfire.Common.Config.delete/2","doc":"Deletes the configuration value for a key in a specific OTP app or extension.\n\nThis function removes the configuration value for the given key from the specified OTP app or extension.","ref":"Bonfire.Common.Config.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.delete/2","doc":"iex> delete(:key)\n :ok\n\n iex> delete([:nested, :key], :my_app)\n :ok","ref":"Bonfire.Common.Config.html#delete/2-examples"},{"type":"function","title":"Bonfire.Common.Config.endpoint_module/0","doc":"Retrieves the Phoenix endpoint module for the application.\n\nThis function first attempts to fetch the Phoenix endpoint module from the `:phoenix_endpoint_module` key in the process dictionary. If not found, it retrieves the value from the application configuration, defaulting to `Bonfire.Web.Endpoint` if not configured.","ref":"Bonfire.Common.Config.html#endpoint_module/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.endpoint_module/0","doc":"iex> endpoint_module()\n Bonfire.Web.Endpoint","ref":"Bonfire.Common.Config.html#endpoint_module/0-examples"},{"type":"function","title":"Bonfire.Common.Config.env/0","doc":"Retrieves the environment configuration for the application.\n\nThis function returns the value of the `:env` configuration key for the application.","ref":"Bonfire.Common.Config.html#env/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.env/0","doc":"iex> env()\n :test","ref":"Bonfire.Common.Config.html#env/0-examples"},{"type":"function","title":"Bonfire.Common.Config.get/3","doc":"Retrieves a configuration value for a key, optionally from a specific OTP app or extension.\n\nThis function can handle single keys or nested key trees and returns the configuration value associated with the key(s). It falls back to a default value if the key is not found.","ref":"Bonfire.Common.Config.html#get/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.get/3","doc":"iex> get(:test_key, \"default\")\n \"test_value\"\n\n iex> get([:nested, :key], \"default\", :bonfire)\n \"default\"\n\n iex> get(:missing_key, \"default\")\n \"default\"","ref":"Bonfire.Common.Config.html#get/3-examples"},{"type":"function","title":"Bonfire.Common.Config.get!/2","doc":"Retrieves the configuration value for a key and raises an error if the value is not found.","ref":"Bonfire.Common.Config.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.get!/2","doc":"iex> get!(:test_key)\n \"test_value\"\n\n iex> get!(:missing_key)\n ** (Bonfire.Common.Config.Error) Missing configuration value: [:bonfire, :missing_key]","ref":"Bonfire.Common.Config.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext/1","doc":"Retrieves all configuration keys and values for a specific Bonfire extension or OTP app.","ref":"Bonfire.Common.Config.html#get_ext/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext/1","doc":"> get_ext(:my_extension)\n [key1: \"value1\", key2: \"value2\"]\n\n > get_ext(:another_extension)\n []","ref":"Bonfire.Common.Config.html#get_ext/1-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext/3","doc":"Retrieves a configuration value for a specific Bonfire extension or OTP app key.\n\nThis function attempts to get the configuration value for the given key from the specified extension or OTP app. If the key is not found, it falls back to checking the top-level Bonfire app configuration.","ref":"Bonfire.Common.Config.html#get_ext/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext/3","doc":"iex> get_ext(:bonfire_common, :test_key, \"default\")\n \"test_value\"\n\n iex> get_ext(:my_extension, :missing_key, \"default\")\n \"default\"","ref":"Bonfire.Common.Config.html#get_ext/3-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext!/1","doc":"Retrieves all configuration keys and values for a specific Bonfire extension or OTP app and raises an error if no configuration is found.","ref":"Bonfire.Common.Config.html#get_ext!/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext!/1","doc":"iex> config = get_ext!(:bonfire_common)\n iex> is_list(config) and config !=[]\n true\n\n iex> get_ext!(:non_existent_extension)\n ** (Bonfire.Common.Config.Error) Empty configuration for extension: non_existent_extension","ref":"Bonfire.Common.Config.html#get_ext!/1-examples"},{"type":"function","title":"Bonfire.Common.Config.get_ext!/2","doc":"Retrieves the configuration value for a specific Bonfire extension or OTP app key and raises an error if the value is not found.\n\nThis function attempts to get the configuration value for the given key from the specified extension or OTP app. If the key is not present or the value is nil, it raises a compilation error.","ref":"Bonfire.Common.Config.html#get_ext!/2"},{"type":"function","title":"Examples - Bonfire.Common.Config.get_ext!/2","doc":"iex> get_ext!(:bonfire_common, :test_key)\n \"test_value\"\n\n iex> get_ext!(:my_extension, :missing_key)\n ** (Bonfire.Common.Config.Error) Missing configuration value: [:my_extension, :missing_key]","ref":"Bonfire.Common.Config.html#get_ext!/2-examples"},{"type":"function","title":"Bonfire.Common.Config.get_for_process/1","doc":"","ref":"Bonfire.Common.Config.html#get_for_process/1"},{"type":"function","title":"Bonfire.Common.Config.keys_tree/1","doc":"Constructs a key path for configuration settings, which always starts with an app or extension name. It starts with the main OTP app or extension and includes additional keys as specified.\n\n > keys_tree([:bonfire_me, Bonfire.Me.Users])\n [:bonfire_me, Bonfire.Me.Users]\n\n > keys_tree(Bonfire.Me.Users)\n [:bonfire_me, Bonfire.Me.Users]\n\n > keys_tree(:bonfire_me)\n [:bonfire_me]\n\n iex> keys_tree(:random_atom)\n [:bonfire, :random_atom]\n\n iex>keys_tree([:random_atom, :sub_key])\n [:bonfire, :random_atom, :sub_key]","ref":"Bonfire.Common.Config.html#keys_tree/1"},{"type":"function","title":"Bonfire.Common.Config.module_enabled?/1","doc":"","ref":"Bonfire.Common.Config.html#module_enabled?/1"},{"type":"function","title":"Bonfire.Common.Config.put/1","doc":"","ref":"Bonfire.Common.Config.html#put/1"},{"type":"function","title":"Bonfire.Common.Config.put/3","doc":"Sets the configuration value for a key or key tree in a specific OTP app or extension.\n\nThis function allows you to set the configuration value for the specified key(s) in the given OTP app or extension. It supports nested configurations.","ref":"Bonfire.Common.Config.html#put/3"},{"type":"function","title":"Examples - Bonfire.Common.Config.put/3","doc":"iex> put(:test_key, \"test_value\")\n :ok\n\n iex> put([:nested, :key], \"test_value\", :my_app)\n :ok","ref":"Bonfire.Common.Config.html#put/3-examples"},{"type":"function","title":"Bonfire.Common.Config.repo/0","doc":"Retrieves the Ecto repository module for the application.\n\nThis function first attempts to fetch the Ecto repository module from the `:ecto_repo_module` key in the process dictionary. If not found, it retrieves the value from the application configuration, and defaults to `Bonfire.Common.Repo` if not configured.","ref":"Bonfire.Common.Config.html#repo/0"},{"type":"function","title":"Examples - Bonfire.Common.Config.repo/0","doc":"iex> repo()\n Bonfire.Common.Repo","ref":"Bonfire.Common.Config.html#repo/0-examples"},{"type":"function","title":"Bonfire.Common.Config.require_extension_config!/1","doc":"Raises an error if the specified Bonfire extension is not configured.\n\nThis function checks whether the configuration for a given Bonfire extension exists. If the configuration is missing, it raises a compilation error with a message indicating how to set up the configuration file.","ref":"Bonfire.Common.Config.html#require_extension_config!/1"},{"type":"function","title":"Examples - Bonfire.Common.Config.require_extension_config!/1","doc":"iex> require_extension_config!(:some_extension)\n ** (Bonfire.Common.Config.Error) You have not configured the `some_extension` Bonfire extension, please `cp ./deps/some_extension/config/some_extension.exs ./config/some_extension.exs` in your Bonfire app repository and then customise the copied config as necessary","ref":"Bonfire.Common.Config.html#require_extension_config!/1-examples"},{"type":"function","title":"Bonfire.Common.Config.top_level_otp_app/0","doc":"","ref":"Bonfire.Common.Config.html#top_level_otp_app/0"},{"type":"exception","title":"Bonfire.Common.Config.Error","doc":"","ref":"Bonfire.Common.Config.Error.html"},{"type":"module","title":"Bonfire.Common.Config.LoadExtensionsConfig","doc":"Loads instance Settings from DB into Elixir's Config\n\nWhile this module is a GenServer, it is only responsible for querying the settings, putting them in Config, and then exits with :ignore having done so.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.load_configs/1","doc":"","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#load_configs/1"},{"type":"function","title":"Bonfire.Common.Config.LoadExtensionsConfig.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Bonfire.Common.Config.LoadExtensionsConfig.html#start_link/1"},{"type":"behaviour","title":"Bonfire.Common.ConfigModule","doc":"A global cache of runtime config modules to be loaded at app startup.","ref":"Bonfire.Common.ConfigModule.html"},{"type":"callback","title":"Bonfire.Common.ConfigModule.config/0","doc":"Set runtime config","ref":"Bonfire.Common.ConfigModule.html#c:config/0"},{"type":"callback","title":"Bonfire.Common.ConfigModule.config_module/0","doc":"Declares a config module","ref":"Bonfire.Common.ConfigModule.html#c:config_module/0"},{"type":"function","title":"Bonfire.Common.ConfigModule.modules/0","doc":"","ref":"Bonfire.Common.ConfigModule.html#modules/0"},{"type":"behaviour","title":"Bonfire.Common.ContextModule","doc":"Find a context or query module via its schema, backed by a global cache of known modules.","ref":"Bonfire.Common.ContextModule.html"},{"type":"function","title":"Bonfire.Common.ContextModule.apply_error/2","doc":"","ref":"Bonfire.Common.ContextModule.html#apply_error/2"},{"type":"function","title":"Bonfire.Common.ContextModule.context_function_error/2","doc":"","ref":"Bonfire.Common.ContextModule.html#context_function_error/2"},{"type":"callback","title":"Bonfire.Common.ContextModule.context_module/0","doc":"Declares a context module","ref":"Bonfire.Common.ContextModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.ContextModule.context_module/1","doc":"Get a context identified by schema","ref":"Bonfire.Common.ContextModule.html#context_module/1"},{"type":"function","title":"Bonfire.Common.ContextModule.context_module!/1","doc":"Look up a context, throw :not_found if not found.","ref":"Bonfire.Common.ContextModule.html#context_module!/1"},{"type":"function","title":"Bonfire.Common.ContextModule.context_modules/1","doc":"Look up many contexts at once, throw :not_found if any of them are not found","ref":"Bonfire.Common.ContextModule.html#context_modules/1"},{"type":"function","title":"Bonfire.Common.ContextModule.linked_query_modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#linked_query_modules/0"},{"type":"function","title":"Bonfire.Common.ContextModule.linked_schema_modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#linked_schema_modules/0"},{"type":"function","title":"Bonfire.Common.ContextModule.maybe_apply/4","doc":"Given an object or schema module name, run a function on the associated context module.\nTODO: refactor to re-use Utils.maybe_apply?","ref":"Bonfire.Common.ContextModule.html#maybe_apply/4"},{"type":"function","title":"Bonfire.Common.ContextModule.maybe_context_module/1","doc":"","ref":"Bonfire.Common.ContextModule.html#maybe_context_module/1"},{"type":"function","title":"Bonfire.Common.ContextModule.modules/0","doc":"","ref":"Bonfire.Common.ContextModule.html#modules/0"},{"type":"callback","title":"Bonfire.Common.ContextModule.query_module/0","doc":"Points to the related queries module","ref":"Bonfire.Common.ContextModule.html#c:query_module/0"},{"type":"callback","title":"Bonfire.Common.ContextModule.schema_module/0","doc":"Points to the related schema module","ref":"Bonfire.Common.ContextModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.Crypto","doc":"","ref":"Bonfire.Common.Crypto.html"},{"type":"function","title":"Bonfire.Common.Crypto.decrypt_with_auth_key/3","doc":"","ref":"Bonfire.Common.Crypto.html#decrypt_with_auth_key/3"},{"type":"function","title":"Bonfire.Common.Crypto.encrypt_with_auth_key/2","doc":"","ref":"Bonfire.Common.Crypto.html#encrypt_with_auth_key/2"},{"type":"function","title":"Bonfire.Common.Crypto.encrypt_with_auth_key/3","doc":"","ref":"Bonfire.Common.Crypto.html#encrypt_with_auth_key/3"},{"type":"module","title":"Bonfire.Common.DatesTimes","doc":"Date/time helpers","ref":"Bonfire.Common.DatesTimes.html"},{"type":"function","title":"Bonfire.Common.DatesTimes.available_format_keys/2","doc":"Returns a list of available format keys for the given locale.","ref":"Bonfire.Common.DatesTimes.html#available_format_keys/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.available_format_keys/2","doc":"> available_format_keys()\n [:short, :medium, :long, :full] # Example output","ref":"Bonfire.Common.DatesTimes.html#available_format_keys/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.available_formats/2","doc":"Returns a keyword list of available date/time formats for the given locale.","ref":"Bonfire.Common.DatesTimes.html#available_formats/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.available_formats/2","doc":"> available_formats()\n [short: \"Short\", medium: \"Medium\", long: \"Long\", full: \"Full\"] # Example output","ref":"Bonfire.Common.DatesTimes.html#available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.date_from_now/2","doc":"Takes a ULID ID (or an object with one) or a `DateTime` struct, and turns the date into a relative phrase, e.g. `2 days ago`.","ref":"Bonfire.Common.DatesTimes.html#date_from_now/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.date_from_now/2","doc":"> date_from_now(%{id: \"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\"})\n \"25 days ago\" # Example output\n\n > date_from_now(\"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\")\n \"25 days ago\" # Example output","ref":"Bonfire.Common.DatesTimes.html#date_from_now/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.date_from_pointer/1","doc":"Takes an object (or string with an ULID) and converts the ULID ID to a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#date_from_pointer/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.date_from_pointer/1","doc":"> date_from_pointer(\"01FJ6G6V9E7Y3A6HZ5F2M3K4RY\")\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#date_from_pointer/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.format/2","doc":"Formats a `DateTime` struct or date into a string using `Cldr.DateTime.to_string/2`.","ref":"Bonfire.Common.DatesTimes.html#format/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.format/2","doc":"> format(DateTime.now!(\"Etc/UTC\"))\n \"Jul 25, 2024, 11:08:21 AM\"","ref":"Bonfire.Common.DatesTimes.html#format/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.format_date/2","doc":"Formats a `Date` struct or date into a string using `Cldr.Date.to_string/2`.","ref":"Bonfire.Common.DatesTimes.html#format_date/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.format_date/2","doc":"> format(DateTime.now!(\"Etc/UTC\"))\n \"Jul 25, 2024, 11:08:21 AM\"","ref":"Bonfire.Common.DatesTimes.html#format_date/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.future?/1","doc":"Checks if a `DateTime` is in the future relative to the current time.","ref":"Bonfire.Common.DatesTimes.html#future?/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.future?/1","doc":"iex> future?(%Date{year: 3020, month: 7, day: 25})\n true # Example output\n\n iex> future?(%Date{year: 2023, month: 7, day: 25})\n false # Example output","ref":"Bonfire.Common.DatesTimes.html#future?/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.maybe_generate_ulid/1","doc":"Generates a ULID based on a `DateTime` or a string representation of a date/time, but only if the date/time is in the past.","ref":"Bonfire.Common.DatesTimes.html#maybe_generate_ulid/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.maybe_generate_ulid/1","doc":"> maybe_generate_ulid(%Date{year: 2024, month: 7, day: 25})\n \"01J3KJZZ00X1EXD6TZYD3PPDR6\" # Example output\n\n > maybe_generate_ulid(\"2024-07-25\")\n \"01J3KJZZ00X1EXD6TZYD3PPDR6\" # Example output","ref":"Bonfire.Common.DatesTimes.html#maybe_generate_ulid/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.now/0","doc":"Returns the current UTC `DateTime`.","ref":"Bonfire.Common.DatesTimes.html#now/0"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.now/0","doc":"> now()\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#now/0-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.past/2","doc":"Returns a `DateTime` in the past, relative to the current time, by subtracting a specified amount of time.","ref":"Bonfire.Common.DatesTimes.html#past/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.past/2","doc":"> past(10, :day)\n %DateTime{year: 2024, month: 7, day: 15, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#past/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.past?/1","doc":"Checks if a `DateTime` is in the past relative to the current time.","ref":"Bonfire.Common.DatesTimes.html#past?/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.past?/1","doc":"iex> past?(%Date{year: 3020, month: 7, day: 25})\n false # Example output\n\n iex> past?(%Date{year: 2023, month: 7, day: 24})\n true # Example output","ref":"Bonfire.Common.DatesTimes.html#past?/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.relative_date/2","doc":"Converts a `DateTime` struct to a relative date string. Uses `Cldr.DateTime` or `Timex` libraries.","ref":"Bonfire.Common.DatesTimes.html#relative_date/2"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.relative_date/2","doc":"iex> relative_date(DateTime.now!(\"Etc/UTC\"))\n \"now\" # Example output","ref":"Bonfire.Common.DatesTimes.html#relative_date/2-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.remove/3","doc":"Removes a specified amount of time from a `DateTime`.","ref":"Bonfire.Common.DatesTimes.html#remove/3"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.remove/3","doc":"> remove(%Date{year: 2024, month: 7, day: 25}, 10, :day)\n %DateTime{year: 2024, month: 7, day: 15, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#remove/3-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.to_date/1","doc":"Converts various formats into a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#to_date/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.to_date/1","doc":"iex> to_date(%Date{year: 2024, month: 7, day: 25})\n %Date{year: 2024, month: 7, day: 25} \n\n iex> to_date(\"2024-07-25\")\n %Date{year: 2024, month: 7, day: 25}\n\n iex> to_date(1656115200000)\n %Date{year: 2022, month: 6, day: 25} \n\n iex> to_date(%{\"day\" => 25, \"month\" => 7, \"year\" => 2024})\n %Date{year: 2024, month: 7, day: 25}","ref":"Bonfire.Common.DatesTimes.html#to_date/1-examples"},{"type":"function","title":"Bonfire.Common.DatesTimes.to_date_time/1","doc":"Converts various formats into a `DateTime` struct.","ref":"Bonfire.Common.DatesTimes.html#to_date_time/1"},{"type":"function","title":"Examples - Bonfire.Common.DatesTimes.to_date_time/1","doc":"> to_date_time(%Date{year: 2024, month: 7, day: 25})\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(\"2024-07-25\")\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(1656115200000)\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output\n\n > to_date_time(%{\"day\" => 25, \"month\" => 7, \"year\" => 2024})\n %DateTime{year: 2024, month: 7, day: 25, ...} # Example output","ref":"Bonfire.Common.DatesTimes.html#to_date_time/1-examples"},{"type":"module","title":"Bonfire.Common.E","doc":"Helper to extract data nested in an object","ref":"Bonfire.Common.E.html"},{"type":"function","title":"Bonfire.Common.E.e/2","doc":"","ref":"Bonfire.Common.E.html#e/2"},{"type":"macro","title":"Bonfire.Common.E.e/3","doc":"Extracts a value from a map or other data structure, or returns a fallback if not present or empty.\nIf additional arguments are provided, it searches for nested data structures, with the last argument always being the fallback.","ref":"Bonfire.Common.E.html#e/3"},{"type":"macro","title":"Examples - Bonfire.Common.E.e/3","doc":"iex> e(%{key: \"value\"}, :key, \"fallback\")\n \"value\"\n\n iex> e(%{key: nil}, :key, \"fallback\")\n \"fallback\"\n\n iex> e(%{key: \"value\"}, :missing_key, \"fallback\")\n \"fallback\"\n\n iex> e(%{key: %Ecto.Association.NotLoaded{}}, :key, \"fallback\")\n \"fallback\"\n\n iex> e({:ok, %{key: \"value\"}}, :key, \"fallback\") # FIXME\n \"value\"\n\n iex> e(%{__context__: %{key: \"context_value\"}}, :key, \"fallback\") # FIXME\n \"context_value\"\n\n iex> e(%{a: %{b: \"value\"}}, :a, :b, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %Ecto.Association.NotLoaded{}}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: nil}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, :d, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, \"fallback\")\n \"value\"\n\n iex> e(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, :ed, \"fallback\")\n \"fallback\"\n\n iex> e(%{a: %{b: %{c: %{d: %{e: \"value\"}}}}}, :a, :b, :c, :d, :e, \"fallback\")\n \"value\"","ref":"Bonfire.Common.E.html#e/3-examples"},{"type":"macro","title":"Bonfire.Common.E.e/4","doc":"","ref":"Bonfire.Common.E.html#e/4"},{"type":"macro","title":"Bonfire.Common.E.e/5","doc":"","ref":"Bonfire.Common.E.html#e/5"},{"type":"macro","title":"Bonfire.Common.E.e/6","doc":"","ref":"Bonfire.Common.E.html#e/6"},{"type":"macro","title":"Bonfire.Common.E.e/7","doc":"","ref":"Bonfire.Common.E.html#e/7"},{"type":"macro","title":"Bonfire.Common.E.e/8","doc":"","ref":"Bonfire.Common.E.html#e/8"},{"type":"function","title":"Bonfire.Common.E.ed/2","doc":"Returns a value if it is not empty, or a fallback value if it is empty.\n\nThis function delegates to `Bonfire.Common.Enums.filter_empty/2` to determine if `val` is empty and returns `fallback` if so.","ref":"Bonfire.Common.E.html#ed/2"},{"type":"function","title":"Examples - Bonfire.Common.E.ed/2","doc":"iex> ed(\"non-empty value\", \"fallback\")\n \"non-empty value\"\n\n iex> ed(\"\", \"fallback\")\n \"fallback\"\n\n iex> ed(nil, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.E.html#ed/2-examples"},{"type":"function","title":"Bonfire.Common.E.ed/3","doc":"Extracts a value from a map or other data structure, or returns a fallback if not present or empty.\nIf additional arguments are provided, it searches for nested data structures, with the last argument always being the fallback.","ref":"Bonfire.Common.E.html#ed/3"},{"type":"function","title":"Examples - Bonfire.Common.E.ed/3","doc":"iex> ed(%{key: \"value\"}, :key, \"fallback\")\n \"value\"\n\n iex> ed(%{key: nil}, :key, \"fallback\")\n \"fallback\"\n\n iex> ed(%{key: \"value\"}, :missing_key, \"fallback\")\n \"fallback\"\n\n iex> ed(%{key: %Ecto.Association.NotLoaded{}}, :key, \"fallback\")\n \"fallback\"\n\n iex> ed({:ok, %{key: \"value\"}}, :key, \"fallback\")\n \"value\"\n\n iex> ed(%{__context__: %{key: \"context_value\"}}, :key, \"fallback\")\n \"context_value\"\n\n iex> ed(%{a: %{b: \"value\"}}, :a, :b, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %Ecto.Association.NotLoaded{}}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: \"value\"}}, [:a, :b], \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: nil}}, :a, :b, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %{c: \"value\"}}}, :a, :b, :c, :d, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, \"fallback\")\n \"value\"\n\n iex> ed(%{a: %{b: %{c: %{d: \"value\"}}}}, :a, :b, :c, :d, :ed, \"fallback\")\n \"fallback\"\n\n iex> ed(%{a: %{b: %{c: %{d: %{e: \"value\"}}}}}, :a, :b, :c, :d, :e, \"fallback\")\n \"value\"","ref":"Bonfire.Common.E.html#ed/3-examples"},{"type":"function","title":"Bonfire.Common.E.ed/4","doc":"Returns a value from a nested map, or a fallback if not present","ref":"Bonfire.Common.E.html#ed/4"},{"type":"function","title":"Bonfire.Common.E.ed/5","doc":"","ref":"Bonfire.Common.E.html#ed/5"},{"type":"function","title":"Bonfire.Common.E.ed/6","doc":"","ref":"Bonfire.Common.E.html#ed/6"},{"type":"function","title":"Bonfire.Common.E.ed/7","doc":"","ref":"Bonfire.Common.E.html#ed/7"},{"type":"function","title":"Bonfire.Common.E.ed/8","doc":"","ref":"Bonfire.Common.E.html#ed/8"},{"type":"module","title":"Bonfire.Common.Enums","doc":"Extra functions to manipulate enumerables, basically an extension of `Enum`","ref":"Bonfire.Common.Enums.html"},{"type":"function","title":"Bonfire.Common.Enums.access_keys/2","doc":"","ref":"Bonfire.Common.Enums.html#access_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.all_ok?/1","doc":"Checks if all tuples in the enumerable are `:ok`.","ref":"Bonfire.Common.Enums.html#all_ok?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.all_ok?/1","doc":"iex> Bonfire.Common.Enums.all_ok?([{:ok, 1}, {:ok, 2}])\n true\n\n iex> Bonfire.Common.Enums.all_ok?([{:ok, 1}, {:error, \"failed\"}])\n false","ref":"Bonfire.Common.Enums.html#all_ok?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.all_oks_or_error/1","doc":"Filters the given value or enumerable and if it contains any `:error` tuple, return an `:error` tuple with a list of error values, other return an `:ok` tuple with a list of values.","ref":"Bonfire.Common.Enums.html#all_oks_or_error/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.all_oks_or_error/1","doc":"iex> Bonfire.Common.Enums.all_oks_or_error([{:ok, 1}, {:error, \"failed\"}])\n {:error, [\"failed\"]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error([{:ok, 2}, {:ok, 3}])\n {:ok, [2, 3]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error({:error, \"failed\"})\n {:error, [\"failed\"]}\n\n iex> Bonfire.Common.Enums.all_oks_or_error({:ok, 1})\n {:ok, [1]}","ref":"Bonfire.Common.Enums.html#all_oks_or_error/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.attr_get_id/2","doc":"Gets the value of a key in a map and returns the ID of that value (i.e. either the :id field of that association, or the value itself).","ref":"Bonfire.Common.Enums.html#attr_get_id/2"},{"type":"function","title":"Bonfire.Common.Enums.count_where/2","doc":"Counts the number of items in an enumerable that satisfy the given function.","ref":"Bonfire.Common.Enums.html#count_where/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.count_where/2","doc":"iex> Bonfire.Common.Enums.count_where([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end)\n 2\n\n iex> Bonfire.Common.Enums.count_where([:ok, :error, :ok], &(&1 == :ok))\n 2","ref":"Bonfire.Common.Enums.html#count_where/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.deep_merge/3","doc":"Recursively merges two data structures (`left` and `right`), which can be structs, maps or lists.\nIf `left` and `right` are `Ecto.Changeset`s, `merge_changesets/2` is called on them.\nIf `left` is a struct, a similar struct is returned with the merged values.\nIf `left` and `right` are lists, they are concatenated unless `:replace_lists` option is set to `true`.","ref":"Bonfire.Common.Enums.html#deep_merge/3"},{"type":"function","title":"Bonfire.Common.Enums.deep_merge_reduce/2","doc":"Deep merges a list of maps into a single map.","ref":"Bonfire.Common.Enums.html#deep_merge_reduce/2"},{"type":"function","title":"Bonfire.Common.Enums.enum_get/3","doc":"Attempt getting a value out of a map by atom key, or try with string key, or return a fallback","ref":"Bonfire.Common.Enums.html#enum_get/3"},{"type":"function","title":"Bonfire.Common.Enums.filter_empty/2","doc":"Takes a value and a fallback value. If the value is empty (e.g. an empty map, a non-loaded association, an empty list, an empty string, or nil), the fallback value is returned.","ref":"Bonfire.Common.Enums.html#filter_empty/2"},{"type":"function","title":"Bonfire.Common.Enums.filter_empty/3","doc":"","ref":"Bonfire.Common.Enums.html#filter_empty/3"},{"type":"function","title":"Bonfire.Common.Enums.first!/1","doc":"","ref":"Bonfire.Common.Enums.html#first!/1"},{"type":"function","title":"Bonfire.Common.Enums.flatter/1","doc":"Takes a list and recursively flattens it by recursively flattening the head and tail of the list","ref":"Bonfire.Common.Enums.html#flatter/1"},{"type":"function","title":"Bonfire.Common.Enums.fun/3","doc":"Applies a function from one of Elixir's `Map`, `Keyword`, or `List` modules depending on the type of the given enumerable.","ref":"Bonfire.Common.Enums.html#fun/3"},{"type":"function","title":"Examples - Bonfire.Common.Enums.fun/3","doc":"> Bonfire.Common.Enums.fun(%{a: 1, b: 2}, :values)\n [2, 1]\n\n iex> Bonfire.Common.Enums.fun([a: 1, b: 2], :values)\n [1, 2]\n \n iex> Bonfire.Common.Enums.fun([1, 2, 3], :first)\n 1","ref":"Bonfire.Common.Enums.html#fun/3-examples"},{"type":"function","title":"Bonfire.Common.Enums.get_in_access_keys/3","doc":"","ref":"Bonfire.Common.Enums.html#get_in_access_keys/3"},{"type":"function","title":"Bonfire.Common.Enums.get_in_access_keys!/3","doc":"","ref":"Bonfire.Common.Enums.html#get_in_access_keys!/3"},{"type":"function","title":"Bonfire.Common.Enums.group/2","doc":"Like `Enum.group_by/3`, except children are required to be unique (will throw otherwise!) and the resulting map does not wrap each item in a list.","ref":"Bonfire.Common.Enums.html#group/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.group/2","doc":"iex> Bonfire.Common.Enums.group([1, 2, 3], fn x -> x end)\n %{1 => 1, 2 => 2, 3 => 3}\n\n > Bonfire.Common.Enums.group([:a, :b, :b, :c], fn x -> x end)\n ** (throw) \"Expected a unique value\"","ref":"Bonfire.Common.Enums.html#group/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.group_map/2","doc":"Groups an enumerable by a function that returns key-value pairs, ensuring that keys are unique.","ref":"Bonfire.Common.Enums.html#group_map/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.group_map/2","doc":"iex> Bonfire.Common.Enums.group_map([:a, :b, :c], fn x -> {x, to_string(x)} end)\n %{a: \"a\", b: \"b\", c: \"c\"}\n\n > Bonfire.Common.Enums.group_map([1, 2, 2, 3], fn x -> {x, x * 2} end)\n ** (throw) \"Expected a unique value\"","ref":"Bonfire.Common.Enums.html#group_map/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_duplicates?/2","doc":"Checks if the given list contains any duplicates. Takes an optional function that can be used to extract and/or compute the value to compare for each element in the list.","ref":"Bonfire.Common.Enums.html#has_duplicates?/2"},{"type":"function","title":"Bonfire.Common.Enums.has_error?/1","doc":"Checks if there are any `:error` tuples in the enumerable.","ref":"Bonfire.Common.Enums.html#has_error?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_error?/1","doc":"iex> Bonfire.Common.Enums.has_error?([{:ok, 1}, {:error, \"failed\"}])\n true\n\n iex> Bonfire.Common.Enums.has_error?([{:ok, 1}])\n false","ref":"Bonfire.Common.Enums.html#has_error?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_ok?/1","doc":"Checks if there are any `:ok` tuples in the enumerable.","ref":"Bonfire.Common.Enums.html#has_ok?/1"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_ok?/1","doc":"iex> Bonfire.Common.Enums.has_ok?([{:ok, 1}, {:error, \"failed\"}])\n true\n\n iex> Bonfire.Common.Enums.has_ok?([{:error, \"failed\"}])\n false","ref":"Bonfire.Common.Enums.html#has_ok?/1-examples"},{"type":"function","title":"Bonfire.Common.Enums.has_tuple_key?/2","doc":"Checks if there are any tuples with the given key in the enumerable.","ref":"Bonfire.Common.Enums.html#has_tuple_key?/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.has_tuple_key?/2","doc":"iex> Bonfire.Common.Enums.has_tuple_key?([{:ok, 1}, {:error, \"failed\"}], :ok)\n true\n\n iex> Bonfire.Common.Enums.has_tuple_key?([{:ok, 1}], :error)\n false","ref":"Bonfire.Common.Enums.html#has_tuple_key?/2-examples"},{"type":"function","title":"Bonfire.Common.Enums.id/1","doc":"Extracts a binary ID from various data structures, such as a map containing the key :id or \"id\", a changeset, or a tuple containing the atom :id.","ref":"Bonfire.Common.Enums.html#id/1"},{"type":"function","title":"Bonfire.Common.Enums.ids/1","doc":"Extracts the IDs from a list of maps, changesets, or other data structures and returns a list of these IDs.\n\n iex> ids([%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n [1, 2]\n\n iex> ids(%{id: 3})\n [3]","ref":"Bonfire.Common.Enums.html#ids/1"},{"type":"function","title":"Bonfire.Common.Enums.input_to_atoms/2","doc":"Takes a data structure and converts any keys in maps to (previously defined) atoms, recursively. By default any unknown string keys will be discarded. It can optionally also convert string values to known atoms as well.","ref":"Bonfire.Common.Enums.html#input_to_atoms/2"},{"type":"function","title":"Bonfire.Common.Enums.input_to_value/7","doc":"Converts input to value based on the provided options.","ref":"Bonfire.Common.Enums.html#input_to_value/7"},{"type":"function","title":"Examples - Bonfire.Common.Enums.input_to_value/7","doc":"iex> input_to_value(\"42\", false, true, nil, true, nil, true)\n 42\n\n iex> input_to_value(\"Bonfire.Common\", false, true, nil, true, nil, false)\n Bonfire.Common\n\n iex> input_to_value(\"bonfire_common\", false, true, nil, true, nil, false)\n :bonfire_common\n\n iex> input_to_value(\"unknown_example_string\", false, true, nil, true, nil, false)\n \"unknown_example_string\"","ref":"Bonfire.Common.Enums.html#input_to_value/7-examples"},{"type":"function","title":"Bonfire.Common.Enums.map_filter_empty/1","doc":"Recursively filters nil values from a map","ref":"Bonfire.Common.Enums.html#map_filter_empty/1"},{"type":"function","title":"Bonfire.Common.Enums.map_key_replace/4","doc":"Renames a key in a map. Optionally changes the value as well.","ref":"Bonfire.Common.Enums.html#map_key_replace/4"},{"type":"function","title":"Bonfire.Common.Enums.map_key_replace_existing/4","doc":"Renames a key in a `map`, only if the key exists in the `map`. Optionally changes the value as well.","ref":"Bonfire.Common.Enums.html#map_key_replace_existing/4"},{"type":"function","title":"Bonfire.Common.Enums.map_new/2","doc":"Takes an enumerable object and converts it to a map. If it is not an enumerable, a map is created with the data under a fallback key (`:data` by default).","ref":"Bonfire.Common.Enums.html#map_new/2"},{"type":"function","title":"Bonfire.Common.Enums.map_put_default/3","doc":"Checks a map for a value with provided key. If it already exists, the existing value is retained, but if not set or nil, then it is set to the provided default.","ref":"Bonfire.Common.Enums.html#map_put_default/3"},{"type":"function","title":"Bonfire.Common.Enums.map_put_in/3","doc":"Updates a nested map using a list of keys and a value to set. It returns a new map with the updated value at the specified location.","ref":"Bonfire.Common.Enums.html#map_put_in/3"},{"type":"function","title":"Examples - Bonfire.Common.Enums.map_put_in/3","doc":"iex> map_put_in(%{}, [:a, :b, :c], 3)\n %{a: %{b: %{c: 3}}}","ref":"Bonfire.Common.Enums.html#map_put_in/3-examples"},{"type":"function","title":"Parameters - Bonfire.Common.Enums.map_put_in/3","doc":"* `root` - The initial map (can be an empty map or a populated one).\n * `keys` - A list of keys specifying the path to the value.\n * `value` - The value to set at the specified location.","ref":"Bonfire.Common.Enums.html#map_put_in/3-parameters"},{"type":"function","title":"Bonfire.Common.Enums.maybe_append/2","doc":"Appends a value to a list, but only if the value is not nil or an empty list.","ref":"Bonfire.Common.Enums.html#maybe_append/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_elem/3","doc":"Takes any element, an index and a fallback value. If the element is a Tuple it returns either the tuple value at that index, otherwise it returns the fallback. If the tuple doesn't contain such an index, it raises `ArgumentError`.","ref":"Bonfire.Common.Enums.html#maybe_elem/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_flatten/1","doc":"Flattens the list if provided a list, otherwise just return the input","ref":"Bonfire.Common.Enums.html#maybe_flatten/1"},{"type":"function","title":"Bonfire.Common.Enums.maybe_get/3","doc":"Attempts to retrieve a value from a map by its key, and otherwise returns the provided fallback value.","ref":"Bonfire.Common.Enums.html#maybe_get/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_list/2","doc":"","ref":"Bonfire.Common.Enums.html#maybe_list/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_merge_to_struct/2","doc":"","ref":"Bonfire.Common.Enums.html#maybe_merge_to_struct/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_put/3","doc":"Updates a `map` with the given `key` and `value`, but only if the `value` is not `nil`, an empty list or an empty string.","ref":"Bonfire.Common.Enums.html#maybe_put/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_keyword_list/3","doc":"Returns a keyword list representation of the input object. If the second argument is `true`, the function will recursively convert nested data structures to keyword lists as well.\nNote: make sure that all keys are atoms, i.e. using `input_to_atoms` first, otherwise the enumerable(s) containing a string key won't be converted.","ref":"Bonfire.Common.Enums.html#maybe_to_keyword_list/3"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_map/2","doc":"Returns a map representation of the input object. If the second argument is `true`, the function will recursively convert nested data structures to maps as well.","ref":"Bonfire.Common.Enums.html#maybe_to_map/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_struct/2","doc":"Takes a data structure and tries to convert it to a struct, using some hints in the data (eg. `__type` or `index_type` fields) or a manually-provided type.","ref":"Bonfire.Common.Enums.html#maybe_to_struct/2"},{"type":"function","title":"Bonfire.Common.Enums.maybe_to_structs/2","doc":"Takes a data structure and recursively converts any known keys to atoms and then tries to recursively convert any maps to structs, using some hints in the data (eg. `__type` or `index_type` fields).","ref":"Bonfire.Common.Enums.html#maybe_to_structs/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_as_map/3","doc":"Merges two maps or lists into a single map","ref":"Bonfire.Common.Enums.html#merge_as_map/3"},{"type":"function","title":"Bonfire.Common.Enums.merge_changesets/2","doc":"Merges two `Ecto` changesets. If both changesets have a prepare field, the function concatenates the values of the prepare fields. Either way it also calls `Ecto.Changeset.merge/2` operation.","ref":"Bonfire.Common.Enums.html#merge_changesets/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_keeping_only_first_keys/2","doc":"Merges two maps while keeping only the keys that exist in the first map.","ref":"Bonfire.Common.Enums.html#merge_keeping_only_first_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_structs_as_map/2","doc":"","ref":"Bonfire.Common.Enums.html#merge_structs_as_map/2"},{"type":"function","title":"Bonfire.Common.Enums.merge_uniq/2","doc":"","ref":"Bonfire.Common.Enums.html#merge_uniq/2"},{"type":"function","title":"Bonfire.Common.Enums.naughty_to_atoms!/2","doc":"","ref":"Bonfire.Common.Enums.html#naughty_to_atoms!/2"},{"type":"function","title":"Bonfire.Common.Enums.nested_structs_to_maps/1","doc":"Recursively converts all nested structs to maps.","ref":"Bonfire.Common.Enums.html#nested_structs_to_maps/1"},{"type":"function","title":"Bonfire.Common.Enums.put_new_in/3","doc":"This function is used to insert a new value into a nested map data structure, where the path to the location of the value is specified as a list of keys.\n\nWhen the path is a single-element list, if the key already exists in the map, it returns the original map; otherwise, it inserts the key-value pair.\n\nWhen the path is a list of more than one key, the first element of the list (key) represents the key for the current level of the nested map, and the remaining elements (path) represent the keys for the nested map at the next level. The function starts by retrieving the value at the current level of the map (if it exists) and updates the map with the new value.","ref":"Bonfire.Common.Enums.html#put_new_in/3"},{"type":"function","title":"Bonfire.Common.Enums.stringify_keys/2","doc":"Takes a map or keyword list, and returns a map with any atom keys converted to string keys. It can optionally do so recursively.","ref":"Bonfire.Common.Enums.html#stringify_keys/2"},{"type":"function","title":"Bonfire.Common.Enums.struct_from_map/2","doc":"Converts a map to a struct (based on MIT licensed function by Kum Sackey)","ref":"Bonfire.Common.Enums.html#struct_from_map/2"},{"type":"function","title":"Bonfire.Common.Enums.struct_to_map/2","doc":"If given a struct, returns a map representation of it","ref":"Bonfire.Common.Enums.html#struct_to_map/2"},{"type":"function","title":"Bonfire.Common.Enums.uniq_by_id/1","doc":"Takes a list of maps that have an id field and returns a list with only the unique maps. Uniqueness is determined based on the id field and not the full contents of the maps.","ref":"Bonfire.Common.Enums.html#uniq_by_id/1"},{"type":"function","title":"Bonfire.Common.Enums.unwrap_tuples/2","doc":"Unwraps tuples from a list of responses based on the specified key.","ref":"Bonfire.Common.Enums.html#unwrap_tuples/2"},{"type":"function","title":"Examples - Bonfire.Common.Enums.unwrap_tuples/2","doc":"iex> Bonfire.Common.Enums.unwrap_tuples([{:ok, 1}, {:error, \"failed\"}, {:ok, 2}], :ok)\n [1, 2]\n\n iex> Bonfire.Common.Enums.unwrap_tuples([{:ok, 1}, {:error, \"failed\"}], :error)\n [\"failed\"]","ref":"Bonfire.Common.Enums.html#unwrap_tuples/2-examples"},{"type":"module","title":"Bonfire.Common.Errors","doc":"Helpers for handling error messages and exceptions","ref":"Bonfire.Common.Errors.html"},{"type":"function","title":"Bonfire.Common.Errors.debug_banner_with_trace/4","doc":"","ref":"Bonfire.Common.Errors.html#debug_banner_with_trace/4"},{"type":"function","title":"Bonfire.Common.Errors.debug_exception/5","doc":"Logs a debug message with exception and stacktrace information.","ref":"Bonfire.Common.Errors.html#debug_exception/5"},{"type":"function","title":"Examples - Bonfire.Common.Errors.debug_exception/5","doc":"iex> debug_exception(\"An error occurred\", %RuntimeError{message: \"error\"}, nil, :error, [])\n # Output: An error occurred: %RuntimeError{message: \"error\"}\n {:error, \"An error occurred\"}","ref":"Bonfire.Common.Errors.html#debug_exception/5-examples"},{"type":"function","title":"Bonfire.Common.Errors.debug_log/5","doc":"Logs a debug message with optional exception and stacktrace information.","ref":"Bonfire.Common.Errors.html#debug_log/5"},{"type":"function","title":"Examples - Bonfire.Common.Errors.debug_log/5","doc":"> debug_log(\"A debug message\", %RuntimeError{message: \"error\"}, nil, :error)\n # Output: A debug message: %RuntimeError{message: \"error\"}\n\n > debug_log(\"A debug message\", nil, nil, :info)\n # Output: A debug message: nil","ref":"Bonfire.Common.Errors.html#debug_log/5-examples"},{"type":"function","title":"Bonfire.Common.Errors.error_msg/1","doc":"Turns various kinds of errors into an error message string. Used to format errors in a way that can be easily read by the user.","ref":"Bonfire.Common.Errors.html#error_msg/1"},{"type":"function","title":"Examples - Bonfire.Common.Errors.error_msg/1","doc":"iex> error_msg([{:error, \"something went wrong\"}])\n [\"something went wrong\"]\n\n iex> error_msg(%{message: \"custom error\"})\n \"custom error\"\n\n iex> error_msg(:some_other_error)\n \":some_other_error\"","ref":"Bonfire.Common.Errors.html#error_msg/1-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_banner/4","doc":"Normalizes and formats any throw/error/exit. The message is formatted and displayed in the same format as used by Elixir's CLI.\n\nThe third argument is the stacktrace which is used to enrich a normalized error with more information. It is only used when the kind is an error.","ref":"Bonfire.Common.Errors.html#format_banner/4"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_banner/4","doc":"iex> format_banner(:error, %RuntimeError{message: \"error\"})\n \"** Elixir.RuntimeError: error\"\n\n iex> format_banner(:throw, :some_reason)\n \"** (throw) :some_reason\"\n\n iex> format_banner(:exit, :some_reason)\n \"** (exit) :some_reason\"\n\n > format_banner({:EXIT, self()}, :some_reason)\n \"** (EXIT from #PID<0.780.0>) :some_reason\"","ref":"Bonfire.Common.Errors.html#format_banner/4-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_location/1","doc":"","ref":"Bonfire.Common.Errors.html#format_location/1"},{"type":"function","title":"Bonfire.Common.Errors.format_mfa/3","doc":"Receives a module, function, and arity and formats it as shown in stacktraces. The arity may also be a list of arguments.\n\nAnonymous functions are reported as -func/arity-anonfn-count-, where func is the name of the enclosing function. Convert to \"anonymous fn in func/arity\"","ref":"Bonfire.Common.Errors.html#format_mfa/3"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_mfa/3","doc":"iex> format_mfa(Foo, :bar, 1)\n {\"Foo\", \"bar\", \"Foo.bar/1\"}\n\n iex> format_mfa(Foo, :bar, [])\n {\"Foo\", \"bar\", \"Foo.bar()\"}\n\n iex> Exception.format_mfa(nil, :bar, [])\n \"nil.bar()\"","ref":"Bonfire.Common.Errors.html#format_mfa/3-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace/2","doc":"Formats the stacktrace. A stacktrace must be given as an argument. If not, the stacktrace is retrieved from `Process.info/2`.\n\n# TODO: consolidate/reuse with similar function in `Untangle`?","ref":"Bonfire.Common.Errors.html#format_stacktrace/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_stacktrace/2","doc":"> format_stacktrace([{MyModule, :my_fun, 1, [file: 'my_file.ex', line: 42]}], [])\n \"my_file.ex:42: MyModule.my_fun/1\"\n\n > format_stacktrace(nil, [])\n \"stacktrace here...\"","ref":"Bonfire.Common.Errors.html#format_stacktrace/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace_entry/2","doc":"Receives a stacktrace entry and formats it into a string.","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.format_stacktrace_entry/2","doc":"iex> format_stacktrace_entry({MyModule, :my_fun, 1, [file: 'my_file.ex', line: 42]}, [])\n \"my_file.ex:42: MyModule.my_fun/1\"\n\n > format_stacktrace_entry({fn -> :ok end, 0, [file: 'another_file.ex', line: 7]}, [])\n \"another_file.ex:7: some_fun/2\"","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.format_stacktrace_entry_sliced/2","doc":"","ref":"Bonfire.Common.Errors.html#format_stacktrace_entry_sliced/2"},{"type":"function","title":"Bonfire.Common.Errors.last_stacktrace/0","doc":"","ref":"Bonfire.Common.Errors.html#last_stacktrace/0"},{"type":"function","title":"Bonfire.Common.Errors.map_error/2","doc":"Maps an error tuple to a new value using the provided function.","ref":"Bonfire.Common.Errors.html#map_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.map_error/2","doc":"iex> map_error({:error, :some_error}, &(&1 |> to_string()))\n \"some_error\"\n\n iex> map_error(42, &(&1 * 2))\n 42","ref":"Bonfire.Common.Errors.html#map_error/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.maybe_ok_error/2","doc":"Applies `change_fn` if the first parameter is an `{:ok, val}` tuple, else returns the value.","ref":"Bonfire.Common.Errors.html#maybe_ok_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.maybe_ok_error/2","doc":"iex> maybe_ok_error({:ok, 42}, &(&1 * 2))\n {:ok, 84}\n\n iex> maybe_ok_error({:error, :some_error}, &(&1 * 2))\n {:error, :some_error}\n\n iex> maybe_ok_error(42, &(&1 * 2))\n 42","ref":"Bonfire.Common.Errors.html#maybe_ok_error/2-examples"},{"type":"function","title":"Bonfire.Common.Errors.mf_maybe_link_to_code/4","doc":"","ref":"Bonfire.Common.Errors.html#mf_maybe_link_to_code/4"},{"type":"function","title":"Bonfire.Common.Errors.module_maybe_link_to_code/3","doc":"","ref":"Bonfire.Common.Errors.html#module_maybe_link_to_code/3"},{"type":"function","title":"Bonfire.Common.Errors.replace_error/2","doc":"Replaces the error value in an error tuple with a new value.","ref":"Bonfire.Common.Errors.html#replace_error/2"},{"type":"function","title":"Examples - Bonfire.Common.Errors.replace_error/2","doc":"iex> replace_error({:error, :old_value}, :new_value)\n {:error, :new_value}\n\n iex> replace_error(42, :new_value)\n 42","ref":"Bonfire.Common.Errors.html#replace_error/2-examples"},{"type":"module","title":"Bonfire.Common.Extend","doc":"Helpers for using and managing the extensibility of Bonfire, such as checking if a module or extension is enabled or hot-swapped, or loading code or docs. See also `Bonfire.Common.Extensions`.","ref":"Bonfire.Common.Extend.html"},{"type":"function","title":"Bonfire.Common.Extend.application_for_module/1","doc":"Retrieves the OTP application associated with a given module.","ref":"Bonfire.Common.Extend.html#application_for_module/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.application_for_module/1","doc":"iex> application_for_module(Bonfire.Common)\n :bonfire_common\n\n iex> application_for_module(SomeUnknownModule)\n nil","ref":"Bonfire.Common.Extend.html#application_for_module/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.beam_file_from_object_code/1","doc":"Retrieves the beam file path from the object code of a module.","ref":"Bonfire.Common.Extend.html#beam_file_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.beam_file_from_object_code/1","doc":"> beam_file_from_object_code(Bonfire.Common)\n \"/path/ebin/Elixir.Bonfire.Common.beam\"","ref":"Bonfire.Common.Extend.html#beam_file_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.deps_tree/0","doc":"","ref":"Bonfire.Common.Extend.html#deps_tree/0"},{"type":"function","title":"Bonfire.Common.Extend.deps_tree_flat/1","doc":"","ref":"Bonfire.Common.Extend.html#deps_tree_flat/1"},{"type":"function","title":"Bonfire.Common.Extend.disabled_value?/1","doc":"Checks if a value indicates that a module or extension is disabled.","ref":"Bonfire.Common.Extend.html#disabled_value?/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.disabled_value?/1","doc":"iex> disabled_value?(:disabled)\n true\n\n iex> disabled_value?(false)\n false\n\n iex> disabled_value?(disabled: true)\n true","ref":"Bonfire.Common.Extend.html#disabled_value?/1-examples"},{"type":"macro","title":"Bonfire.Common.Extend.extend_module/1","doc":"Extend a module by defining `defdelegate` and `defoverridable` for all functions from the source module in the current module.","ref":"Bonfire.Common.Extend.html#extend_module/1"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.extend_module/1","doc":"> import Bonfire.Common.Extend\n > extend_module Common.Text","ref":"Bonfire.Common.Extend.html#extend_module/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.extension_enabled?/2","doc":"Checks if an Elixir module or extension/OTP app is present and not disabled.\n\nFor modules, checks also that the extension/OTP app it belongs is not disabled.","ref":"Bonfire.Common.Extend.html#extension_enabled?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.extension_enabled?/2","doc":"iex> extension_enabled?(Bonfire.Common)\n true\n\n iex> extension_enabled?(:bonfire_common)\n true\n\n iex> extension_enabled?(SomeOtherModule)\n false\n\n iex> extension_enabled?(:non_existent_extension)\n false","ref":"Bonfire.Common.Extend.html#extension_enabled?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.extension_loaded?/1","doc":"Whether an Elixir module or extension / OTP app is present","ref":"Bonfire.Common.Extend.html#extension_loaded?/1"},{"type":"function","title":"Bonfire.Common.Extend.fetch_docs_as_markdown/1","doc":"Fetches the `@moduledoc` of a module as a markdown string.","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.fetch_docs_as_markdown/1","doc":"> fetch_docs_as_markdown(SomeModule)\n \"This is the moduledoc for SomeModule\"","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.fetch_docs_as_markdown/2","doc":"Fetches `module`.`function`'s @doc as a markdown string","ref":"Bonfire.Common.Extend.html#fetch_docs_as_markdown/2"},{"type":"function","title":"Bonfire.Common.Extend.file_code/1","doc":"Retrieves the content of a code file.","ref":"Bonfire.Common.Extend.html#file_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.file_code/1","doc":"> file_code(\"mix.ex\")\n \"defmodule ... end\"","ref":"Bonfire.Common.Extend.html#file_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_ast/3","doc":"Retrieves the AST of a specific function from a module.","ref":"Bonfire.Common.Extend.html#function_ast/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_ast/3","doc":"> function_ast(Bonfire.Common, :some_function)\n [{:def, [...], [...]}, ...]","ref":"Bonfire.Common.Extend.html#function_ast/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_code/3","doc":"Retrieves the code of a specific function from a module.","ref":"Bonfire.Common.Extend.html#function_code/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_code/3","doc":"> function_code(Bonfire.Common, :some_function)\n \"def some_function do ... end\"","ref":"Bonfire.Common.Extend.html#function_code/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_line_number/3","doc":"Returns the line number of the first line where a function is defined in a module.","ref":"Bonfire.Common.Extend.html#function_line_number/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_line_number/3","doc":"> function_line_number(Bonfire.Common, :some_function)\n 10","ref":"Bonfire.Common.Extend.html#function_line_number/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.function_line_numbers/3","doc":"Return the numbers (as a tuple) of the first and last lines of a function's definition in a module","ref":"Bonfire.Common.Extend.html#function_line_numbers/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.function_line_numbers/3","doc":"> function_line_numbers(Bonfire.Common, :some_function)\n {10, 20}","ref":"Bonfire.Common.Extend.html#function_line_numbers/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.generate_reverse_router!/0","doc":"Generates an updated reverse router based on enabled/disabled extensions.","ref":"Bonfire.Common.Extend.html#generate_reverse_router!/0"},{"type":"function","title":"Examples - Bonfire.Common.Extend.generate_reverse_router!/0","doc":"iex> generate_reverse_router!()\n :ok","ref":"Bonfire.Common.Extend.html#generate_reverse_router!/0-examples"},{"type":"function","title":"Bonfire.Common.Extend.has_extension_config?/1","doc":"Checks whether an Elixir module or extension / OTP app has any configuration available.","ref":"Bonfire.Common.Extend.html#has_extension_config?/1"},{"type":"macro","title":"Bonfire.Common.Extend.import_if_enabled/3","doc":"Conditionally imports a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#import_if_enabled/3"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.import_if_enabled/3","doc":"defmodule MyModule do\n import_if_enabled SomeExtension\n # or\n import_if_enabled SomeExtension, [], FallbackModule\n end","ref":"Bonfire.Common.Extend.html#import_if_enabled/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.inject_function/3","doc":"Copies the code defining a function from its original module to a target module.\n\nThe target module can be specified, otherwise, the function will be injected into a default extension module.","ref":"Bonfire.Common.Extend.html#inject_function/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.inject_function/3","doc":"iex> inject_function(Common.TextExtended, :blank?)","ref":"Bonfire.Common.Extend.html#inject_function/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.loaded_applications_map/1","doc":"Returns a map of loaded applications with their versions and descriptions.","ref":"Bonfire.Common.Extend.html#loaded_applications_map/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.loaded_applications_map/1","doc":"iex> %{bonfire_common: {_version, _description} } = loaded_applications_map()","ref":"Bonfire.Common.Extend.html#loaded_applications_map/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.loaded_applications_names/1","doc":"Returns a map of loaded applications names as keys.","ref":"Bonfire.Common.Extend.html#loaded_applications_names/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.loaded_applications_names/1","doc":"iex> %{bonfire_common: true} = loaded_applications_names()","ref":"Bonfire.Common.Extend.html#loaded_applications_names/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.macro_inspect/1","doc":"Inspects a macro by expanding it and converting it to a string.","ref":"Bonfire.Common.Extend.html#macro_inspect/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.macro_inspect/1","doc":"iex> macro_inspect(fn -> quote do: 1 + 1 end)\n \"1 + 1\"","ref":"Bonfire.Common.Extend.html#macro_inspect/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_extension_loaded/1","doc":"Returns the OTP app name for a module or extension.","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_extension_loaded/1","doc":"iex> maybe_extension_loaded(Bonfire.Common)\n :bonfire_common\n\n iex> maybe_extension_loaded(:bonfire_common)\n :bonfire_common\n\n iex> maybe_extension_loaded(:non_existent_app)\n :non_existent_app","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_extension_loaded!/1","doc":"Returns the OTP app name for a module or extension if available, and nil otherwise.","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded!/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_extension_loaded!/1","doc":"iex> maybe_extension_loaded!(Bonfire.Common)\n :bonfire_common\n\n iex> maybe_extension_loaded!(:non_existent_app)\n nil","ref":"Bonfire.Common.Extend.html#maybe_extension_loaded!/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module/2","doc":"Given an Elixir module, returns the module if available and not disabled, or its replacement if configured.\n\nChecks both that module and the extension / OTP app it belongs to are available *and* not disabled (eg. by configuring something like `config :bonfire_common, Bonfire.Common.Text, modularity: :disabled`)\n\nImportant note: you should make sure to use the returned module after calling this function, as it can be different from the one you intended to call, as this allows for swapping out modules in config or user settings (eg. by configuring something like `config :bonfire_common, Bonfire.Common.Text, modularity: MyCustomExtension.Text`)","ref":"Bonfire.Common.Extend.html#maybe_module/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module/2","doc":"iex> maybe_module(Bonfire.Common)\n Bonfire.Common\n\n iex> Config.put(DisabledModule, modularity: :disabled)\n iex> maybe_module(DisabledModule)\n nil\n\n iex> Config.put([Bonfire.Common.Text], modularity: Bonfire.Common.TextExtended)\n iex> maybe_module(Bonfire.Common.Text)\n Bonfire.Common.TextExtended\n iex> Config.put([Bonfire.Common.Text], modularity: Bonfire.Common.Text)\n iex> maybe_module(Bonfire.Common.Text)\n Bonfire.Common.Text","ref":"Bonfire.Common.Extend.html#maybe_module/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module!/2","doc":"Returns the module if it is present and not disabled; raises an error if the module is disabled and no replacement is configured.","ref":"Bonfire.Common.Extend.html#maybe_module!/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module!/2","doc":"iex> maybe_module!(Bonfire.Common)\n Bonfire.Common\n\n iex> maybe_module!(SomeDisabledModule)\n ** (RuntimeError) Module Elixir.SomeDisabledModule is disabled and no replacement was configured","ref":"Bonfire.Common.Extend.html#maybe_module!/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_module_loaded/1","doc":"Checks if a module exists and returns it, otherwise returns nil.","ref":"Bonfire.Common.Extend.html#maybe_module_loaded/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_module_loaded/1","doc":"iex> maybe_module_loaded(Bonfire.Common)\n Bonfire.Common\n\n iex> maybe_module_loaded(NonExistentModule)\n nil","ref":"Bonfire.Common.Extend.html#maybe_module_loaded/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.maybe_schema_or_pointer/1","doc":"Returns the given schema module if it exists, otherwise returns `Needle.Pointer`.","ref":"Bonfire.Common.Extend.html#maybe_schema_or_pointer/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.maybe_schema_or_pointer/1","doc":"> maybe_schema_or_pointer(SomeSchema)\n SomeSchema\n\n iex> maybe_schema_or_pointer(NonExistentSchema)\n Needle.Pointer","ref":"Bonfire.Common.Extend.html#maybe_schema_or_pointer/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_ast_normalize/3","doc":"Normalizes the AST of a module for use.","ref":"Bonfire.Common.Extend.html#module_ast_normalize/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_ast_normalize/3","doc":"> module_ast_normalize(Bonfire.Common, ast)","ref":"Bonfire.Common.Extend.html#module_ast_normalize/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_beam_code/2","doc":"Re-creates a module's code from compiled Beam artifacts.","ref":"Bonfire.Common.Extend.html#module_beam_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_beam_code/2","doc":"iex> {:ok, _} = module_beam_code(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_beam_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_behaviour?/2","doc":"Checks if a module implements a specific behaviour.","ref":"Bonfire.Common.Extend.html#module_behaviour?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_behaviour?/2","doc":"> module_behaviour?(MyModule, SomeBehaviour)\n true","ref":"Bonfire.Common.Extend.html#module_behaviour?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_behaviours/1","doc":"Returns a list of behaviours implemented by a module.","ref":"Bonfire.Common.Extend.html#module_behaviours/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_behaviours/1","doc":"> module_behaviours(MyModule)\n [SomeBehaviour, AnotherBehaviour]","ref":"Bonfire.Common.Extend.html#module_behaviours/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code/2","doc":"Retrieves the code of a module from the source.","ref":"Bonfire.Common.Extend.html#module_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code/2","doc":"> module_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code_from_ast/3","doc":"Retrieves the code of a module from its AST (Abstract Syntax Tree).","ref":"Bonfire.Common.Extend.html#module_code_from_ast/3"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code_from_ast/3","doc":"> module_code_from_ast(Bonfire.Common, ast)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code_from_ast/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_code_from_object_code/1","doc":"Retrieves the code of a module from its object code.","ref":"Bonfire.Common.Extend.html#module_code_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_code_from_object_code/1","doc":"> module_code_from_object_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_code_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_enabled?/2","doc":"Checks if an Elixir module or the extension/OTP app it belongs to is present and not disabled.","ref":"Bonfire.Common.Extend.html#module_enabled?/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_enabled?/2","doc":"iex> module_enabled?(Bonfire.Common)\n true\n\n iex> module_enabled?(SomeDisabledModule)\n false","ref":"Bonfire.Common.Extend.html#module_enabled?/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_exists?/1","doc":"Checks if an Elixir module exists and can be loaded.","ref":"Bonfire.Common.Extend.html#module_exists?/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_exists?/1","doc":"iex> module_exists?(Bonfire.Common)\n true\n\n iex> module_exists?(SomeOtherModule)\n false","ref":"Bonfire.Common.Extend.html#module_exists?/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file/1","doc":"Retrieves the file path of the module's source file.","ref":"Bonfire.Common.Extend.html#module_file/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file/1","doc":"> module_file(Bonfire.Common)\n \"/path/lib/common.ex\"","ref":"Bonfire.Common.Extend.html#module_file/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file_code/2","doc":"Retrieves the source code of a module.","ref":"Bonfire.Common.Extend.html#module_file_code/2"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file_code/2","doc":"> module_file_code(Bonfire.Common)\n \"defmodule Bonfire.Common do ... end\"","ref":"Bonfire.Common.Extend.html#module_file_code/2-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_file_from_object_code/1","doc":"Retrieves the file path of a module from its object code.","ref":"Bonfire.Common.Extend.html#module_file_from_object_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_file_from_object_code/1","doc":"> module_file_from_object_code(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_file_from_object_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_object_byte_code/1","doc":"Retrieves the bytecode of a module's object code.","ref":"Bonfire.Common.Extend.html#module_object_byte_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_object_byte_code/1","doc":"> module_object_byte_code(Bonfire.Common)\n <<...>>","ref":"Bonfire.Common.Extend.html#module_object_byte_code/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.module_object_code_tuple/1","doc":"Retrieves the object code tuple for a module.","ref":"Bonfire.Common.Extend.html#module_object_code_tuple/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.module_object_code_tuple/1","doc":"iex> {Bonfire.Common, _bytecode, _path} = module_object_code_tuple(Bonfire.Common)","ref":"Bonfire.Common.Extend.html#module_object_code_tuple/1-examples"},{"type":"function","title":"Bonfire.Common.Extend.quoted_import_if_enabled/4","doc":"","ref":"Bonfire.Common.Extend.html#quoted_import_if_enabled/4"},{"type":"function","title":"Bonfire.Common.Extend.quoted_require_if_enabled/4","doc":"","ref":"Bonfire.Common.Extend.html#quoted_require_if_enabled/4"},{"type":"function","title":"Bonfire.Common.Extend.quoted_use_if_enabled/4","doc":"","ref":"Bonfire.Common.Extend.html#quoted_use_if_enabled/4"},{"type":"macro","title":"Bonfire.Common.Extend.require_if_enabled/3","doc":"Conditionally requires a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#require_if_enabled/3"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.require_if_enabled/3","doc":"defmodule MyModule do\n require_if_enabled SomeExtension\n # or\n require_if_enabled SomeExtension, [], FallbackModule\n end","ref":"Bonfire.Common.Extend.html#require_if_enabled/3-examples"},{"type":"function","title":"Bonfire.Common.Extend.return_file/1","doc":"Returns a string given raw code data.","ref":"Bonfire.Common.Extend.html#return_file/1"},{"type":"function","title":"Bonfire.Common.Extend.tar_file_code/1","doc":"Retrieves the content of a code file within the source code tar file (available in Bonfire prod releases).","ref":"Bonfire.Common.Extend.html#tar_file_code/1"},{"type":"function","title":"Examples - Bonfire.Common.Extend.tar_file_code/1","doc":"> tar_file_code(\"/mix.exs\")\n \"defmodule ... end\"","ref":"Bonfire.Common.Extend.html#tar_file_code/1-examples"},{"type":"macro","title":"Bonfire.Common.Extend.use_if_enabled/3","doc":"Conditionally uses a module if it's enabled, with an optional fallback.","ref":"Bonfire.Common.Extend.html#use_if_enabled/3"},{"type":"macro","title":"Examples - Bonfire.Common.Extend.use_if_enabled/3","doc":"defmodule MyModule do\n use_if_enabled SomeExtension\n # or\n use_if_enabled SomeExtension, [], FallbackModule\n end","ref":"Bonfire.Common.Extend.html#use_if_enabled/3-examples"},{"type":"behaviour","title":"Bonfire.Common.ExtensionBehaviour","doc":"A Global cache of known Behaviours in Bonfire\n\nUse of the ExtensionBehaviour Service requires declaring `@behaviour Bonfire.Common.ExtensionBehaviour` in your behaviour module. This module will then index those behaviours *and* all the modules that implement those behaviours at app startup.\n\nWhile this module is a GenServer, it is only responsible for setup\nof the cache and then exits with :ignore having done so. It is not\nrecommended to restart the service as this will lead to a stop the\nworld garbage collection of all processes and the copying of the\nentire cache to each process that has queried it since its last\nlocal garbage collection.","ref":"Bonfire.Common.ExtensionBehaviour.html"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.adopters_of_behaviour/2","doc":"Given a behaviour module, filters app modules to only those that implement that behaviour","ref":"Bonfire.Common.ExtensionBehaviour.html#adopters_of_behaviour/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.app_modules_to_scan/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#app_modules_to_scan/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apply_modules/2","doc":"Note: use `apply_modules_cached/2` instead, as it caches the result.","ref":"Bonfire.Common.ExtensionBehaviour.html#apply_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apply_modules_cached/2","doc":"Runs/applies a given function name on each of a list of given modules, returning a map (listing the modules with their result as value) and vice versa (listing the results as key with their calling module as value). It also caches the result on first run.","ref":"Bonfire.Common.ExtensionBehaviour.html#apply_modules_cached/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.apps_to_scan/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#apps_to_scan/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviour_app_modules/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviour_app_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviour_modules/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviour_modules/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.behaviours/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#behaviours/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.cached_behaviours/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#cached_behaviours/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.ExtensionBehaviour.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.find_adopters_of_behaviours/2","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#find_adopters_of_behaviours/2"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.find_extension_behaviours/1","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#find_extension_behaviours/1"},{"type":"callback","title":"Bonfire.Common.ExtensionBehaviour.modules/0","doc":"List modules that implement a behaviour","ref":"Bonfire.Common.ExtensionBehaviour.html#c:modules/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.populate/0","doc":"","ref":"Bonfire.Common.ExtensionBehaviour.html#populate/0"},{"type":"function","title":"Bonfire.Common.ExtensionBehaviour.start_link/1","doc":"Populates the global cache with config_module data via introspection.","ref":"Bonfire.Common.ExtensionBehaviour.html#start_link/1"},{"type":"behaviour","title":"Bonfire.Common.ExtensionModule","doc":"A global cache of known Bonfire extensions and their metadata.","ref":"Bonfire.Common.ExtensionModule.html"},{"type":"function","title":"Bonfire.Common.ExtensionModule.app_modules/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.Common.ExtensionModule.declared_extension/0","doc":"Declares a Bonfire extensions","ref":"Bonfire.Common.ExtensionModule.html#c:declared_extension/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.declared_extension/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#declared_extension/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.declared_extensions/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#declared_extensions/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav/1","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.default_nav_apps/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#default_nav_apps/0"},{"type":"function","title":"Bonfire.Common.ExtensionModule.extension/1","doc":"Get a extension identified by schema","ref":"Bonfire.Common.ExtensionModule.html#extension/1"},{"type":"function","title":"Bonfire.Common.ExtensionModule.extension_function_error/2","doc":"","ref":"Bonfire.Common.ExtensionModule.html#extension_function_error/2"},{"type":"function","title":"Bonfire.Common.ExtensionModule.modules/0","doc":"","ref":"Bonfire.Common.ExtensionModule.html#modules/0"},{"type":"module","title":"Bonfire.Common.Extensions","doc":"Helpers for managing Bonfire extensions, e.g., enabling/disabling a module or extension,\nor listing available extensions and their metadata.","ref":"Bonfire.Common.Extensions.html"},{"type":"function","title":"Bonfire.Common.Extensions.all_deps/0","doc":"Retrieves a list of all dependencies.","ref":"Bonfire.Common.Extensions.html#all_deps/0"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.all_deps/0","doc":"> Bonfire.Common.Extensions.all_deps()\n [%Mix.Dep{...}, %Mix.Dep{...}]","ref":"Bonfire.Common.Extensions.html#all_deps/0-examples"},{"type":"function","title":"Bonfire.Common.Extensions.data/0","doc":"","ref":"Bonfire.Common.Extensions.html#data/0"},{"type":"function","title":"Bonfire.Common.Extensions.dep_name/1","doc":"Extracts the dependency name from a `Mix.Dep` struct or similar data.","ref":"Bonfire.Common.Extensions.html#dep_name/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.dep_name/1","doc":"- `dep`: The dependency from which to extract the name.","ref":"Bonfire.Common.Extensions.html#dep_name/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.dep_name/1","doc":"iex> Bonfire.Common.Extensions.dep_name(%Mix.Dep{app: :my_app})\n :my_app\n\n iex> Bonfire.Common.Extensions.dep_name(:my_app)\n :my_app\n\n iex> Bonfire.Common.Extensions.dep_name(\"my_app\")\n \"my_app\"","ref":"Bonfire.Common.Extensions.html#dep_name/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_branch/1","doc":"Retrieves the branch name for a dependency.","ref":"Bonfire.Common.Extensions.html#get_branch/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_branch/1","doc":"- `dep`: The dependency from which to get the branch.","ref":"Bonfire.Common.Extensions.html#get_branch/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_branch/1","doc":"iex> Bonfire.Common.Extensions.get_branch(%{git: nil, branch: \"main\"})\n \"main\"\n\n iex> Bonfire.Common.Extensions.get_branch(%{lock: {:git, nil, nil, [branch: \"feature\"]}})\n \"feature\"","ref":"Bonfire.Common.Extensions.html#get_branch/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_code_link/1","doc":"Constructs a link to the code of a dependency.","ref":"Bonfire.Common.Extensions.html#get_code_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_code_link/1","doc":"- `dep`: The dependency from which to generate the link.","ref":"Bonfire.Common.Extensions.html#get_code_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_code_link/1","doc":"iex> Bonfire.Common.Extensions.get_code_link(%{app: \"my_app\"})\n \"/settings/extensions/code/my_app\"","ref":"Bonfire.Common.Extensions.html#get_code_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_link/1","doc":"Returns a link to the package or repository of a dependency.","ref":"Bonfire.Common.Extensions.html#get_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_link/1","doc":"- `dep`: The dependency from which to generate the link.","ref":"Bonfire.Common.Extensions.html#get_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_link/1","doc":"iex> Bonfire.Common.Extensions.get_link(%{hex: \"example_package\"})\n \"https://hex.pm/packages/example_package\"\n\n iex> Bonfire.Common.Extensions.get_link(%{git: \"https://github.com/user/repo\", branch: \"main\"})\n \"https://github.com/user/repo/tree/main\"","ref":"Bonfire.Common.Extensions.html#get_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_version/1","doc":"Outputs the current version string for a dependency.","ref":"Bonfire.Common.Extensions.html#get_version/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_version/1","doc":"- `dep`: The dependency from which to get the version.","ref":"Bonfire.Common.Extensions.html#get_version/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_version/1","doc":"iex> Bonfire.Common.Extensions.get_version(%{status: {:ok, \"1.0.0\"}})\n \"1.0.0\"\n\n iex> Bonfire.Common.Extensions.get_version(%{requirement: \">= 1.0.0\"})\n \">= 1.0.0\"","ref":"Bonfire.Common.Extensions.html#get_version/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.get_version_link/1","doc":"Constructs a link to the version of a dependency.","ref":"Bonfire.Common.Extensions.html#get_version_link/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.get_version_link/1","doc":"- `dep`: The dependency from which to generate the version link.","ref":"Bonfire.Common.Extensions.html#get_version_link/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.get_version_link/1","doc":"iex> Bonfire.Common.Extensions.get_version_link(%{app: \"my_app\", path: \"file.ex\"})\n \"/settings/extensions/diff?app=my_app&local=file.ex\"\n\n iex> Bonfire.Common.Extensions.get_version_link(%{lock: {:git, \"https://github.com/user/repo\", \"abc123\", [branch: \"main\"]}})\n \"https://github.com/user/repo/compare/abc123...main\"","ref":"Bonfire.Common.Extensions.html#get_version_link/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.global_disable/1","doc":"Disables a given extension globally.","ref":"Bonfire.Common.Extensions.html#global_disable/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.global_disable/1","doc":"- `extension`: The name of the extension to disable.","ref":"Bonfire.Common.Extensions.html#global_disable/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.global_disable/1","doc":"> {:ok, %Bonfire.Data.Identity.Settings{json: %{bonfire: %{my_test_extension: %{modularity: :disabled}}}}} = Bonfire.Common.Extensions.global_disable(:my_test_extension)","ref":"Bonfire.Common.Extensions.html#global_disable/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.global_enable/1","doc":"Enables a given extension globally.","ref":"Bonfire.Common.Extensions.html#global_enable/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.global_enable/1","doc":"- `extension`: The name of the extension to enable.","ref":"Bonfire.Common.Extensions.html#global_enable/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.global_enable/1","doc":"> {:ok, %Bonfire.Data.Identity.Settings{json: %{bonfire: %{my_test_extension: %{modularity: nil}}}}} = Bonfire.Common.Extensions.global_enable(:my_test_extension)","ref":"Bonfire.Common.Extensions.html#global_enable/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.loaded_deps/1","doc":"Retrieves a list of all dependencies in a specific format based on the options provided.","ref":"Bonfire.Common.Extensions.html#loaded_deps/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.loaded_deps/1","doc":"- `opts`: Options to determine the format, e.g., `:flat`, `:tree_flat`, `:nested`.","ref":"Bonfire.Common.Extensions.html#loaded_deps/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.loaded_deps/1","doc":"> Bonfire.Common.Extensions.loaded_deps(:flat)\n [%Mix.Dep{}, %Mix.Dep{}, ...]\n\n > Bonfire.Common.Extensions.loaded_deps(:tree_flat)\n [%Mix.Dep{}, %Mix.Dep{}, ...]","ref":"Bonfire.Common.Extensions.html#loaded_deps/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.loaded_deps_names/1","doc":"Retrieves a list of all dependency names in a specific format based on the options provided.","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.loaded_deps_names/1","doc":"- `opts`: Options to determine the format, e.g., `:flat`, `:tree_flat`, `:nested`.","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.loaded_deps_names/1","doc":"> Bonfire.Common.Extensions.loaded_deps_names()\n [:dep1, :dep2]","ref":"Bonfire.Common.Extensions.html#loaded_deps_names/1-examples"},{"type":"module","title":"Bonfire.Common.Extensions.Diff","doc":"Provides functionality to generate and parse diffs from git repositories.","ref":"Bonfire.Common.Extensions.Diff.html"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"Analyzes the diff stream from the specified path.\n\nThis function streams the diff data and processes it as it becomes available. See `GitDiff.stream_patch/1` for details on the expected output.","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"- `path_diff`: The path to the file containing the diff.","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream/1","doc":"> {:ok, stream} = Bonfire.Common.Extensions.Diff.analyse_repo_latest_diff_stream(\"./path/to/diff.patch\")","ref":"Bonfire.Common.Extensions.Diff.html#analyse_repo_latest_diff_stream/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"Generates a diff between the specified reference or branch and the latest commit in the repository.","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.generate_diff/2","doc":"> Bonfire.Common.Extensions.Diff.generate_diff(\"main\", \"./\")\n {:ok, \"Diff generated successfully\", \"...diff content...\"}\n\n > Bonfire.Common.Extensions.Diff.generate_diff(\"test_fake_branch\", \"./\")\n {:error, \"Could not generate latest diff.\"}","ref":"Bonfire.Common.Extensions.Diff.html#generate_diff/2-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git!/4","doc":"Executes a git command with the specified arguments.","ref":"Bonfire.Common.Extensions.Diff.html#git!/4"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.git!/4","doc":"- `args`: The list of arguments for the git command.\n - `repo_path`: The path to the repository.\n - `into`: Optional destination for command output (defaults to standard output)\n - `original_cwd`: The original working directory.","ref":"Bonfire.Common.Extensions.Diff.html#git!/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.git!/4","doc":"> Bonfire.Common.Extensions.Diff.git!([\"status\"], \"./\")","ref":"Bonfire.Common.Extensions.Diff.html#git!/4-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_add_all/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_add_all/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_fetch/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_fetch/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"Generates a diff and saves it to the specified output path.","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.\n - `path_output`: The path where the diff output will be saved.\n - `extra_opt`: Optional extra options for git diff command.","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.git_generate_diff/4","doc":"iex> Bonfire.Common.Extensions.Diff.git_generate_diff(\"main\", \"./\", \"./data/test_output.patch\")","ref":"Bonfire.Common.Extensions.Diff.html#git_generate_diff/4-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.git_pre_configure/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#git_pre_configure/1"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"Parses the latest diff from the specified path. See `GitDiff.parse_patch/1` for details about what it outputs.","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"- `path_diff`: The path to the file containing the diff.","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.parse_repo_latest_diff/1","doc":"> Bonfire.Common.Extensions.Diff.parse_repo_latest_diff(\"./path/to/diff.patch\")\n {:ok, ...}\n\n > Bonfire.Common.Extensions.Diff.parse_repo_latest_diff(\"./path/to/empty.patch\")\n {:error, :no_diff}","ref":"Bonfire.Common.Extensions.Diff.html#parse_repo_latest_diff/1-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"Fetches the latest diff from the specified reference or branch in the repository.","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3"},{"type":"function","title":"Parameters - Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"- `ref_or_branch`: The reference or branch to compare against.\n - `repo_path`: The path to the repository.\n - `msg`: Optional message to include with the diff.","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Extensions.Diff.repo_latest_diff/3","doc":"> Bonfire.Common.Extensions.Diff.repo_latest_diff(\"main\", \"./\")\n {:ok, \"Diff message\", \"...diff content...\"}\n\n > Bonfire.Common.Extensions.Diff.repo_latest_diff(\"test_fake_branch\", \"./\")\n {:error, :no_diff}","ref":"Bonfire.Common.Extensions.Diff.html#repo_latest_diff/3-examples"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.root/0","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#root/0"},{"type":"function","title":"Bonfire.Common.Extensions.Diff.tmp_path/1","doc":"","ref":"Bonfire.Common.Extensions.Diff.html#tmp_path/1"},{"type":"module","title":"Bonfire.Common.HTTP","doc":"Module for building and performing HTTP requests.","ref":"Bonfire.Common.HTTP.html"},{"type":"function","title":"Bonfire.Common.HTTP.delete/4","doc":"Makes a DELETE request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#delete/4"},{"type":"function","title":"Bonfire.Common.HTTP.get/3","doc":"Makes a GET request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#get/3"},{"type":"function","title":"Bonfire.Common.HTTP.get_cached/1","doc":"","ref":"Bonfire.Common.HTTP.html#get_cached/1"},{"type":"function","title":"Bonfire.Common.HTTP.patch/4","doc":"Makes a PATCH request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#patch/4"},{"type":"function","title":"Bonfire.Common.HTTP.post/4","doc":"Makes a POST request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#post/4"},{"type":"function","title":"Bonfire.Common.HTTP.put/4","doc":"Makes a PUT request\n\nsee `request/5`","ref":"Bonfire.Common.HTTP.html#put/4"},{"type":"function","title":"Bonfire.Common.HTTP.request/5","doc":"Builds and perform http request.\n\n# Arguments:\n`method` - :get, :post, :put, :delete\n`url`\n`body`\n`headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n`options` - custom, per-request middleware or adapter options\n\n# Returns:\n`{:ok, %Tesla.Env{}}` or `{:error, error}`","ref":"Bonfire.Common.HTTP.html#request/5"},{"type":"type","title":"Bonfire.Common.HTTP.t/0","doc":"","ref":"Bonfire.Common.HTTP.html#t:t/0"},{"type":"module","title":"Bonfire.Common.HTTP.Connection","doc":"Specifies connection options for HTTP requests","ref":"Bonfire.Common.HTTP.Connection.html"},{"type":"function","title":"Bonfire.Common.HTTP.Connection.adapter_options/2","doc":"","ref":"Bonfire.Common.HTTP.Connection.html#adapter_options/2"},{"type":"function","title":"Bonfire.Common.HTTP.Connection.new/1","doc":"","ref":"Bonfire.Common.HTTP.Connection.html#new/1"},{"type":"module","title":"Bonfire.Common.HTTP.RequestBuilder","doc":"Helper functions for building HTTP requests","ref":"Bonfire.Common.HTTP.RequestBuilder.html"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.add_param/4","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#add_param/4"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.headers/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#headers/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.method/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#method/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.opts/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#opts/2"},{"type":"function","title":"Bonfire.Common.HTTP.RequestBuilder.url/2","doc":"","ref":"Bonfire.Common.HTTP.RequestBuilder.html#url/2"},{"type":"module","title":"Bonfire.Common.Localise","doc":"Various helpers for localisation","ref":"Bonfire.Common.Localise.html"},{"type":"function","title":"Bonfire.Common.Localise.default_locale/0","doc":"Gets the default locale from the configuration or returns \"en\".","ref":"Bonfire.Common.Localise.html#default_locale/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.default_locale/0","doc":"iex> default_locale()\n \"en\"","ref":"Bonfire.Common.Localise.html#default_locale/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.get_locale/0","doc":"Gets the current locale from the Cldr module.","ref":"Bonfire.Common.Localise.html#get_locale/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.get_locale/0","doc":"iex> get_locale()\n Bonfire.Common.Localise.Cldr.Locale.new!(\"en\")","ref":"Bonfire.Common.Localise.html#get_locale/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.get_locale_id/0","doc":"Gets the current locale ID.","ref":"Bonfire.Common.Localise.html#get_locale_id/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.get_locale_id/0","doc":"iex> get_locale_id()\n :en","ref":"Bonfire.Common.Localise.html#get_locale_id/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.known_locales/0","doc":"Gets the known locales from the Cldr module.","ref":"Bonfire.Common.Localise.html#known_locales/0"},{"type":"function","title":"Examples - Bonfire.Common.Localise.known_locales/0","doc":"> known_locales()\n [:en, :es, :fr]","ref":"Bonfire.Common.Localise.html#known_locales/0-examples"},{"type":"function","title":"Bonfire.Common.Localise.locale_name/1","doc":"Converts a locale atom to its string representation.","ref":"Bonfire.Common.Localise.html#locale_name/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.locale_name/1","doc":"iex> locale_name(:en)\n \"English\"\n iex> locale_name(\"fr\")\n \"French\"","ref":"Bonfire.Common.Localise.html#locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.put_locale/1","doc":"Sets the given locale for both Cldr and Gettext.","ref":"Bonfire.Common.Localise.html#put_locale/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.put_locale/1","doc":"iex> put_locale(\"es\")\n nil","ref":"Bonfire.Common.Localise.html#put_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.set_locale_config/0","doc":"Config for the `Cldr.Plug.SetLocale` plug","ref":"Bonfire.Common.Localise.html#set_locale_config/0"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.available_locale_name?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#available_locale_name?/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.default_locale/0","doc":"Returns the default `locale`.","ref":"Bonfire.Common.Localise.Cldr.html#default_locale/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.default_locale/0","doc":"iex> Bonfire.Common.Localise.Cldr.default_locale()\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#default_locale/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.default_territory/0","doc":"Returns the default territory when a locale\ndoes not specify one and none can be inferred.","ref":"Bonfire.Common.Localise.Cldr.html#default_territory/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.default_territory/0","doc":"iex> Bonfire.Common.Localise.Cldr.default_territory()\n :\"001\"","ref":"Bonfire.Common.Localise.Cldr.html#default_territory/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.ellipsis/2","doc":"Add locale-specific ellipsis to a string.","ref":"Bonfire.Common.Localise.Cldr.html#ellipsis/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.ellipsis/2","doc":"iex> Bonfire.Common.Localise.Cldr.ellipsis(\"And furthermore\")\n \"And furthermore…\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis([\"And furthermore\", \"there is much to be done\"], locale: :ja)\n \"And furthermore…there is much to be done\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis(\"And furthermore\", format: :word)\n \"And furthermore …\"\n\n iex> Bonfire.Common.Localise.Cldr.ellipsis([\"And furthermore\", \"there is much to be done\"], locale: :ja, format: :word)\n \"And furthermore … there is much to be done\"","ref":"Bonfire.Common.Localise.Cldr.html#ellipsis/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#get_locale/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.get_locale/0","doc":"iex> Bonfire.Common.Localise.Cldr.put_locale(\"pl\")\n iex> Bonfire.Common.Localise.Cldr.get_locale()\n %Cldr.LanguageTag{\n backend: Elixir.Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#get_locale/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_calendars/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_calendars/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_currencies/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_currencies/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_gettext_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_gettext_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_gettext_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name(\"en\")\n \"en\"\n\n iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name(\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Gettext.","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_gettext_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?(\"en\")\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?(\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_gettext_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_locale_name(:\"en-AU\")\n :\"en-AU\"\n\n iex> Bonfire.Common.Localise.Cldr.known_locale_name(:\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr.","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:en)\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_number_system_types/0","doc":"Returns a list of atoms representing the number systems types known to `Cldr`.","ref":"Bonfire.Common.Localise.Cldr.html#known_number_system_types/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.known_number_system_types/0","doc":"iex> Bonfire.Common.Localise.Cldr.known_number_system_types()\n [:default, :finance, :native, :traditional]","ref":"Bonfire.Common.Localise.Cldr.html#known_number_system_types/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_number_systems/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_number_systems/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:en)\n :en\n\n iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:\"en-SA\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?/1","doc":"iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:en)\n true\n\n iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:\"!!\")\n false","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_name?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_rbnf_locale_names/0","doc":"Returns a list of locale names which have rules-based number\nformats (RBNF).","ref":"Bonfire.Common.Localise.Cldr.html#known_rbnf_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.known_territories/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#known_territories/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.normalize_lenient_parse/3","doc":"Normalizes a string by applying transliteration\nof common symbols in numbers, currencies and dates","ref":"Bonfire.Common.Localise.Cldr.html#normalize_lenient_parse/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"Set the current process's Gettext locale from a\n`t:Cldr.LanguageTag`.","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`.","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"* `{:ok, gettext_locale_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-returns"},{"type":"function","title":"Behaviour - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-behaviour"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.put_gettext_locale/1","doc":"iex> import Cldr.LanguageTag.Sigil\n iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l\"en\")\n {:ok, \"en\"}\n\n iex> import Cldr.LanguageTag.Sigil\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_gettext_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.put_locale/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`\n\nSee [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Bonfire.Common.Localise.Cldr.html#put_locale/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.put_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.put_locale(\"en\")\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#put_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.quote/2","doc":"Add locale-specific quotation marks around a string.","ref":"Bonfire.Common.Localise.Cldr.html#quote/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.quote/2","doc":"* `string` is any valid Elixir string\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.html#quote/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#quote/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.quote/2","doc":"iex> Bonfire.Common.Localise.Cldr.quote(\"Quoted String\")\n \"“Quoted String”\"\n\n iex> Bonfire.Common.Localise.Cldr.quote(\"Quoted String\", locale: :ja)\n \"「Quoted String」\"","ref":"Bonfire.Common.Localise.Cldr.html#quote/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#unknown_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_calendar/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_calendar/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_currency/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_currency/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"Normalise and validate a locale name.","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"* `{:ok, language_tag}`\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"See [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.validate_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.validate_locale(:en)\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale Bonfire.Common.Localise.Cldr.default_locale()\n {:ok,\n %Cldr.LanguageTag{\n backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.html#validate_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_number_system/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"Normalise and validate a number system type.","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"* `{:ok, normalized_number_system_type}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.validate_number_system_type/1","doc":"iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:default)\n {:ok, :default}\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:traditional)\n {:ok, :traditional}\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:latn)\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type :latn is unknown\"}\n }\n\n iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(\"bork\")\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type \\\"bork\\\" is invalid\"}\n }","ref":"Bonfire.Common.Localise.Cldr.html#validate_number_system_type/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.validate_territory/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.html#validate_territory/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.with_locale/2","doc":"Execute a function with a locale ensuring that the\ncurrent locale is restored after the function.","ref":"Bonfire.Common.Localise.Cldr.html#with_locale/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#with_locale/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.html#with_locale/2-returns"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"Parse an `Accept-Language` string and return the best match for\na configured `Cldr` locale.","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"* `accept_language` is a string representing an accept language header","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match/1","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#best_match/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.AcceptLanguage.parse!/1","doc":"iex> Bonfire.Common.Localise.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 Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.AcceptLanguage.html#parse!/1-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Calendar","doc":"Data functions to retrieve localised calendar\ninformation.\n\n`Cldr` defines formats for several calendars, the names of which\nare returned by `Cldr.known_calendars/0`.\n\nCurrently this implementation only supports the `:gregorian`,\n`:persian`, `:coptic` and `ethiopic` calendars.\n\nThe `:gregorian` calendar aligns with the proleptic Gregorian calendar\ndefined by Elixir, `Calendar.ISO`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"Return the calendar module for a locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"* `:locale` is any locale or locale name validated\n by `Cldr.validate_locale/2`. The default is\n `Cldr.get_locale()` which returns the locale\n set for the current process","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"* `{:ok, calendar_module}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en-GB\"\n {:ok, Cldr.Calendar.GB}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en-GB-u-ca-gregory\"\n {:ok, Cldr.Calendar.Gregorian}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"en\"\n {:ok, Cldr.Calendar.US}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale \"fa-IR\"\n {:ok, Cldr.Calendar.Persian}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"Returns the calendar module preferred for\na territory.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"* `territory` is any valid ISO3166-2 code as\n an `String.t` or upcased `atom()`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"* `{:ok, calendar_module}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory(:US)\n {:ok, Cldr.Calendar.US}\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory :XX\n {:error, {Cldr.UnknownTerritoryError, \"The territory :XX is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-examples"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory/1","doc":"The overwhelming majority of territories have\n`:gregorian` as their first preferred calendar\nand therefore `Cldr.Calendar.Gregorian`\nwill be returned for most territories.\n\nReturning any other calendar module would require:\n\n1. That another calendar is preferred over `:gregorian`\n for a territory\n\n2. That a calendar module is available to support\n that calendar.\n\nAs an example, Iran (territory `:IR`) prefers the\n`:persian` calendar. If the optional library\n[ex_cldr_calendars_persian](https://hex.pm/packages/ex_cldr_calendars_persian)\nis installed, the calendar module `Cldr.Calendar.Persian` will\nbe returned. If it is not installed, `Cldr.Calendar.Gregorian`\nwill be returned as `:gregorian` is the second preference\nfor `:IR`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#calendar_from_territory/1-notes"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.cyclic_years/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#cyclic_years/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.day_periods/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#day_periods/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.days/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#days/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.eras/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#eras/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"Localize a date by converting it to calendar\nintrospected from the provided or default locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `date` is any `t:Date.t/0`.\n\n* `options` is a `t:Keyword.t/0` list of options. The default is\n `[]`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `:locale` is any valid locale name in the list returned by\n `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct\n returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale()`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"* `{:ok, date}` where `date` is converted into the calendar\n associated with the current or provided locale.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.localize/1","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2022-06-09], locale: \"fr\"\n {:ok, %Date{year: 2022, month: 6, day: 9, calendar: Cldr.Calendar.FR}}","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"Returns a localized string for a part of\na `t:Date.t/0`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* `date` is any `t:Date.t/0`.\n\n* `part` is one of `:era`, `:quarter`, `:month`,\n `:day_of_week` or `:days_of_week`.\n\n* `options` is a `t:Keyword.t/0` list of options.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* `:locale` is any valid locale name in the list returned by\n `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct\n returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale()`.\n\n* `:format` is one of `:wide`, `:abbreviated` or `:narrow`. The\n default is `:abbreviated`.\n\n* `:era` will, if set to `:variant` will localize the era using\n the variant data. In the `:en` locale, this will produce `CE` and\n `BCE` rather than the default `AD` and `BC`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"* A string representing the localized date part, or\n\n* A list of strings representing the days of the week for\n when `part` is `:days_of_week`. The days are in week order for\n the given date's calendar, or\n\n* `{error, {exception, reason}}` if an error is detected","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Calendar.localize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :era\n \"AD\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :era, era: :variant\n \"CE\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :day_of_week\n \"Tue\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[0001-01-01], :day_of_week\n \"Mon\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-01-01], :days_of_week\n [{1, \"Mon\"}, {2, \"Tue\"}, {3, \"Wed\"}, {4, \"Thu\"}, {5, \"Fri\"}, {6, \"Sat\"}, {7, \"Sun\"}]\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :era\n \"AD\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :quarter\n \"Q2\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :month\n \"Jun\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week\n \"Sat\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, format: :wide\n \"Saturday\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, format: :narrow\n \"S\"\n\n iex> Bonfire.Common.Localise.Cldr.Calendar.localize ~D[2019-06-01], :day_of_week, locale: \"ar\"\n \"السبت\"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#localize/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.month_patterns/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#month_patterns/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.months/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#months/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.quarters/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#quarters/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"Returns a keyword list of options than can be applied to\n`NimbleStrftime.format/3`.\n\nThe hex package [nimble_strftime](https://hex.pm/packages/nimble_strftime)\nprovides a `format/3` function to format dates, times and datetimes.\nIt takes a set of options that can return day, month and am/pm names.\n\n`strftime_options!` returns a keyword list than can be used as these\noptions to return localised names for days, months and am/pm.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"* `locale` is any locale returned by `MyApp.Cldr.known_locale_names/0`. The\n default is `MyApp.Cldr.get_locale/0`\n\n* `options` is a set of keyword options. The default is `[]`","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"* `:calendar` is the name of any known CLDR calendar. The default\n is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-options"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"iex: MyApp.Cldr.Calendar.strftime_options!()\n [\n am_pm_names: #Function<0.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n month_names: #Function<1.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n abbreviated_month_names: #Function<2.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n day_of_week_names: #Function<3.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,\n abbreviated_day_of_week_names: #Function<4.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>\n ]","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-example"},{"type":"function","title":"Typical usage - Bonfire.Common.Localise.Cldr.Calendar.strftime_options!/2","doc":"iex: NimbleStrftime.format(Date.utc_today(), MyApp.Cldr.Calendar.strftime_options!())","ref":"Bonfire.Common.Localise.Cldr.Calendar.html#strftime_options!/2-typical-usage"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Currency","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale/3","doc":"Returns a map of the metadata for all currencies for\na given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale/3","doc":"* `{:ok, currency_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currencies_for_locale!/3","doc":"* `{:ok, currency_map}` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currencies_for_locale!/3-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"* A `{:ok, currency}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_for_code/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"* A `t:Cldr.Current.t/0` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_for_code!/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_for_code!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"Returns the effective currency for a given locale","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by\n `Cldr.Locale.new!/2`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"* A ISO 4217 currency code as an upcased atom","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.currency_from_locale/1","doc":"iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale(\"en\")\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale\n :USD\n\n iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale(\"en-AU\")\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale\n :AUD\n\n iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale(\"en-GB\")\n :GBP","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.currency_history_for_locale/1","doc":"Returns a list of historic and the current\ncurrency for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_history_for_locale/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_strings/3","doc":"* `{:ok, currency_string_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.currency_strings!/3","doc":"* `{:ok, currency_string_map}` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#currency_strings!/3-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_currency_from_locale/1-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies/0","doc":"* A map of `{territory_code => Cldr.Currency.t}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies/0","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies()","ref":"Bonfire.Common.Localise.Cldr.Currency.html#current_territory_currencies/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currencies/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currencies/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency?/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"Returns a 2-tuple indicating if the supplied currency code is known.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"* `{:ok, currency_code}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.known_currency_code/1","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code(\"AUD\")\n {:ok, :AUD}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code(\"GGG\")\n {:error, {Cldr.UnknownCurrencyError, \"The currency \\\"GGG\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"Returns a boolean indicating if the supplied currency code is known.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"* `true` or `false`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.known_currency_code?/1","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(\"AUD\")\n true\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(\"GGG\")\n false\n\n iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(:XCV)\n false","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_code?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.known_currency_codes/0","doc":"Returns a list of all known currency codes.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_codes/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.known_currency_codes/0","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_codes()","ref":"Bonfire.Common.Localise.Cldr.Currency.html#known_currency_codes/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"Returns a `Currency` struct created from the arguments.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"* `{:ok, Cldr.Currency.t}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.new/2","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Currency.new(:XAE, name: \"XAE\", digits: 0)\n {:error, {Cldr.CurrencyAlreadyDefined, \"Currency :XAE is already defined.\"}}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#new/2-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.pluralize/3","doc":"* `{:ok, plural_string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Currency.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD)\n {:ok, \"US dollar\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(3, :USD)\n {:ok, \"US dollars\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: \"zh\")\n {:ok, \"美元\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: \"fr\")\n {:ok, \"dollars des États-Unis\"}\n\n iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD, locale: \"fr\")\n {:ok, \"dollar des États-Unis\"}","ref":"Bonfire.Common.Localise.Cldr.Currency.html#pluralize/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"Returns the strings associated with a currency\nin a given locale.","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"* A list of strings or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-returns"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Currency.strings_for_currency/2","doc":"iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, \"en\")\n ...> |> Enum.sort()\n [\"a$\", \"aud\", \"australian dollar\", \"australian dollars\"]","ref":"Bonfire.Common.Localise.Cldr.Currency.html#strings_for_currency/2-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Date","doc":"","ref":"Bonfire.Common.Localise.Cldr.Date.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"Formats a date according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html).","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `date` is a `t:Date.t/0` struct or any map that contains one or more\n of the keys `:year`, `:month`, `:day` and optionally `:calendar`.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full dates (that is,\n dates having `:year`, `:month`, `:day` and `:calendar` fields). The\n default for partial dates is to derive a candidate format id from the date and\n find the best match from the formats returned by\n `Cldr.Date.available_formats/3`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits\n should be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Date.available_formats/3`\n to see which formats have these variants. Currently no date-specific\n formats have such variants but they may in the future.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"* `{:ok, formatted_string}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.to_string/2","doc":"# Full dates have the default format `:medium`\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], locale: :en)\n {:ok, \"Jul 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :medium, locale: :en)\n {:ok, \"Jul 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :full, locale: :en)\n {:ok, \"Monday, July 10, 2017\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :short, locale: :en)\n {:ok, \"7/10/17\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(~D[2017-07-10], format: :short, locale: \"fr\")\n {:ok, \"10/07/2017\"}\n\n # A partial date with a derived \"best match\" format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, month: 6}, locale: \"fr\")\n {:ok, \"06/2024\"}\n\n # A partial date with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, month: 6}, format: :yMMM, locale: \"fr\")\n {:ok, \"juin 2024\"}\n\n # Sometimes the available date fields can't be mapped to an available\n # CLDR defined format.\n iex> Bonfire.Common.Localise.Cldr.Date.to_string(%{year: 2024, day: 3}, locale: \"fr\")\n {:error,\n {Cldr.DateTime.UnresolvedFormat, \"No available format resolved for :dy\"}}","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"Formats a date according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nor raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `date` is a `t:Date.t/0` struct or any map that contains one or more\n of the keys `:year`, `:month`, `:day` and optionally `:calendar`.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full dates (that is,\n dates having `:year`, `:month`, `:day` and `:calendar` fields). The\n default for partial dates is to derive a candidate format id from the date and\n find the best match from the formats returned by\n `Cldr.Date.available_formats/3`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits\n should be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Date.available_formats/3`\n to see which formats have these variants. Currently no date-specific\n formats have such variants but they may in the future.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"* `formatted_date` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], locale: :en)\n \"Jul 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :medium, locale: :en)\n \"Jul 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :full, locale: :en)\n \"Monday, July 10, 2017\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :short, locale: :en)\n \"7/10/17\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(~D[2017-07-10], format: :short, locale: \"fr\")\n \"10/07/2017\"\n\n # A partial date with a derived \"best match\" format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(%{year: 2024, month: 6}, locale: \"fr\")\n \"06/2024\"\n\n # A partial date with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Date.to_string!(%{year: 2024, month: 6}, format: :yMMM, locale: \"fr\")\n \"juin 2024\"","ref":"Bonfire.Common.Localise.Cldr.Date.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Date.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3` and `Bonfire.Common.Localise.Cldr.Interval.to_string/3`","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"Returns a interval formed from two dates as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.date` type.\n\n* `to` is any map that conforms to the\n `Calendar.date` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone date.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-31]\n {:ok, \"Jan 1 – Dec 31, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12]\n {:ok, \"Jan 1 – 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month\n {:ok, \"January – December 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :short\n {:ok, \"1/1/2020 – 1/12/2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long, locale: \"fr\"\n {:ok, \"mer. 1 – dim. 12 janv. 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long, locale: \"th\", number_system: :thai\n {:ok, \"พ. ๑ ม.ค. – อา. ๑๒ ม.ค. ๒๐๒๐\"}","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"Returns a interval formed from two dates as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.date` type.\n\n* `to` is any map that conforms to the\n `Calendar.date` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone date.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Date.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-31])\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12])\n \"Jan 1 – 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :long\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-01]),\n ...> format: :long, style: :year_and_month\n \"January – December 2020\"\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! ~I\"2020-01/12\"\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :short\n \"1/1/2020 – 1/12/2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),\n ...> format: :long, locale: \"fr\"\n \"mer. 1 – dim. 12 janv. 2020\"","ref":"Bonfire.Common.Localise.Cldr.Date.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"Formats a DateTime according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `datetime` is a `t:DateTime.t/0` `or t:NaiveDateTime.t/0`struct or any map that contains\n one or more of the keys `:year`, `:month`, `:day`, `:hour`, `:minute` and `:second` or\n `:microsecond` with optional `:time_zone`, `:zone_abbr`, `:utc_offset`, `:std_offset`\n and `:calendar` fields.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full` or a format string or\n any of the keys in the map returned by `Cldr.DateTime.date_time_formats/3`.\n The default is `:medium`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:date_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the date part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:date_format` is not specified\n then the date format is defined by the `:format` option.\n\n* `:time_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the time part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:time_format` is not specified\n then the time format is defined by the `:format` option.\n\n* `:style` is either `:at` or `:default`. When set to `:at` the datetime may\n be formatted with a localised string representing ` at ` if such\n a format exists. See `Cldr.DateTime.Format.date_time_at_formats/2`.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.DateTime.available_formats/3`\n to see which formats have these variants.\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted datetime digits should\n be transliterated.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"* `{:ok, formatted_datetime}` or\n\n* `{:error, reason}`","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.to_string/2","doc":"iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime\n {:ok, \"Jan 1, 2000, 11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, locale: \"en\"\n {:ok, \"Jan 1, 2000, 11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :long, locale: \"en\"\n {:ok, \"January 1, 2000, 11:59:59 PM UTC\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :hms, locale: \"en\"\n {:ok, \"11:59:59 PM\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: \"en\"\n {:ok, \"Saturday, January 1, 2000, 11:59:59 PM GMT\"}\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: \"fr\"\n {:ok, \"samedi 1 janvier 2000, 23:59:59 UTC\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"Formats a DateTime according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nreturning a formatted string or raising on error.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `datetime` is a `t:DateTime.t/0` `or t:NaiveDateTime.t/0`struct or any map that contains\n one or more of the keys `:year`, `:month`, `:day`, `:hour`, `:minute` and `:second` or\n `:microsecond` with optional `:time_zone`, `:zone_abbr`, `:utc_offset`, `:std_offset`\n and `:calendar` fields.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full` or a format string or\n any of the keys in the map returned by `Cldr.DateTime.date_time_formats/3`.\n The default is `:medium`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:date_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the date part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:date_format` is not specified\n then the date format is defined by the `:format` option.\n\n* `:time_format` is any one of `:short`, `:medium`, `:long`, `:full`. If defined,\n this option is used to format the time part of the date time. This option is\n only acceptable if the `:format` option is not specified, or is specified as either\n `:short`, `:medium`, `:long`, `:full`. If `:time_format` is not specified\n then the time format is defined by the `:format` option.\n\n* `:style` is either `:at` or `:default`. When set to `:at` the datetime may\n be formatted with a localised string representing ` at ` if such\n a format exists. See `Cldr.DateTime.Format.date_time_at_formats/2`.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.DateTime.available_formats/3`\n to see which formats have these variants.\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted datetime digits should\n be transliterated.\n\n* `:era` which, if set to `:variant`, will use a variant for the era if one\n is available in the requested locale. In the `:en` locale, for example, `era: :variant`\n will return `CE` instead of `AD` and `BCE` instead of `BC`.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"* `formatted_datetime` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.to_string!/2","doc":"iex> {:ok, date_time} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, locale: :en)\n \"Jan 1, 2000, 11:59:59 PM\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :long, locale: :en)\n \"January 1, 2000, 11:59:59 PM UTC\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :full, locale: :en)\n \"Saturday, January 1, 2000, 11:59:59 PM GMT\"\n iex> Bonfire.Common.Localise.Cldr.DateTime.to_string!(date_time, format: :full, locale: :fr)\n \"samedi 1 janvier 2000, 23:59:59 UTC\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Format","doc":"Manages the Date, TIme and DateTime formats\ndefined by CLDR.\n\nThe functions in `Cldr.DateTime.Format` are\nprimarily concerned with encapsulating the\ndata from CLDR in functions that are used\nduring the formatting process.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"Returns a list of calendars defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for(:en)\n {:ok, [:buddhist, :chinese, :coptic, :dangi, :ethiopic, :ethiopic_amete_alem,\n :generic, :gregorian, :hebrew, :indian, :islamic, :islamic_civil,\n :islamic_rgsa, :islamic_tbla, :islamic_umalqura, :japanese, :persian, :roc]}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#calendars_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names/0","doc":"Returns a list of the date_time format IDs that are\navailable in all known locales.\n\nThe format IDs returned by `common_date_time_format_names/0`\nare guaranteed to be available in all known locales,","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#common_date_time_format_names/0"},{"type":"function","title":"Example: - Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names/0","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.common_date_time_format_names()\n [:Bh, :Bhm, :Bhms, :E, :EBhm, :EBhms, :EHm, :EHms, :Ed, :Ehm, :Ehms, :Gy,\n :GyMMM, :GyMMMEd, :GyMMMd, :GyMd, :H, :Hm, :Hms, :Hmsv, :Hmv, :M, :MEd, :MMM,\n :MMMEd, :MMMMW, :MMMMd, :MMMd, :Md, :d, :h, :hm, :hms, :hmsv, :hmv, :ms, :y,\n :yM, :yMEd, :yMMM, :yMMMEd, :yMMMM, :yMMMd, :yMd, :yQQQ, :yQQQQ, :yw]","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#common_date_time_format_names/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"Returns a map of the available date formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_available_formats \"en\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"Returns a map of the standard date formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en)\n {:ok, %Cldr.Date.Formats{\n full: \"EEEE, MMMM d, y\",\n long: \"MMMM d, y\",\n medium: \"MMM d, y\",\n short: \"M/d/yy\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en, :buddhist)\n {:ok, %Cldr.Date.Formats{\n full: \"EEEE, MMMM d, y G\",\n long: \"MMMM d, y G\",\n medium: \"MMM d, y G\",\n short: \"M/d/y GGGGG\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"Returns a map of the standard datetime \"at\" formats for a given\nlocale and calendar.\n\nAn \"at\" format is one where the datetime is formatted with the\ndate part separated from the time part by a localized version\nof \"at\".","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`,","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1} 'at' {0}\",\n long: \"{1} 'at' {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"}\n }\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en, :buddhist)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1} 'at' {0}\",\n long: \"{1} 'at' {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"}\n }","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_at_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"Returns a map of the available datetime formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats \"en\"\n {:ok,\n %{\n yw: %{\n other: \"'week' w 'of' Y\",\n one: \"'week' w 'of' Y\",\n pluralize: :week_of_year\n },\n GyMMMEd: \"E, MMM d, y G\",\n Hms: \"HH:mm:ss\",\n MMMMW: %{\n other: \"'week' W 'of' MMMM\",\n one: \"'week' W 'of' MMMM\",\n pluralize: :week_of_month\n },\n E: \"ccc\",\n MMMd: \"MMM d\",\n yMEd: \"E, M/d/y\",\n yQQQ: \"QQQ y\",\n Ehm: %{unicode: \"E h:mm a\", ascii: \"E h:mm a\"},\n M: \"L\",\n hm: %{unicode: \"h:mm a\", ascii: \"h:mm a\"},\n yM: \"M/y\",\n GyMMMd: \"MMM d, y G\",\n GyMd: \"M/d/y G\",\n Gy: \"y G\",\n Hm: \"HH:mm\",\n EBhms: \"E h:mm:ss B\",\n d: \"d\",\n hms: %{unicode: \"h:mm:ss a\", ascii: \"h:mm:ss a\"},\n Ed: \"d E\",\n Ehms: %{unicode: \"E h:mm:ss a\", ascii: \"E h:mm:ss a\"},\n EHms: \"E HH:mm:ss\",\n Bh: \"h B\",\n h: %{unicode: \"h a\", ascii: \"h a\"},\n Bhms: \"h:mm:ss B\",\n Hmv: \"HH:mm v\",\n hmv: %{unicode: \"h:mm a v\", ascii: \"h:mm a v\"},\n yMd: \"M/d/y\",\n ms: \"mm:ss\",\n MMM: \"LLL\",\n y: \"y\",\n Bhm: \"h:mm B\",\n yMMM: \"MMM y\",\n yQQQQ: \"QQQQ y\",\n yMMMEd: \"E, MMM d, y\",\n yMMMM: \"MMMM y\",\n EBhm: \"E h:mm B\",\n Hmsv: \"HH:mm:ss v\",\n yMMMd: \"MMM d, y\",\n MEd: \"E, M/d\",\n EHm: \"E HH:mm\",\n GyMMM: \"MMM y G\",\n hmsv: %{unicode: \"h:mm:ss a v\", ascii: \"h:mm:ss a v\"},\n H: \"HH\",\n Md: \"M/d\",\n MMMEd: \"E, MMM d\",\n MMMMd: \"MMMM d\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"Returns a map of the standard datetime formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1}, {0}\",\n long: \"{1}, {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en, :buddhist)\n {:ok, %Cldr.DateTime.Formats{\n full: \"{1}, {0}\",\n long: \"{1}, {0}\",\n medium: \"{1}, {0}\",\n short: \"{1}, {0}\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"Returns the fallback format for a given\nlocale and calendar type","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback(:en, :gregorian)\n [0, \" – \", 1]","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_fallback/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"Returns a map of the interval formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_formats(:en, :gregorian)\n {:ok,\n %{\n h: %{a: [\"h a – \", \"h a\"], h: [\"h – \", \"h a\"]},\n d: %{d: [\"d – \", \"d\"]},\n y: %{y: [\"y – \", \"y\"]},\n M: %{M: [\"M – \", \"M\"]},\n Bh: %{h: [\"h – \", \"h B\"], B: [\"h B – \", \"h B\"]},\n Bhm: %{\n m: [\"h:mm – \", \"h:mm B\"],\n h: [\"h:mm – \", \"h:mm B\"],\n B: [\"h:mm B – \", \"h:mm B\"]\n },\n Gy: %{y: [\"y – \", \"y G\"], G: [\"y G – \", \"y G\"]},\n GyMMM: %{\n y: [\"MMM y – \", \"MMM y G\"],\n M: [\"MMM – \", \"MMM y G\"],\n G: [\"MMM y G – \", \"MMM y G\"]\n },\n GyMMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d, y G\"],\n y: [\"E, MMM d, y – \", \"E, MMM d, y G\"],\n M: [\"E, MMM d – \", \"E, MMM d, y G\"],\n G: [\"E, MMM d, y G – \", \"E, MMM d, y G\"]\n },\n GyMMMd: %{\n d: [\"MMM d – \", \"d, y G\"],\n y: [\"MMM d, y – \", \"MMM d, y G\"],\n M: [\"MMM d – \", \"MMM d, y G\"],\n G: [\"MMM d, y G – \", \"MMM d, y G\"]\n },\n GyMd: %{\n d: [\"M/d/y – \", \"M/d/y G\"],\n y: [\"M/d/y – \", \"M/d/y G\"],\n M: [\"M/d/y – \", \"M/d/y G\"],\n G: [\"M/d/y G – \", \"M/d/y G\"]\n },\n H: %{H: [\"HH – \", \"HH\"]},\n Hm: %{m: [\"HH:mm – \", \"HH:mm\"], H: [\"HH:mm – \", \"HH:mm\"]},\n Hmv: %{m: [\"HH:mm – \", \"HH:mm v\"], H: [\"HH:mm – \", \"HH:mm v\"]},\n MEd: %{d: [\"E, M/d – \", \"E, M/d\"], M: [\"E, M/d – \", \"E, M/d\"]},\n MMM: %{M: [\"MMM – \", \"MMM\"]},\n MMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d\"],\n M: [\"E, MMM d – \", \"E, MMM d\"]\n },\n MMMd: %{d: [\"MMM d – \", \"d\"], M: [\"MMM d – \", \"MMM d\"]},\n Md: %{d: [\"M/d – \", \"M/d\"], M: [\"M/d – \", \"M/d\"]},\n hm: %{\n m: [\"h:mm – \", \"h:mm a\"],\n a: [\"h:mm a – \", \"h:mm a\"],\n h: [\"h:mm – \", \"h:mm a\"]\n },\n hmv: %{\n m: [\"h:mm – \", \"h:mm a v\"],\n a: [\"h:mm a – \", \"h:mm a v\"],\n h: [\"h:mm – \", \"h:mm a v\"]\n },\n yM: %{y: [\"M/y – \", \"M/y\"], M: [\"M/y – \", \"M/y\"]},\n yMEd: %{\n d: [\"E, M/d/y – \", \"E, M/d/y\"],\n y: [\"E, M/d/y – \", \"E, M/d/y\"],\n M: [\"E, M/d/y – \", \"E, M/d/y\"]\n },\n yMMM: %{y: [\"MMM y – \", \"MMM y\"], M: [\"MMM – \", \"MMM y\"]},\n yMMMEd: %{\n d: [\"E, MMM d – \", \"E, MMM d, y\"],\n y: [\"E, MMM d, y – \", \"E, MMM d, y\"],\n M: [\"E, MMM d – \", \"E, MMM d, y\"]\n },\n yMMMM: %{y: [\"MMMM y – \", \"MMMM y\"], M: [\"MMMM – \", \"MMMM y\"]},\n yMMMd: %{\n d: [\"MMM d – \", \"d, y\"],\n y: [\"MMM d, y – \", \"MMM d, y\"],\n M: [\"MMM d – \", \"MMM d, y\"]\n },\n yMd: %{\n d: [\"M/d/y – \", \"M/d/y\"],\n y: [\"M/d/y – \", \"M/d/y\"],\n M: [\"M/d/y – \", \"M/d/y\"]\n },\n GyM: %{\n y: [\"M/y – \", \"M/y G\"],\n M: [\"M/y – \", \"M/y G\"],\n G: [\"M/y G – \", \"M/y G\"]\n },\n GyMEd: %{\n d: [\"E, M/d/y – \", \"E, M/d/y G\"],\n y: [\"E, M/d/y – \", \"E, M/d/y G\"],\n M: [\"E, M/d/y – \", \"E, M/d/y G\"],\n G: [\"E, M/d/y G – \", \"E, M/d/y G\"]\n },\n Hv: %{H: [\"HH – \", \"HH v\"]},\n hv: %{a: [\"h a – \", \"h a v\"], h: [\"h – \", \"h a v\"]}\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#date_time_interval_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"Returns the time period for a given time of day.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"* `time` is any `Time.t` or a map with at least `:hour`,\n `:minute` and `:second` keys\n\n* `language` is a binary representation of a valid and\n configured language in `Cldr`\n\nThe time period is a locale-specific key that is used\nto localise a time into a textual representation of \"am\",\n\"pm\", \"noon\", \"midnight\", \"evening\", \"morning\" and so on\nas defined in the CLDR day period rules.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[06:05:54.515228], :en\n :morning1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[13:05:54.515228], :en\n :afternoon1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[21:05:54.515228], :en\n :night1\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.day_period_for ~T[21:05:54.515228], :fr\n :evening1","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#day_period_for/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"Returns the GMT offset format list for a\nfor a timezone offset for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format(:en)\n {:ok, [\"GMT\", 0]}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"Returns the GMT format string for a\nfor a timezone with an offset of zero for\na given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format(:en)\n {:ok, \"GMT\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format(:fr)\n {:ok, \"UTC\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#gmt_zero_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"Returns the positive and negative hour format\nfor a timezone offset for a given locale.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format(\"en\")\n {:ok, {\"+HH:mm\", \"-HH:mm\"}}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#hour_format/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"Returns a boolean indicating is a given language defines the\nnotion of \"noon\" and \"midnight\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"* `language` is a binary representation of a valid and\n configured language in `Cldr`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight?/1","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :fr\n true\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :en\n true\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.language_has_noon_and_midnight? :af\n false","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#language_has_noon_and_midnight?/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"Returns a map of the available time formats for a\ngiven locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_available_formats :en","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_available_formats/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"Returns a map of the standard time formats for a given locale and calendar.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"* `locale` is any locale returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0`. The default is `Cldr.get_locale/0`.\n\n* `calendar` is any calendar returned by `Cldr.DateTime.Format.calendars_for/1`\n The default is `:gregorian`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2-arguments"},{"type":"function","title":"Examples: - Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en)\n {:ok, %Cldr.Time.Formats{\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\"\n }}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en, :buddhist)\n {:ok, %Cldr.Time.Formats{\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\"\n }}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#time_formats/2-examples"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.calendar/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#t:calendar/0"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.DateTime.Format.formats/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Format.html#t:formats/0"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","doc":"Implements the compilation and execution of\ndate, time and datetime formats.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"Returns the formatted and localised date, time or datetime\nfor a given `Date`, `Time`, `DateTime` or struct with the\nappropriate fields.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"* `date` is a `Date`, `Time`, `DateTime` or other struct that\ncontains the required date and time fields.\n\n* `format` is a valid format string, for example `yy/MM/dd hh:MM`\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Cldr.get_locale/0`\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"* `:number_system`. The resulting formatted and localised date/time\nstring will be transliterated into this number system. Number system\nis anything returned from `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`\n\n*NOTE* This function is called by `Cldr.Date.to_string/2`, `Cldr.Time.to_string/2`\nand `Cldr.DateTime.to_string/2` which is the preferred API.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Formatter.format/4","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Formatter.format ~U[2017-09-03 10:23:00.0Z], \"yy/MM/dd hh:MM\", \"en\"\n {:ok, \"17/09/03 10:09\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#format/4-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.gmt_tz_format/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Formatter.html#gmt_tz_format/3"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Cldr.Interval.to_string/3` and `Cldr.DateTime.Interval.to_string/3`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.do_to_string/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#do_to_string/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two dates.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.datetime` type.\n\n* `to` is any map that conforms to the\n `Calendar.datetime` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone datetime.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z],\n ...> ~U[2020-12-31 10:00:00.0Z]\n {:ok, \"Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z], nil\n {:ok, \"Jan 1, 2020, 12:00:00 AM –\"}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two dates or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.datetime` type.\n\n* `to` is any map that conforms to the\n `Calendar.datetime` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone datetime.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"* For more information on interval format string\n see the `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string! ~U[2020-01-01 00:00:00.0Z],\n ...> ~U[2020-12-31 10:00:00.0Z]\n \"Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM\"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative","doc":"","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"Returns a `{:ok, string}` representing a relative time (ago, in) for a given\nnumber, `t:Date.t/0` or `t:Datetime.t/0`. Returns `{:error, reason}` when errors\nare detected.\n\n* `relative` is a number or Date/Datetime representing the time distance from `now` or from\n options[:relative_to]\n\n* `options` is a `Keyword` list of options which are:","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"* `:locale` is the locale in which the binary is formatted.\n The default is `Cldr.get_locale/0`\n\n* `:format` is the format of the binary. Style may be `:default`, `:narrow` or `:short`\n\n* `:unit` is the time unit for the formatting. The allowable units are `:second`, `:minute`,\n `:hour`, `:day`, `:week`, `:month`, `:year`, `:mon`, `:tue`, `:wed`, `:thu`, `:fri`, `:sat`,\n `:sun`, `:quarter`\n\n* `:relative_to` is the baseline Date or Datetime from which the difference from `relative` is\n calculated when `relative` is a Date or a DateTime. The default for a Date is `Date.utc_today`,\n for a DateTime it is `DateTime.utc_now`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-options"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"When `options[:unit]` is not specified, `MyApp.Cldr.DateTime.Relative.to_string/2`\nattempts to identify the appropriate unit based upon the magnitude of `relative`.\nFor example, given a parameter of less than `60`, then `to_string/2` will\nassume `:seconds` as the unit. See `unit_from_relative_time/1`.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(-1)\n {:ok, \"1 second ago\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1)\n {:ok, \"in 1 second\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day)\n {:ok, \"tomorrow\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, locale: \"fr\")\n {:ok, \"demain\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, format: :narrow)\n {:ok, \"tomorrow\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year)\n {:ok, \"in 1,234 years\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year, locale: \"fr\")\n {:ok, \"dans 1 234 ans\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(31)\n {:ok, \"in 31 seconds\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], relative_to: ~D[2017-04-26])\n {:ok, \"in 3 days\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, format: :short, locale: \"fr\")\n {:ok, \"dans 5 min\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, format: :narrow, locale: \"fr\")\n {:ok, \"+5 min\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 2, unit: :wed, format: :short, locale: \"en\"\n {:ok, \"in 2 Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 1, unit: :wed, format: :short\n {:ok, \"next Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed, format: :short\n {:ok, \"last Wed.\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed\n {:ok, \"last Wednesday\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :quarter\n {:ok, \"last quarter\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :mon, locale: \"fr\"\n {:ok, \"lundi dernier\"}\n\n iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], unit: :ziggeraut)\n {:error, {Cldr.DateTime.UnknownTimeUnit,\n \"Unknown time unit :ziggeraut. Valid time units are [:day, :fri, :hour, :minute, :mon, :month, :quarter, :sat, :second, :sun, :thu, :tue, :wed, :week, :year]\"}}","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"Returns a `{:ok, string}` representing a relative time (ago, in) for a given\nnumber, Date or Datetime or raises an exception on error.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"* `relative` is a number or Date/Datetime representing the time distance from `now` or from\n options[:relative_to].\n\n* `options` is a `Keyword` list of options.","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string!/2","doc":"* `:locale` is the locale in which the binary is formatted.\n The default is `Cldr.get_locale/0`\n\n* `:format` is the format of the binary. Style may be `:default`, `:narrow` or `:short`.\n The default is `:default`\n\n* `:unit` is the time unit for the formatting. The allowable units are `:second`, `:minute`,\n `:hour`, `:day`, `:week`, `:month`, `:year`, `:mon`, `:tue`, `:wed`, `:thu`, `:fri`, `:sat`,\n `:sun`, `:quarter`\n\n* `:relative_to` is the baseline Date or Datetime from which the difference from `relative` is\n calculated when `relative` is a Date or a DateTime. The default for a Date is `Date.utc_today`,\n for a DateTime it is `DateTime.utc_now`\n\nSee `to_string/2`","ref":"Bonfire.Common.Localise.Cldr.DateTime.Relative.html#to_string!/2-options"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nThe interval functions in this library will determine the calendar\nfield with the greatest difference between the two datetimes before using the\nformat pattern.\n\nFor example, the greatest difference in \"Jan 10-12, 2008\" is the day field, while\nthe greatest difference in \"Jan 10 - Feb 12, 2008\" is the month field. This is used to\npick the exact pattern to be used.\n\nSee `Cldr.Interval` for further detail.","ref":"Bonfire.Common.Localise.Cldr.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"Returns a `Date.Range` or `CalendarInterval` as\na localised string.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `range` is either a `Date.Range.t` returned from `Date.range/2`\n or a `CalendarInterval.t`\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If a style is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"* `to_string/2` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string/2","doc":"iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~I\"2020-01-01/12\",\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string Date.range(~D[2020-01-01], ~D[2020-12-31]),\n ...> format: :long\n {:ok, \"Wed, Jan 1 – Thu, Dec 31, 2020\"}","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two dates.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n any one of the `Calendar` types.\n\n* `to` is any map that conforms to the\n any one of the `Calendar` types. `to` must\n occur on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If styling is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"* `to_string/2` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-12-31])\n {:ok, \"Jan 1 – Dec 31, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-01-12])\n {:ok, \"Jan 1 – 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long)\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month)\n {:ok, \"January – December 2020\"}\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~I\"2020-01-01/12\",\n ...> format: :long)\n {:ok, \"Wed, Jan 1 – Sun, Jan 12, 2020\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~U[2020-01-01 00:00:00.0Z], ~U[2020-12-01 10:05:00.0Z],\n ...> format: :long)\n {:ok, \"January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC\"}\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string(~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:05:00.0Z],\n ...> format: :long)\n {:ok, \"January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC\"}","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"Returns a `Date.Range` or `CalendarInterval` as\na localised string or raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `range` is either a `Date.Range.t` returned from `Date.range/2`\n or a `CalendarInterval.t`\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If a style is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`.\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"* `to_string/3` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Otherwise\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string!/2","doc":"iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~I\"2020-01-01/12\",\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(Date.range(~D[2020-01-01], ~D[2020-12-31]),\n ...> format: :long)\n \"Wed, Jan 1 – Thu, Dec 31, 2020\"","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two date or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n any one of the `Calendar` types.\n\n* `to` is any map that conforms to the\n any one of the `Calendar` types. `to` must\n occur on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :date | :time | nil]`.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The valid\n styles depends on whether formatting is for a date, time or datetime.\n Since the functions in this module will make a determination as\n to which formatter to be used based upon the data passed to them\n it is recommended the style option be omitted. If styling is important\n then call `to_string/3` directly on `Cldr.Date.Interval`, `Cldr.Time.Interval`\n or `Cldr.DateTime.Interval`.\n\n * For a date the alternatives are `:date`, `:month_and_day`, `:month`\n and `:year_and_month`. The default is `:date`.\n\n * For a time the alternatives are `:time`, `:zone` and\n `:flex`. The default is `:time`.\n\n * For a datetime there are no style options, the default\n for each of the date and time part is used.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `string` or\n\n* raises and exception","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"* `to_string/3` will decide which formatter to call based upon\n the arguments provided to it.\n\n * A `Date.Range.t` will call `Cldr.Date.Interval.to_string/3`\n\n * A `CalendarInterval` will call `Cldr.Date.Interval.to_string/3`\n if its `:precision` is `:year`, `:month` or `:day`. Othersie\n it will call `Cldr.Time.Interval.to_string/3`\n\n * If `from` and `to` both conform to the `Calendar.datetime()`\n type then `Cldr.DateTime.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.date()`\n type then `Cldr.Date.Interval.to_string/3` is called\n\n * Otherwise if `from` and `to` conform to the `Calendar.time()`\n type then `Cldr.Time.Interval.to_string/3` is called\n\n* `CalendarInterval` support requires adding the\n dependency [calendar_interval](https://hex.pm/packages/calendar_interval)\n to the `deps` configuration in `mix.exs`.\n\n* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configuration locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n date, time or datetime is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-12-31])\n \"Jan 1 – Dec 31, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-01-12])\n \"Jan 1 – 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-01-12],\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~D[2020-01-01], ~D[2020-12-01],\n ...> format: :long, style: :year_and_month)\n \"January – December 2020\"\n\n iex> use CalendarInterval\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~I\"2020-01-01/12\",\n ...> format: :long)\n \"Wed, Jan 1 – Sun, Jan 12, 2020\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~U[2020-01-01 00:00:00.0Z], ~U[2020-12-01 10:05:00.0Z],\n ...> format: :long)\n \"January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC\"\n\n iex> Bonfire.Common.Localise.Cldr.Interval.to_string!(~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:05:00.0Z],\n ...> format: :long)\n \"January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC\"","ref":"Bonfire.Common.Localise.Cldr.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Language","doc":"","ref":"Bonfire.Common.Localise.Cldr.Language.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.available_languages/1","doc":"Return all the languages' iso-codes available for a given locale.\nDefaults to the current locale.","ref":"Bonfire.Common.Localise.Cldr.Language.html#available_languages/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.available_languages/1","doc":"> Bonfire.Common.Localise.Cldr.Language.Language.available_languages(:en)\n [\"aa\", \"ab\", \"ace\", \"ach\", \"ada\", \"ady\", \"ae\", \"aeb\", \"af\", \"afh\", \"agq\", \"ain\",\n \"ak\", \"akk\", \"akz\", \"ale\", \"aln\", \"alt\", \"am\", \"an\", \"ang\", \"anp\", \"ar\",\n \"ar-001\", \"arc\", \"arn\", \"aro\", \"arp\", \"arq\", \"ars\", \"arw\", \"ary\", \"arz\", \"as\",\n \"asa\", \"ase\", \"ast\", \"av\", \"avk\", \"awa\", \"ay\", \"az\", \"ba\", \"bal\", \"ban\", \"bar\",\n \"bas\", \"bax\", \"bbc\", \"bbj\", ...]","ref":"Bonfire.Common.Localise.Cldr.Language.html#available_languages/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.known_languages/1","doc":"Return a map of iso-code keyed maps of language names in any available\nformats for the given locale.\nDefaults to the current locale.","ref":"Bonfire.Common.Localise.Cldr.Language.html#known_languages/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.known_languages/1","doc":"> Bonfire.Common.Localise.Cldr.Language.Language.known_languages(:en)\n %{\"bez\" => %{standard: \"Bena\"}, \"lo\" => %{standard: \"Lao\"},\n \"kha\" => %{standard: \"Khasi\"}, \"eo\" => %{standard: \"Esperanto\"},\n \"rm\" => %{standard: \"Romansh\"}, \"ja\" => %{standard: \"Japanese\"},\n \"sw-CD\" => %{standard: \"Congo Swahili\"},\n \"pdc\" => %{standard: \"Pennsylvania German\"}, \"om\" => %{standard: \"Oromo\"},\n \"jut\" => %{standard: \"Jutish\"}, \"lij\" => %{standard: \"Ligurian\"},\n \"kut\" => %{standard: \"Kutenai\"}, \"vep\" => %{standard: \"Veps\"},\n \"yao\" => %{standard: \"Yao\"}, \"gez\" => %{standard: \"Geez\"},\n \"cr\" => %{standard: \"Cree\"}, \"ne\" => %{standard: \"Nepali\"},\n \"zbl\" => %{standard: \"Blissymbols\"}, \"ae\" => %{standard: \"Avestan\"},\n \"rof\" => %{standard: \"Rombo\"}, \"tkl\" => %{standard: \"Tokelau\"},\n \"rgn\" => %{standard: \"Romagnol\"}, \"el\" => %{standard: \"Greek\"},\n \"myv\" => %{standard: \"Erzya\"}, \"smj\" => %{standard: \"Lule Sami\"},\n \"fo\" => %{standard: \"Faroese\"}, \"ii\" => %{standard: \"Sichuan Yi\"},\n \"bum\" => %{standard: \"Bulu\"}, \"za\" => %{standard: \"Zhuang\"},\n \"raj\" => %{standard: \"Rajasthani\"}, \"mrj\" => %{standard: \"Western Mari\"},\n \"stq\" => %{standard: \"Saterland Frisian\"}, \"hu\" => %{standard: \"Hungarian\"},\n \"mga\" => %{standard: \"Middle Irish\"}, \"bej\" => %{standard: \"Beja\"},\n \"yue\" => %{standard: \"Cantonese\"}, \"xog\" => %{standard: \"Soga\"},\n \"ttt\" => %{standard: \"Muslim Tat\"}, \"uga\" => %{standard: \"Ugaritic\"},\n \"rup\" => %{standard: \"Aromanian\"},\n \"crs\" => %{standard: \"Seselwa Creole French\"}, \"oc\" => %{standard: \"Occitan\"},\n \"chp\" => %{standard: \"Chipewyan\"}, \"zen\" => %{standard: \"Zenaga\"},\n \"kmb\" => %{standard: \"Kimbundu\"}, \"nr\" => %{standard: \"South Ndebele\"},\n \"tiv\" => %{standard: \"Tiv\"}, \"aln\" => %{standard: \"Gheg Albanian\"},\n \"sh\" => %{standard: \"Serbo-Croatian\"}, \"fil\" => %{...}, ...}","ref":"Bonfire.Common.Localise.Cldr.Language.html#known_languages/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Language.to_string/2","doc":"Try to translate the given language iso code or language tag.","ref":"Bonfire.Common.Localise.Cldr.Language.html#to_string/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Language.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Language.Language.to_string(\"eo\")\n {:ok, \"Esperanto\"}","ref":"Bonfire.Common.Localise.Cldr.Language.html#to_string/2-example"},{"type":"type","title":"Bonfire.Common.Localise.Cldr.Language.styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Language.html#t:styles/0"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.List","doc":"Cldr backend module that formats lists.\n\nIf we have a list of days like `[\"Monday\", \"Tuesday\", \"Wednesday\"]`\nthen we can format that list for a given locale by:\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"Monday\", \"Tuesday\", \"Wednesday\"], locale: \"en\")\n {:ok, \"Monday, Tuesday, and Wednesday\"}","ref":"Bonfire.Common.Localise.Cldr.List.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"Intersperces a list elements into a list format according to the list\npattern rules for a locale.\n\nThis function can be helpful when creating a list from `Phoenix`\nsafe strings which are of the format `{:safe, \"some string\"}`","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"* `list` is any list of of terms that can be passed through `Kernel.to_string/1`\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"* `:locale` is any configured locale. See . The default\n is `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n\n* `:format` is any of those returned by\n `Cldr.List.known_list_formats/0` or by `Cldr.List.Pattern.new/1`.\n The default is `format: :standard`.","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.intersperse/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"en\")\n {:ok, [\"a\", \", \", \"b\", \", and \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n {:ok, [\"a\", \" \", \"b\", \" \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\", \"b\", \"c\"], locale: \"fr\")\n {:ok, [\"a\", \", \", \"b\", \" et \", \"c\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2,3,4,5,6])\n {:ok, [1, \", \", 2, \", \", 3, \", \", 4, \", \", 5, \", and \", 6]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([\"a\"])\n {:ok, [\"a\"]}\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2])\n {:ok, [1, \" and \", 2]}","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.intersperse!/2","doc":"Formats a list using `intersperse/2` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.intersperse!/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.intersperse!([\"a\", \"b\", \"c\"], locale: \"en\")\n [\"a\", \", \", \"b\", \", and \", \"c\"]\n\n iex> Bonfire.Common.Localise.Cldr.List.intersperse!([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n [\"a\", \" \", \"b\", \" \", \"c\"]","ref":"Bonfire.Common.Localise.Cldr.List.html#intersperse!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.list_formats_for/1","doc":"Returns the styles of list patterns available for a locale.\n\nReturns a list of `atom`s of of the list formats that are\navailable in CLDR for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#list_formats_for/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.List.list_formats_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.List.list_formats_for(:en)\n [:or, :or_narrow, :or_short, :standard, :standard_narrow, :standard_short,\n :unit, :unit_narrow, :unit_short]","ref":"Bonfire.Common.Localise.Cldr.List.html#list_formats_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.list_patterns_for/1","doc":"Returns the list patterns for a locale.\n\nList patterns provide rules for combining multiple\nitems into a language format appropriate for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#list_patterns_for/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.List.list_patterns_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.List.list_patterns_for(:en)\n %{\n or: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n or_narrow: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n or_short: %Cldr.List.Pattern{\n two: [0, \" or \", 1],\n end: [0, \", or \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard: %Cldr.List.Pattern{\n two: [0, \" and \", 1],\n end: [0, \", and \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard_narrow: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n standard_short: %Cldr.List.Pattern{\n two: [0, \" & \", 1],\n end: [0, \", & \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n unit: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n },\n unit_narrow: %Cldr.List.Pattern{\n two: [0, \" \", 1],\n end: [0, \" \", 1],\n middle: [0, \" \", 1],\n start: [0, \" \", 1]\n },\n unit_short: %Cldr.List.Pattern{\n two: [0, \", \", 1],\n end: [0, \", \", 1],\n middle: [0, \", \", 1],\n start: [0, \", \", 1]\n }\n }","ref":"Bonfire.Common.Localise.Cldr.List.html#list_patterns_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"Formats a list into a string according to the list pattern rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"* `list` is any list of of terms that can be passed through `Kernel.to_string/1`\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"* `:locale` is any configured locale. See . The default\n is `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n\n* `:format` is any of those returned by\n `Cldr.List.known_list_formats/0` or by `Cldr.List.Pattern.new/1`.\n The default is `format: :standard`.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"en\")\n {:ok, \"a, b, and c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n {:ok, \"a b c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\", \"b\", \"c\"], locale: \"fr\")\n {:ok, \"a, b et c\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2,3,4,5,6])\n {:ok, \"1, 2, 3, 4, 5, and 6\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([\"a\"])\n {:ok, \"a\"}\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2])\n {:ok, \"1 and 2\"}","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.List.to_string!/2","doc":"Formats a list using `to_string/2` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.List.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.List.to_string!([\"a\", \"b\", \"c\"], locale: \"en\")\n \"a, b, and c\"\n\n iex> Bonfire.Common.Localise.Cldr.List.to_string!([\"a\", \"b\", \"c\"], locale: \"en\", format: :unit_narrow)\n \"a b c\"","ref":"Bonfire.Common.Localise.Cldr.List.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Locale","doc":"Backend module that provides functions\nto define new locales and display human-readable\nlocale names for presentation purposes.","ref":"Bonfire.Common.Localise.Cldr.Locale.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"* `locale_name` is any locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"* `{:ok, list_of_locale_names}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names/1","doc":"iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names(:nb)\n {:ok, [:nb, :no, :und]}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locale_names/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"* `locale_name` is any locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"* `{:ok, list_of_locales}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.fallback_locales/1","doc":"Bonfire.Common.Localise.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 Bonfire.Common.Localise.Cldr.Locale.fallback_locales(:nb))\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#fallback_locales/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.locale_for_territory/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.locale_for_territory/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:AU)\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-AU\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:US)\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-US\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_for_territory(:ZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZ is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_for_territory/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"Returns a \"best fit\" locale for a host name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"* `{:ok, langauge_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.locale_from_host/2","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host \"a.b.com.au\"\n Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:\"en-AU\")\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host(\"a.b.com.tv\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"tv\\\"\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Locale.html#locale_from_host/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.new/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#new/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.new!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#new!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale/1","doc":"Returns the script direction for a locale.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale \"en-US\"\n :ltr\n\n iex> Bonfire.Common.Localise.Cldr.Locale.script_direction_from_locale :ar\n :rtl","ref":"Bonfire.Common.Localise.Cldr.Locale.html#script_direction_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"Returns the last segment of a host that might\nbe a territory.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"* `host` is any valid host name","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.territory_from_host/1","doc":"* `{:ok, territory}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_host/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"Returns the territory from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"* A territory code as an atom","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.territory_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.territory_from_locale \"en-US\"\n :US\n\n iex> Bonfire.Common.Localise.Cldr.Locale.territory_from_locale \"en-US-u-rg-GBzzzz\"\n :GB","ref":"Bonfire.Common.Localise.Cldr.Locale.html#territory_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"Returns the time zone from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Locale.timezone_from_locale \"en-US-u-tz-ausyd\"\n \"Australia/Sydney\"","ref":"Bonfire.Common.Localise.Cldr.Locale.html#timezone_from_locale/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay","doc":"Manages the display name data for language tags\nand presents a public API for rendering\ndisplay names for locales.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"Returns a localised display name for a\nlocale.\n\nUI applications often have a requirement\nto present locale choices to an end user.\n\nThis function takes a `t.Cldr.LanguageTag`\nand using the [CLDR locale display name algorithm](https://unicode-org.github.io/cldr/ldml/tr35-general.html#locale_display_name_algorithm)\nproduces a string suitable for presentation.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `language_tag` is any `t:Cldr.LanguageTag` or\n a binary locale name.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `:compound_locale` is a boolean indicating\n if the combination of language, script and territory\n should be used to resolve a language name.\n The default is `true`.\n\n* `:prefer` signals the preferred name for\n a subtag when there are alternatives.\n The default is `:default`. Few subtags\n provide alternative renderings. Some of\n the alternative preferences are`:short`,\n `:long`, `:menu` and `:variant`.\n\n* `:locale` is a `t:Cldr.LanguageTag` or any valid\n locale name returned by `Cldr.known_locale_names/1`.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"* `{:ok, string}` representing a name\n suitable for presentation purposes or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en\"\n {:ok, \"English\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US\"\n {:ok, \"American English\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US\", compound_locale: false\n {:ok, \"English (United States)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US-u-ca-gregory-cu-aud\"\n {:ok, \"American English (Gregorian Calendar, Currency: A$)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"en-US-u-ca-gregory-cu-aud\", locale: \"fr\"\n {:ok, \"anglais américain (calendrier grégorien, devise : A$)\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"nl-BE\"\n {:ok, \"Flemish\"}\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name \"nl-BE\", compound_locale: false\n {:ok, \"Dutch (Belgium)\"}","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"Returns a localised display name for a\nlocale.\n\nUI applications often have a requirement\nto present locale choices to an end user.\n\nThis function takes a `t.Cldr.LanguageTag`\nand using the [CLDR locale display name algorithm](https://unicode-org.github.io/cldr/ldml/tr35-general.html#locale_display_name_algorithm)\nproduces a string suitable for presentation.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* `language_tag` is any `t:Cldr.LanguageTag` or\n a binary locale name.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* `:compound_locale` is a boolean indicating\n if the combination of language, script and territory\n should be used to resolve a language name.\n The default is `true`.\n\n* `:prefer` signals the preferred name for\n a subtag when there are alternatives.\n The default is `:default`. Few subtags\n provide alternative renderings. Some of\n the alternative preferences are`:short`,\n `:long`, `:menu` and `:variant`.\n\n* `:locale` is a `t:Cldr.LanguageTag` or any valid\n locale name returned by `Cldr.known_locale_names/1`.\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`.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"* a string representation of the language tag\n suitable for presentation purposes or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name!/2","doc":"iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en\"\n \"English\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US\"\n \"American English\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US\", compound_locale: false\n \"English (United States)\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US-u-ca-gregory-cu-aud\"\n \"American English (Gregorian Calendar, Currency: A$)\"\n\n iex> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_name! \"en-US-u-ca-gregory-cu-aud\", locale: \"fr\"\n \"anglais américain (calendrier grégorien, devise : A$)\"","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_name!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"Returns the localised display names data\nfor a locale name.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.LocaleDisplay.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"* A map of locale display names","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names/1","doc":"=> Bonfire.Common.Localise.Cldr.LocaleDisplay.display_names(\"en\")","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#display_names/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"Returns the localised time zone names data\nfor a locale name.","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"* `locale` is any language tag returned by\n `Bonfire.Common.Localise.Cldr.LocaleDisplay.new/1`\n or a locale name in the list returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"* A map of locale time zone names","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names/1","doc":"=> Bonfire.Common.Localise.Cldr.LocaleDisplay.time_zone_names(\"en\")","ref":"Bonfire.Common.Localise.Cldr.LocaleDisplay.html#time_zone_names/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html"},{"type":"module","title":"Non-Scientific Notation Formatting - Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html#module-non-scientific-notation-formatting"},{"type":"module","title":"Scientific Notation Formatting - Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.html#module-scientific-notation-formatting"},{"type":"module","title":"Significant Digits - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#module-significant-digits"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"Parse a string locale-aware manner and return\na number.","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag.t`. The default is\n `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.parse/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.parse(\"+1.000,34\", locale: \"de\")\n {:ok, 1000.34}\n\n iex> Bonfire.Common.Localise.Cldr.Number.parse(\"-1_000_000.34\")\n {:ok, -1000000.34}\n\n iex> Bonfire.Common.Localise.Cldr.Number.parse(\"1.000\", locale: \"de\", number: :integer)\n {:ok, 1000}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#parse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_currencies/2","doc":"Resolve curencies from strings within\na list.","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-options"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_currencies/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 US dollars\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies\n [100, :USD]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 eurosports\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(fuzzy: 0.75)\n [100, :EUR]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100 dollars des États-Unis\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(locale: \"fr\")\n [100, :USD]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currencies/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"Resolve a currency from a string","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"* An ISO4217 currency code as an atom or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_currency/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"US dollars\")\n [:USD]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"100 eurosports\", fuzzy: 0.75)\n [:EUR]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency(\"dollars des États-Unis\", locale: \"fr\")\n [:USD]\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_currency/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"Resolve and tokenize percent or permille\nfrom the beginning and/or the end of a string","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"* An `:percent` or `permille` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_per/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"11%\"\n [\"11\", :percent]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"% of linguists\"\n [:percent, \" of linguists\"]\n\n iex> Bonfire.Common.Localise.Cldr.Number.resolve_per \"% of linguists %\"\n [:percent, \" of linguists \", :percent]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_per/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.resolve_pers/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"100%\")\n ...> |> Bonfire.Common.Localise.Cldr.Number.resolve_pers()\n [100, :percent]","ref":"Bonfire.Common.Localise.Cldr.Number.html#resolve_pers/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"Scans a string locale-aware manner and returns\na list of strings and numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"* A list of strings and numbers","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.scan/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.scan(\"£1_000_000.34\")\n [\"£\", 1000000.34]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"I want £1_000_000 dollars\")\n [\"I want £\", 1000000, \" dollars\"]\n\n iex> Bonfire.Common.Localise.Cldr.Number.scan(\"The prize is 23\")\n [\"The prize is \", 23]\n\n iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.scan(\"The loss is -1.000 euros\", locale: \"de\", number: :integer)\n [\"The loss is \", -1000, \" euros\"]","ref":"Bonfire.Common.Localise.Cldr.Number.html#scan/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_approx_string/2","doc":"Formats a number and applies the `:approximately` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_approx_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_approx_string 1234\n {:ok, \"~1,234\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_approx_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_at_least_string/2","doc":"Formats a number and applies the `:at_least` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.to_string/2` for a description of the available\n options.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_at_least_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_at_least_string 1234\n {:ok, \"1,234+\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_least_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_at_most_string/2","doc":"Formats a number and applies the `:at_most` format for\na locale and number system.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_at_most_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_at_most_string 1234\n {:ok, \"≤1,234\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_at_most_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.to_range_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_range_string 1234..5678\n {:ok, \"1,234–5,678\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_range_string/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"Returns a number formatted into a string according to a format pattern and options.","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-options"},{"type":"function","title":"Locale extensions affecting formatting - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-locale-extensions-affecting-formatting"},{"type":"function","title":"Wrapping format elements - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-wrapping-format-elements"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345\n {:ok, \"12,345\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: \"fr\"\n {:ok, \"12 345\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\", minimum_grouping_digits: 1\n {:ok, \"1.345,32 €\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\"\n {:ok, \"1345,32 €\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: \"fr\", currency: \"USD\"\n {:ok, \"12 345,00 $US\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: \"#E0\"\n {:ok, \"1.2345E4\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\"\n {:ok, \"THB 12,345.00\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string -12345, format: :accounting, currency: \"THB\"\n {:ok, \"(THB 12,345.00)\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\"\n {:ok, \"฿12,345.00\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\", number_system: :native\n {:ok, \"฿๑๒,๓๔๕.๐๐\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long\n {:ok, \"1 thousand\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long, currency: \"USD\"\n {:ok, \"1,244 US dollars\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short\n {:ok, \"1K\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short, currency: \"EUR\"\n {:ok, \"€1K\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1234, format: :spellout\n {:ok, \"one thousand two hundred thirty-four\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1234, format: :spellout_verbose\n {:ok, \"one thousand two hundred and thirty-four\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 1989, format: :spellout_year\n {:ok, \"nineteen eighty-nine\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :ordinal\n {:ok, \"123rd\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :roman\n {:ok, \"CXXIII\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, locale: \"th-u-nu-thai\"\n {:ok, \"๑๒๓\"}","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-examples"},{"type":"function","title":"Errors - Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string/2-errors"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.to_string/2`","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.to_string!/2","doc":"* a formatted number as a string or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.to_string! 12345\n \"12,345\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.to_string! 12345, locale: \"fr\"\n \"12 345\"","ref":"Bonfire.Common.Localise.Cldr.Number.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.validate_number_system/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :latn\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :default\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"en\", :unknown\n {:error,\n {Cldr.UnknownNumberSystemError, \"The number system :unknown is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system \"zz\", :default\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.html#validate_number_system/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal","doc":"Implements cardinal plural rules for numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#available_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule 0, \"fr\"\n :one\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rule 0, \"en\"\n :other","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rule/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Cardinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"Pluralize a number using cardinal plural rules\nand a substitution map.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"* `number` is an integer, float or Decimal\n\n* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Cardinal.Cardinal.plural_rule/3`.","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1, \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 22, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(1), \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\", two: \"two\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"few\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Bonfire.Common.Localise.Cldr.Number.Cardinal.html#pluralize/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html"},{"type":"module","title":"Number Pattern Examples - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#module-number-pattern-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for/1-returns"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for!/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.all_formats_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Format.Number.Format.all_formats_for/1` for further information.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#all_formats_for!/1-returns"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.currency_spacing/2","doc":"Returns the currency space for a given locale and\nnumber system.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#currency_spacing/2"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list/0","doc":"#=> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"Returns the list of decimal formats for a configured locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for/1","doc":"iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#decimal_format_list_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"Returns the default grouping for a locale as a map.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"* `{:ok, grouping}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for(:en)\n {:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"Returns the default grouping for a locale\nor raises on error.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"* `grouping` as a map or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!(:en)\n %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#default_grouping_for!/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"Return the predfined formats for a given `locale` and `number_system`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system` is any valid number system or number system type returned\n by `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Format.formats_for/2","doc":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.formats_for!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#formats_for!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"Returns the minimum grouping digits for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `{:ok, minumum_digits}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for(\"en\")\n {:ok, 1}","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"Returns the minimum grouping digits for a locale\nor raises on error.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `minumum_digits` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!(\"en\")\n 1","ref":"Bonfire.Common.Localise.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.metadata!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#metadata!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.to_string/3","doc":"Formats a number according to a decimal format string.","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.to_string/3","doc":"* `number` is an integer, float or Decimal\n\n* `format` is a format string. See `Bonfire.Common.Localise.Cldr.Number` for further information.\n\n* `options` is a map of options. See `Bonfire.Common.Localise.Cldr.Number.to_string/2`\n for further information.","ref":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal.html#to_string/3-arguments"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal","doc":"Implements ordinal plural rules for numbers.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#available_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#known_locale_names/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule 0, \"fr\"\n :other\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rule 1, \"en\"\n :one","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rule/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Ordinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize/3","doc":"Pluralize a number using ordinal plural rules\nand a substitution map.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.Ordinal.Ordinal.plural_rule/3`.","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1, :en, %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 22, :en, %{one: \"one\", two: \"two\", other: \"other\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: \"one\"}\n \"one\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\"}\n nil\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Bonfire.Common.Localise.Cldr.Number.Ordinal.html#pluralize/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","doc":"Implements plural rules for ranges","ref":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3-arguments"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.plural_rule :other, :few, \"ar\"\n :few","ref":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range.html#plural_rule/3-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.Symbol","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_decimal_symbols/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_decimal_symbols_class/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_grouping_symbols/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#all_grouping_symbols_class/0"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1","doc":"* `locale` is any valid locale name returned by\n `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Bonfire.Common.Localise.Cldr.Locale.new!/1`. The default\n is `Bonfire.Common.Localise.Cldr.get_locale/0`.","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1-options"},{"type":"function","title":"Example: - Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1","doc":"iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Symbol.html#number_symbols_for/2"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Number.System","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_for/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_for/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"th\", :latn\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"en\", :default\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"he\", :traditional\n {:ok, %{rules: \"hebrew\", type: :algorithmic}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for \"en\", :native\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_for/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"Returns the number system from a language tag or\nlocale name.","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-arguments"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"* A number system name as an atom","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale \"en-US-u-nu-thai\"\n :thai\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_from_locale \"en-US\"\n :latn","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_from_locale/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for \"en\"\n {:ok, [:latn]}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_names_for!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_system_types_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_system_types_for/1"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.Cldr.Locale.new!/1`","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"en\"\n {:ok, %{default: :latn, native: :latn}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"th\"\n {:ok, %{default: :latn, native: :thai}}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_systems_for!/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_for!/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.System.number_systems_like/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#number_systems_like/2"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_number_systems/0` or a number system type\n returned by `Bonfire.Common.Localise.Cldr.known_number_system_types/0`\n\n* `locale` is any valid locale name returned by `Bonfire.Common.Localise.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#system_name_from/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.system_name_from/2","doc":"ex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:default, \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(\"latn\", \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:native, \"en\")\n {:ok, :latn}\n\n iex> Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#system_name_from/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.to_system/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123456, :hebr\n {:ok, \"קכ״ג׳תנ״ו\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hans\n {:ok, \"一百二十三\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hant\n {:ok, \"一百二十三\"}\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hansfin\n {:ok, \"壹佰贰拾叁\"}","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.known_number_systems/0` or a number system type\n returned by `Bonfire.Common.Localise.Cldr.known_number_system_types/0`\n\nSee `Bonfire.Common.Localise.Cldr.Number.System.to_system/2` for further\ninformation.","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system!/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.System.to_system!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hans\n \"一百二十三\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hant\n \"一百二十三\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.System.to_system! 123, :hansfin\n \"壹佰贰拾叁\"","ref":"Bonfire.Common.Localise.Cldr.Number.System.html#to_system!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.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.","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html"},{"type":"module","title":"Configuring precompilation of digit transliterations - Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#module-configuring-precompilation-of-digit-transliterations"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate/3","doc":"* `sequence` is the string to be transliterated.\n\n* `locale` is any known locale, defaulting to `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.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 `Bonfire.Common.Localise.Cldr.Number.System.number_systems_for/1`. Also see\n`Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for/1`.","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3-arguments"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\")\n \"123556\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123,556.000\", \"fr\", :default)\n \"123 556,000\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :default)\n \"123556\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", \"thai\")\n \"๑๒๓๕๕๖\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :native)\n \"๑๒๓๕๕๖\"\n\n iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate(\"Some number is: 123556\", \"th\", \"thai\")\n \"Some number is: ๑๒๓๕๕๖\"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate!/3"},{"type":"function","title":"Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate_digits/3"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate_digits/3","doc":"iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate_digits \"٠١٢٣٤٥٦٧٨٩\", :arab, :latn\n \"0123456789\"","ref":"Bonfire.Common.Localise.Cldr.Number.Transliterate.html#transliterate_digits/3-example"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :roman)\n {:ok, \"CXXIII\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.armenian_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#armenian_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.ethiopic_p/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.georgian/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#georgian/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.georgian/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#georgian/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.greek_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#greek_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_lower/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_lower/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_lower/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_lower/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_upper/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#roman_upper/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#rule_sets/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.tamil_thousands/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.zz_default/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#zz_default/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.zz_default/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.html#zz_default/2"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets(:en)\n [:digits_ordinal]\n\n iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :ordinal)\n {:ok, \"123rd\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_feminine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_feminine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_indicator_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_indicator_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine_adjective/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine_adjective/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal_masculine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#digits_ordinal_masculine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.dord_femabbrev/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#dord_femabbrev/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.dord_mascabbrev/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#dord_mascabbrev/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.html#rule_sets/1"},{"type":"module","title":"Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :spellout)\n {:ok, \"one hundred twenty-three\"}","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.after_hundred/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#after_hundred/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.after_thousand_or_more/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#after_thousand_or_more/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.all_rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#all_rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.and/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#and/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.and_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#and_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_f/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_f/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.cents_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#cents_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.commas/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#commas/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.commas_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#commas_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_un/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_un/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_une/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_une/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.et_unieme/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#et_unieme/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.fem_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#fem_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.lenient_parse/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#lenient_parse/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.mille_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#mille_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_no_final/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_no_final/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_a_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_a_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_i_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_i_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msc_with_o_nofinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msc_with_o_nofinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.msco_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#msco_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esima_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esima_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esime_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esime_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimi_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimi_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_a/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_a/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_i/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_i/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.ordinal_esimo_with_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#ordinal_esimo_with_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.r2d_year/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#r2d_year/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#rule_sets/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#rule_sets/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_feminine_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_feminine_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_masculine_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_masculine_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_leading/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_leading/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_cents/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_cents/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_numbering_year/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_cont/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_cont/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_conts/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_conts/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_feminine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_feminine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_adjective/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_adjective/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_cont/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_cont/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_conts/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_conts/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_masculine_plural/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_masculine_plural/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_f/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_f/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_m/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_m/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.subcents_o/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#subcents_o/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.teen/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#teen/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.th/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#th/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.tieth/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#tieth/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.x_ty/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout.html#x_ty/2"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Territory","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_styles/0","doc":"Returns a list of available styles.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_styles/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_styles/0","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.available_styles()\n [:short, :standard, :variant]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_styles/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_subdivisions/1","doc":"Returns the available territory subdivisions for a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions(\"en\")\n [:ad02, :ad03, :ad04, :ad05, :ad06, :ad07, :ad08, ...]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions()\n []\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_subdivisions(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.available_territories/1","doc":"Returns the available territories for a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_territories/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.available_territories/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.available_territories()\n [:\"001\", :\"002\", :\"003\", :\"005\", :\"009\", :\"011\", :\"013\", :\"014\", :\"015\", :\"017\",\n :\"018\", :\"019\", :\"021\", :\"029\", :\"030\", :\"034\", :\"035\", :\"039\", :\"053\", :\"054\",\n :\"057\", :\"061\", :\"142\", :\"143\", :\"145\", :\"150\", :\"151\", :\"154\", :\"155\", :\"202\",\n :\"419\", :AC, :AD, :AE, :AF, :AG, :AI, :AL, :AM, :AO, :AQ, :AR, :AS, :AT, :AU,\n :AW, :AX, :AZ, :BA, :BB, ...]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.available_territories(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#available_territories/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.children/2","doc":"Lists children(s) for the given territory code.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.children/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.children(:EU)\n {:ok,\n [:AT, :BE, :CY, :CZ, :DE, :DK, :EE, :ES, :FI, :FR, :GR, :HR, :HU, :IE,\n :IT, :LT, :LU, :LV, :MT, :NL, :PL, :PT, :SE, :SI, :SK, :BG, :RO]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.children(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.children(:GB)\n {:error, {Cldr.UnknownParentError, \"The territory :GB has no children\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.children!/2","doc":"The same as `children/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.children!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.children!(:EU)\n [:AT, :BE, :CY, :CZ, :DE, :DK, :EE, :ES, :FI, :FR, :GR, :HR, :HU, :IE, :IT,\n :LT, :LU, :LV, :MT, :NL, :PL, :PT, :SE, :SI, :SK, :BG, :RO]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#children!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.contains?/2","doc":"Checks relationship between two territories, where the first argument is the `parent` and second the `child`.\nReturns `true` if successful, otherwise `false`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#contains?/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.contains?/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.contains?(:EU, :DK)\n true\n\n iex> Bonfire.Common.Localise.Cldr.Territory.contains?(:DK, :EU)\n false","ref":"Bonfire.Common.Localise.Cldr.Territory.html#contains?/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.country_codes/1","doc":"Returns a list of country codes.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#country_codes/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.country_codes/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.country_codes()\n [:AD, :AE, :AF, :AG, :AI, :AL, :AM, :AO, :AR, :AS, :AT, :AU, :AW,\n :AX, :AZ, :BA, :BB, :BD, :BE, :BF, :BG, :BH, :BI, :BJ, :BL, :BM,\n :BN, :BO, :BQ, :BR, :BS, :BT, :BV, :BW, :BY, :BZ, :CA, :CC, :CD,\n :CF, :CG, :CH, :CI, :CK, :CL, :CM, :CN, :CO, :CR, :CU, ...]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#country_codes/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_language_tag/2","doc":"Localized string for the given `LanguageTag.t`.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_language_tag/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale())\n {:ok, \"world\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: :short])\n {:error, {Cldr.UnknownStyleError, \"The style :short is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: :ZZZ])\n {:error, {Cldr.UnknownStyleError, \"The style :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag(Cldr.get_locale(), [style: \"ZZZ\"])\n {:error, {Cldr.UnknownStyleError, \"The style \\\"ZZZ\\\" is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_language_tag!/2","doc":"The same as `from_language_tag/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_language_tag!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_language_tag!(Cldr.get_locale())\n \"world\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_language_tag!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code/2","doc":"Localized string for the given subdivision code.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"en\")\n {:ok, \"Cumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"pl\")\n {:ok, \"Kumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", locale: \"bs\")\n {:error, {Cldr.UnknownSubdivisionError, \"No subdivision translation for :gbcma could be found in locale :bs\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"invalid\", locale: \"en\")\n {:error, {Cldr.UnknownTerritoryError, \"The territory \\\"invalid\\\" is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", [locale: :zzz])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code(\"gbcma\", [locale: \"zzz\"])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!/2","doc":"The same as `from_subdivision_code/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!(\"gbcma\", locale: \"en\")\n \"Cumbria\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_subdivision_code!(\"gbcma\", locale: \"pl\")\n \"Kumbria\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_subdivision_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_territory_code/2","doc":"Localized string for the given territory code.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_territory_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB)\n {:ok, \"United Kingdom\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: :short])\n {:ok, \"UK\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: :ZZZ])\n {:error, {Cldr.UnknownStyleError, \"The style :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [style: \"ZZZ\"])\n {:error, {Cldr.UnknownStyleError, \"The style \\\"ZZZ\\\" is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: \"pt\"])\n {:ok, \"Reino Unido\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: :zzz])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code(:GB, [locale: \"zzz\"])\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.from_territory_code!/2","doc":"The same as `from_territory_code/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.from_territory_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB)\n \"United Kingdom\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB, [style: :short])\n \"UK\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.from_territory_code!(:GB, [locale: \"pt\"])\n \"Reino Unido\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#from_territory_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.info/1","doc":"Maps territory info for the given territory code.\nReturns `{:ok, map}` if successful, otherwise `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.info/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.info(:GB)\n {:ok,\n %{\n currency: [GBP: %{from: ~D[1694-07-27]}],\n gdp: 2925000000000,\n language_population: %{\n \"ar\" => %{population_percent: 0.3},\n \"bn\" => %{population_percent: 0.4},\n \"cy\" => %{official_status: \"official_regional\", population_percent: 1.3},\n \"de\" => %{population_percent: 9},\n \"en\" => %{official_status: \"official\", population_percent: 98},\n \"es\" => %{population_percent: 8},\n \"fr\" => %{population_percent: 23},\n \"ga\" => %{official_status: \"official_regional\", population_percent: 0.15},\n \"gd\" => %{\n official_status: \"official_regional\",\n population_percent: 0.11,\n writing_percent: 5\n },\n \"gu\" => %{population_percent: 2.9},\n \"it\" => %{population_percent: 0.2},\n \"kw\" => %{population_percent: 0.003},\n \"lt\" => %{population_percent: 0.2},\n \"pa\" => %{population_percent: 3.6},\n \"pl\" => %{population_percent: 4},\n \"pt\" => %{population_percent: 0.2},\n \"sco\" => %{population_percent: 2.5, writing_percent: 5},\n \"so\" => %{population_percent: 0.2},\n \"ta\" => %{population_percent: 3.2},\n \"tr\" => %{population_percent: 0.2},\n \"ur\" => %{population_percent: 3.5},\n \"zh-Hant\" => %{population_percent: 0.3},\n \"en-Shaw\" => %{population_percent: 0}\n },\n literacy_percent: 99,\n measurement_system: %{\n default: :uksystem,\n paper_size: :a4,\n temperature: :uksystem\n },\n population: 65761100\n }}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.info!/1","doc":"The same as `info/1`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info!/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.info!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.info!(:GB)\n %{\n currency: [GBP: %{from: ~D[1694-07-27]}],\n gdp: 2925000000000,\n language_population: %{\n \"ar\" => %{population_percent: 0.3},\n \"bn\" => %{population_percent: 0.4},\n \"cy\" => %{official_status: \"official_regional\", population_percent: 1.3},\n \"de\" => %{population_percent: 9},\n \"en\" => %{official_status: \"official\", population_percent: 98},\n \"es\" => %{population_percent: 8},\n \"fr\" => %{population_percent: 23},\n \"ga\" => %{official_status: \"official_regional\", population_percent: 0.15},\n \"gd\" => %{\n official_status: \"official_regional\",\n population_percent: 0.11,\n writing_percent: 5\n },\n \"gu\" => %{population_percent: 2.9},\n \"it\" => %{population_percent: 0.2},\n \"kw\" => %{population_percent: 0.003},\n \"lt\" => %{population_percent: 0.2},\n \"pa\" => %{population_percent: 3.6},\n \"pl\" => %{population_percent: 4},\n \"pt\" => %{population_percent: 0.2},\n \"sco\" => %{population_percent: 2.5, writing_percent: 5},\n \"so\" => %{population_percent: 0.2},\n \"ta\" => %{population_percent: 3.2},\n \"tr\" => %{population_percent: 0.2},\n \"ur\" => %{population_percent: 3.5},\n \"zh-Hant\" => %{population_percent: 0.3},\n \"en-Shaw\" => %{population_percent: 0}\n },\n literacy_percent: 99,\n measurement_system: %{\n default: :uksystem,\n paper_size: :a4,\n temperature: :uksystem\n },\n population: 65761100\n }","ref":"Bonfire.Common.Localise.Cldr.Territory.html#info!/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.inverted_subdivisions/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#inverted_subdivisions/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.inverted_territories/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#inverted_territories/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_subdivisions/1","doc":"Returns a map of all known territory subdivisions in a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions(\"en\")\n %{\n \"ad02\" => \"Canillo\",\n \"ad03\" => \"Encamp\",\n \"ad04\" => \"La Massana\",\n \"ad05\" => \"Ordino\",\n \"ad06\" => \"Sant Julià de Lòria\",\n \"ad07\" => \"Andorra la Vella\",\n ...\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions()\n %{}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_subdivisions(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_territories/1","doc":"Returns a map of all known territories in a given locale.\n\n* `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territories/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_territories/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_territories()\n %{SN: %{standard: \"Senegal\"}, \"061\": %{standard: \"Polynesia\"},\n BH: %{standard: \"Bahrain\"}, TM: %{standard: \"Turkmenistan\"},\n \"009\": %{standard: \"Oceania\"}, CW: %{standard: \"Curaçao\"},\n FR: %{standard: \"France\"}, TN: %{standard: \"Tunisia\"},\n FI: %{standard: \"Finland\"}, BF: %{standard: \"Burkina Faso\"},\n \"155\": %{standard: \"Western Europe\"}, GL: %{standard: \"Greenland\"},\n VI: %{standard: \"U.S. Virgin Islands\"}, ZW: %{standard: \"Zimbabwe\"},\n AR: %{standard: \"Argentina\"}, SG: %{standard: \"Singapore\"},\n SZ: %{standard: \"Swaziland\"}, ID: %{standard: \"Indonesia\"},\n NR: %{standard: \"Nauru\"}, RW: %{standard: \"Rwanda\"},\n TR: %{standard: \"Turkey\"}, IS: %{standard: \"Iceland\"},\n ME: %{standard: \"Montenegro\"}, AW: %{standard: \"Aruba\"},\n PY: %{standard: \"Paraguay\"}, \"145\": %{standard: \"Western Asia\"},\n CG: %{standard: \"Congo - Brazzaville\", variant: \"Congo (Republic)\"},\n LT: %{standard: \"Lithuania\"}, SA: %{standard: \"Saudi Arabia\"},\n MZ: %{standard: \"Mozambique\"}, NU: %{standard: \"Niue\"},\n NG: %{standard: \"Nigeria\"}, CK: %{standard: \"Cook Islands\"},\n ZM: %{standard: \"Zambia\"}, LK: %{standard: \"Sri Lanka\"},\n UY: %{standard: \"Uruguay\"}, YE: %{standard: \"Yemen\"},\n \"011\": %{standard: \"Western Africa\"},\n CC: %{standard: \"Cocos (Keeling) Islands\"}, BY: %{standard: \"Belarus\"},\n IL: %{standard: \"Israel\"}, KY: %{standard: \"Cayman Islands\"},\n GN: %{standard: \"Guinea\"}, VN: %{standard: \"Vietnam\"},\n PE: %{standard: \"Peru\"}, HU: %{standard: \"Hungary\"},\n HN: %{standard: \"Honduras\"}, GI: %{standard: \"Gibraltar\"},\n \"142\": %{standard: \"Asia\"}, \"029\": %{...}, ...}\n\n => Bonfire.Common.Localise.Cldr.Territory.known_territories(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \"zzz\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territories/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions/1","doc":"Returns a list of subdivisions of a given territory.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territory_subdivisions/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions/1","doc":"=> Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:GB)\n {:ok, [\"gbabc\", \"gbabd\", \"gbabe\", \"gbagb\", \"gbagy\", \"gband\", \"gbann\",\n \"gbans\", \"gbbas\", \"gbbbd\", \"gbbdf\", \"gbbdg\", \"gbben\", \"gbbex\", \"gbbfs\",\n \"gbbge\", \"gbbgw\", \"gbbir\", \"gbbkm\", \"gbbmh\", \"gbbne\", \"gbbnh\", \"gbbns\",\n \"gbbol\", \"gbbpl\", \"gbbrc\", \"gbbrd\", \"gbbry\", \"gbbst\", \"gbbur\", \"gbcam\",\n \"gbcay\", \"gbcbf\", \"gbccg\", \"gbcgn\", \"gbche\", \"gbchw\", \"gbcld\", \"gbclk\",\n \"gbcma\", \"gbcmd\", \"gbcmn\", \"gbcon\", \"gbcov\", \"gbcrf\", \"gbcry\", \"gbcwy\",\n \"gbdal\", \"gbdby\", \"gbden\", ...]}\n\n => Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:AI)\n {:ok, nil}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.known_territory_subdivisions(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#known_territory_subdivisions/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.parent/2","doc":"Lists parent(s) for the given territory code.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.parent/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.parent(:GB)\n {:ok, [:\"154\", :UN]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.parent(:ZZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZZ is unknown\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.parent(Cldr.get_locale())\n {:error, {Cldr.UnknownChildrenError, \"The territory :\\\"001\\\" has no parent(s)\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.parent!/2","doc":"The same as `parent/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.parent!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.parent!(:GB)\n [:\"154\", :UN]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#parent!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases/0","doc":"Returns a map of available subdivision aliases.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#subdivision_aliases/0"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases/0","doc":"iex#> Bonfire.Common.Localise.Cldr.Territory.subdivision_aliases()\n %{:uspr => :PR}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#subdivision_aliases/0-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_code/2","doc":"A helper method to get a territory's currency code\nif a territory has multiply currencies then the oldest active currency is returned.\nReturns `{:ok, code}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_code/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code(:US)\n {:ok, :USD}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code(\"cu\")\n {:ok, :CUP}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_code!/2","doc":"The same as `to_currency_code/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_code!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(:US)\n :USD\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(:US, as: :charlist)\n ~c\"USD\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(\"PS\")\n :ILS\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_code!(\"PS\", as: :binary)\n \"ILS\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_code!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_codes/2","doc":"A helper method to get a territory's currency codes.\nReturns `{:ok, list}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_codes/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes(:US)\n {:ok, [:USD]}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes(\"ht\")\n {:ok, [:USD, :HTG]}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!/2","doc":"The same as `to_currency_codes/2`, but raises an exception if it fails.\n\n* `options` are:\n * `as: :atom`\n * `as: :binary`\n * `as: :charlist`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(:US)\n [:USD]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(:US, as: :charlist)\n [~c\"USD\"]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(\"PS\")\n [:ILS, :JOD]\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_currency_codes!(\"PS\", as: :binary)\n [\"ILS\", \"JOD\"]","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_currency_codes!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag/1","doc":"Unicode flag for the given territory code.\nReturns `{:ok, flag}` if successful, otherwise `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag(:US)\n {:ok, \"🇺🇸\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag(:EZ)\n {:error, {Cldr.UnknownFlagError, \"The territory :EZ has no flag\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!/1","doc":"The same as `to_unicode_flag/1`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag!/1"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!/1","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.to_unicode_flag!(:US)\n \"🇺🇸\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#to_unicode_flag!/1-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_language_tag/2","doc":"Translate a LanguageTag.t into a localized string from one locale to another.\nReturns `{:ok, result}` if successful, otherwise `{:error, reason}`.\n\n* `options` are:\n * `locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`\n\n * `style` is one of those returned by `Bonfire.Common.Localise.Cldr.Territory.available_styles/0`.\n The current styles are `:short`, `:standard` and `:variant`.\n The default is `:standard`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_language_tag/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag(Cldr.get_locale())\n {:ok, \"world\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag(Cldr.get_locale(), [locale: Cldr.Locale.new!(\"pt\", TestBackend.Cldr)])\n {:ok, \"Mundo\"}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!/2","doc":"The same as `translate_language_tag/2`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag!/2"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!(Cldr.get_locale())\n \"world\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_language_tag!(Cldr.get_locale(), [locale: Cldr.Locale.new!(\"pt\", TestBackend.Cldr)])\n \"Mundo\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_language_tag!/2-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_subdivision/4","doc":"Translate a localized string from one locale to another.\nReturns `{:ok, result}` if successful, otherwise `{:error, reason}`.\n\n* `to_locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_subdivision/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"pl\")\n {:ok, \"Kumbria\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"bs\")\n {:error, {Cldr.UnknownSubdivisionError, \"No subdivision translation for :gbcma could be found in locale :bs\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", :zzz)\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision(\"Cumbria\", \"en\", \"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!/4","doc":"The same as `translate_subdivision/3`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision!/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!(\"Cumbria\", \"en\", \"pl\")\n \"Kumbria\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_subdivision!(\"Kumbria\", \"pl\", \"en\")\n \"Cumbria\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_subdivision!/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_territory/4","doc":"Translate a localized string from one locale to another.\nReturns `{:ok, String.t}` if successful, otherwise `{:error, reason}`.\n\n* `to_locale` is any configured locale. See `Bonfire.Common.Localise.Cldr.known_locale_names/0`.\n The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_territory/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Reino Unido\", \"pt\")\n {:ok, \"United Kingdom\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"United Kingdom\", \"en\", \"pt\")\n {:ok, \"Reino Unido\"}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Reino Unido\", :zzz)\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"United Kingdom\", \"en\", \"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory(\"Westworld\", \"en\", \"pt\")\n {:error, {Cldr.UnknownTerritoryError, \"No territory translation for \\\"Westworld\\\" could be found in locale :en\"}}","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory/4-example"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Territory.translate_territory!/4","doc":"The same as `translate_territory/3`, but raises an exception if it fails.","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory!/4"},{"type":"function","title":"Example - Bonfire.Common.Localise.Cldr.Territory.translate_territory!/4","doc":"iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"Reino Unido\", \"pt\")\n \"United Kingdom\"\n\n iex> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"United Kingdom\", \"en\", \"pt\")\n \"Reino Unido\"\n\n #=> Bonfire.Common.Localise.Cldr.Territory.translate_territory!(\"Westworld\", \"en\", \"pt\")\n ** (Cldr.UnknownTerritoryError) No territory translation for \"Westworld\" could be found in locale \"en\"","ref":"Bonfire.Common.Localise.Cldr.Territory.html#translate_territory!/4-example"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Time","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"Formats a time according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `{:ok, formatted_time}` or\n\n* `{:error, reason}`.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-returns"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `time` is a `t:Time.t/0` struct or any map that contains\n one or more of the keys `:hour`, `:minute`, `:second` and optionally `:microsecond`,\n `:time_zone`, `:zone_abbr`, `:utc_offset` and `:std_offset.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full times (that is,\n times having `:hour`, `:minute` and `:second` fields). The\n default for partial times is to derive a candidate format from the time and\n find the best match from the formats returned by\n `Cldr.Time.available_formats/2`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`. The default is\n `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits should\n be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Time.available_formats/3`\n to see which formats have these variants.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217])\n {:ok, \"7:35:13 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :short)\n {:ok, \"7:35 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :short, period: :variant)\n {:ok, \"7:35 am\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :medium, locale: :fr)\n {:ok, \"07:35:13\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(~T[07:35:13.215217], format: :medium)\n {:ok, \"7:35:13 AM\"}\n\n iex> {:ok, date_time} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(date_time, format: :long)\n {:ok, \"11:59:59 PM UTC\"}\n\n # A partial time with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(%{hour: 23, minute: 11})\n {:ok, \"11:11 PM\"}\n\n # Sometimes the available time fields can't be mapped to an available\n # CLDR defined format.\n iex> Bonfire.Common.Localise.Cldr.Time.to_string(%{minute: 11})\n {:error,\n {Cldr.DateTime.UnresolvedFormat, \"No available format resolved for :m\"}}","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"Formats a time according to a format string\nas defined in CLDR and described in [TR35](http://unicode.org/reports/tr35/tr35-dates.html)\nor raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `time` is a `t:Time.t/0` struct or any map that contains\n one or more of the keys `:hour`, `:minute`, `:second` and optionally `:microsecond`,\n `:time_zone`, `:zone_abbr`, `:utc_offset` and `:std_offset.\n\n* `options` is a keyword list of options for formatting.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `:format` is one of `:short`, `:medium`, `:long`, `:full`, or a format id\n or a format string. The default is `:medium` for full times (that is,\n times having `:hour`, `:minute` and `:second` fields). The\n default for partial times is to derive a candidate format from the time and\n find the best match from the formats returned by\n `Cldr.Time.available_formats/2`. See [here](README.md#date-time-and-datetime-localization-formats)\n for more information about specifying formats.\n\n* `:locale` any locale returned by `Cldr.known_locale_names/1`. The default is\n `Cldr.get_locale/0`.\n\n* `:number_system` a number system into which the formatted date digits should\n be transliterated.\n\n* `:prefer` is either `:unicode` (the default) or `:ascii`. A small number of\n formats have two variants - one using Unicode spaces (typically non-breaking space) and\n another using only ASCII whitespace. The `:ascii` format is primarily to support legacy\n use cases and is not recommended. See `Cldr.Time.available_formats/3`\n to see which formats have these variants.\n\n* `period: :variant` will use a variant for the time period and flexible time period if\n one is available in the locale. For example, in the `:en` locale `period: :variant` will\n return \"pm\" instead of \"PM\".","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"* `formatted_time_string` or\n\n* raises an exception.","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217])\n \"7:35:13 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :short)\n \"7:35 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :short, period: :variant)\n \"7:35 am\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :medium, locale: :fr)\n \"07:35:13\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(~T[07:35:13.215217], format: :medium)\n \"7:35:13 AM\"\n\n iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], \"Etc/UTC\")\n iex> Bonfire.Common.Localise.Cldr.Time.to_string! datetime, format: :long\n \"11:59:59 PM UTC\"\n\n # A partial time with a best match CLDR-defined format\n iex> Bonfire.Common.Localise.Cldr.Time.to_string!(%{hour: 23, minute: 11})\n \"11:11 PM\"","ref":"Bonfire.Common.Localise.Cldr.Time.html#to_string!/2-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Time.Interval","doc":"Interval formats allow for software to format intervals like \"Jan 10-12, 2008\" as a\nshorter and more natural format than \"Jan 10, 2008 - Jan 12, 2008\". They are designed\nto take a start and end date, time or datetime plus a formatting pattern\nand use that information to produce a localized format.\n\nSee `Cldr.Interval.to_string/3` and `Cldr.Time.Interval.to_string/3`.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.do_to_string/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#do_to_string/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.do_to_string!/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#do_to_string!/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"Returns a string representing the formatted\ninterval formed by two times.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `from` is any map that conforms to the\n `Calendar.time` type.\n\n* `to` is any map that conforms to the\n `Calendar.time` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :time]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone time.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:time`, `:zone`,\n and `:flex`. The default is `:time`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configured locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n time is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.Interval.to_string/3","doc":"iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :short\n {:ok, \"10 – 10 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :medium\n {:ok, \"10:00 – 10:03 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :long\n {:ok, \"10:00 – 10:03 AM\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex\n {:ok, \"10:00 – 10:03 in the morning\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :flex\n {:ok, \"12:00 – 10:00 in the morning\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :zone\n {:ok, \"12:00 – 10:00 AM Etc/UTC\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex, locale: \"th\"\n {:ok, \"10:00 – 10:03 ในตอนเช้า\"}\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], nil\n {:ok, \"10:00:00 AM –\"}","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string/3-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"Returns a string representing the formatted\ninterval formed by two times or raises an\nexception.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `from` is any map that conforms to the\n `Calendar.time` type.\n\n* `to` is any map that conforms to the\n `Calendar.time` type. `to` must occur\n on or after `from`.\n\n* `options` is a keyword list of options. The default is\n `[format: :medium, style: :time]`.\n\nEither `from` or `to` may also be `nil`, in which case an\nopen interval is formatted and the non-nil item is formatted\nas a standalone time.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `:format` is one of `:short`, `:medium` or `:long` or a\n specific format type or a string representing of an interval\n format. The default is `:medium`.\n\n* `:style` supports different formatting styles. The\n alternatives are `:time`, `:zone`,\n and `:flex`. The default is `:time`.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag.t/0` struct. The default is `Elixir.Bonfire.Common.Localise.Cldr.get_locale/0`.\n\n* `number_system:` a number system into which the formatted date digits should\n be transliterated.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* `string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"* For more information on interval format string\n see `Cldr.Interval`.\n\n* The available predefined formats that can be applied are the\n keys of the map returned by `Cldr.DateTime.Format.interval_formats(\"en\", :gregorian)`\n where `\"en\"` can be replaced by any configured locale name and `:gregorian`\n is the underlying CLDR calendar type.\n\n* In the case where `from` and `to` are equal, a single\n time is formatted instead of an interval.","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Time.Interval.to_string!/3","doc":"iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :short\n \"10 – 10 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :medium\n \"10:00 – 10:03 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00], format: :long\n \"10:00 – 10:03 AM\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex\n \"10:00 – 10:03 in the morning\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :flex\n \"12:00 – 10:00 in the morning\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],\n ...> format: :long, style: :zone\n \"12:00 – 10:00 AM Etc/UTC\"\n\n iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string! ~T[10:00:00], ~T[10:03:00],\n ...> format: :long, style: :flex, locale: \"th\"\n \"10:00 – 10:03 ในตอนเช้า\"","ref":"Bonfire.Common.Localise.Cldr.Time.Interval.html#to_string!/3-examples"},{"type":"module","title":"Bonfire.Common.Localise.Cldr.Unit","doc":"Supports the CLDR Units definitions which provide for the localization of many\nunit types.","ref":"Bonfire.Common.Localise.Cldr.Unit.html"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.add/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#add/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.add!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#add!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.compatible?/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#compatible?/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.convert/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#convert/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.convert!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#convert!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.decompose/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#decompose/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.default_gender/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#default_gender/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.default_style/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#default_style/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"Returns the localized display name\nfor a unit.\n\nThe returned text is generally suitable\nfor including in UI elements such as\nselection boxes.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"* `unit` is any `t:Cldr.Unit` or any\n unit name returned by `Cldr.Unit.known_units/0`.\n\n* `options` is a keyword list of options.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`.\n\n* `:style` is one of those returned by `Cldr.Unit.available_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.display_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter\n \"liters\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter, locale: \"fr\"\n \"litres\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.display_name :liter, locale: \"fr\", style: :short\n \"l\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#display_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.div/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#div/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.div!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#div!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.grammatical_features/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#grammatical_features/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.grammatical_gender/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#grammatical_gender/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_styles/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_unit_categories/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_unit_categories/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.known_units/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#known_units/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.localize/1","doc":"Localizes a unit according to the current\nprocesses locale and backend.\n\nThe current process's locale is set with\n`Cldr.put_locale/1`.\n\nSee `Cldr.Unit.localize/3` for further\ndetails.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"Localizes a unit according to a territory\n\nA territory can be derived from a `t:Cldr.Locale.locale_name`\nor `t:Cldr.LangaugeTag`.\n\nUse this function if you have a unit which\nshould be presented in a user interface using\nunits relevant to the audience. For example, a\nunit `#Cldr.Unit100, :meter>` might be better\npresented to a US audience as `#Cldr.Unit<328, :foot>`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `backend.get_locale/0`\n\n* `:territory` is any valid territory code returned by\n `Cldr.known_territories/0`. The default is the territory defined\n as part of the `:locale`. The option `:territory` has a precedence\n over the territory in a locale.\n\n* `:usage` is the way in which the unit is intended\n to be used. The available `usage` varyies according\n to the unit category. See `Cldr.Unit.preferred_units/3`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-options"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.localize/2","doc":"iex> unit = Cldr.Unit.new!(1.83, :meter)\n iex> Bonfire.Common.Localise.Cldr.Unit.localize(unit, usage: :person_height, territory: :US)\n [\n Cldr.Unit.new!(:foot, 6, usage: :person_height),\n Cldr.Unit.new!(:inch, \"0.04724409448818897637795275598\", usage: :person_height)\n ]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#localize/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system?/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system?/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for_territory/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for_territory/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_for_territory/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_for_territory/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_system_from_locale/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_system_from_locale/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.measurement_systems_for_unit/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#measurement_systems_for_unit/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.mult/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#mult/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.mult!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#mult!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.new/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#new/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.new!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#new!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"Parse a string to create a new unit.\n\nThis function attempts to parse a string\ninto a `number` and `unit type`. If successful\nit attempts to create a new unit using\n`Cldr.Unit.new/3`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `unit string` is any string to be parsed and if\n possible used to create a new `t:Cldr.Unit`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"* `{:ok, unit}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1kg\"\n Cldr.Unit.new(1, :kilogram)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1 tages\", locale: \"de\"\n Cldr.Unit.new(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse \"1 tag\", locale: \"de\"\n Cldr.Unit.new(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse(\"42 millispangels\")\n {:error, {Cldr.UnknownUnitError, \"Unknown unit was detected at \\\"spangels\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"Parse a string to create a new unit or\nraises an exception.\n\nThis function attempts to parse a string\ninto a `number` and `unit type`. If successful\nit attempts to create a new unit using\n`Cldr.Unit.new/3`.\n\nThe parsed `unit type` is un-aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `unit string` is any string to be parsed and if\n possible used to create a new `t:Cldr.Unit`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"* `unit` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse! \"1kg\"\n Cldr.Unit.new!(1, :kilogram)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse! \"1 tages\", locale: \"de\"\n Cldr.Unit.new!(1, :day)\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse!(\"42 candela per lux\")\n Cldr.Unit.new!(42, \"candela per lux\")\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse!(\"42 millispangels\")\n ** (Cldr.UnknownUnitError) Unknown unit was detected at \"spangels\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"Parse a string to find a matching unit-atom.\n\nThis function attempts to parse a string and\nextract the `unit type`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `unit_name_string` is any string to be parsed and converted into a `unit type`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\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\n* `:only` is a unit category or unit, or a list of unit categories and units.\n The parsed unit must match one of the categories or units in order to\n be valid. This is helpful when disambiguating parsed units. For example,\n parsing \"w\" could be either `:watt` or `:weeks`. Specifying `only: :duration`\n would return `:weeks`. Specifying `only: :power` would return `:watt`\n\n* `:except` is the oppostte of `:only`. The parsed unit must *not*\n match the specified unit or category, or unit categories and units.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* `{:ok, unit_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"* When both `:only` and `:except` options are passed, both\n conditions must be true in order to return a parsed result.\n\n* Only units returned by `Cldr.Unit.known_units/0` can be\n used in the `:only` and `:except` filters.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"kg\"\n {:ok, :kilogram}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"w\"\n {:ok, :watt}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"w\", only: :duration\n {:ok, :week}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"m\", only: [:year, :month, :day]\n {:ok, :month}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"tages\", locale: \"de\"\n {:ok, :day}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name \"tag\", locale: \"de\"\n {:ok, :day}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name(\"millispangels\")\n {:error, {Cldr.UnknownUnitError, \"Unknown unit was detected at \\\"spangels\\\"\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"Parse a string to find a matching unit-atom.\n\nThis function attempts to parse a string and\nextract the `unit type`.\n\nThe parsed `unit type` is aliased against all the\nknown unit names for a give locale (or the current\nlocale if no locale is specified). The known\naliases for unit types can be returned with\n`MyApp.Cldr.Unit.unit_strings_for/1` where `MyApp.Cldr`\nis the name of a backend module.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `unit_name_string` is any string to be parsed and converted into a `unit type`\n\n* `options` is a keyword list of options","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\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\n* `:only` is a unit category or unit, or a list of unit categories and units.\n The parsed unit must match one of the categories or units in order to\n be valid. This is helpful when disambiguating parsed units. For example,\n parsing \"w\" could be either `watts` or `:week`. Specifying `only: :duration`\n would return `:week`. Specifying `only: :power` would return `:watts`\n\n* `:except` is the oppostte of `:only`. The parsed unit must *not*\n match the specified unit or category, or unit categories and units.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* `unit_name` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"* When both `:only` and `:except` options are passed, both\n conditions must be true in order to return a parsed result.\n\n* Only units returned by `Cldr.Unit.known_units/0` can be\n used in the `:only` and `:except` filters.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"kg\"\n :kilogram\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"w\"\n :watt\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"w\", only: :duration\n :week\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"m\", only: [:year, :month, :day]\n :month\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"tages\", locale: \"de\"\n :day\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name! \"tag\", locale: \"de\"\n :day\n\n iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name!(\"millispangels\")\n ** (Cldr.UnknownUnitError) Unknown unit was detected at \"spangels\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#parse_unit_name!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"Returns a list of the preferred units for a given\nunit, locale, use case and scope.\n\nThe units used to represent length, volume and so on\ndepend on a given territory, measurement system and usage.\n\nFor example, in the US, people height is most commonly\nreferred to in `inches`, or informally as `feet and inches`.\nIn most of the rest of the world it is `centimeters`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`.\n\n* `backend` is any Cldr backend module. That is, any module\n that includes `use Cldr`. The default is `Cldr.default_backend/0`\n\n* `options` is a keyword list of options or a\n `Cldr.Unit.Conversion.Options` struct. The default\n is `[]`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `:usage` is the unit usage. for example `;person` for a unit\n type of length. The available usage for a given unit category can\n be seen with `Cldr.Unit.unit_category_usage/0`. The default is `nil`\n\n* `:scope` is either `:small` or `nil`. In some usage, the units\n used are different when the unit size is small. It is up to the\n developer to determine when `scope: :small` is appropriate.\n\n* `:alt` is either `:informal` or `nil`. Like `:scope`, the units\n in use depend on whether they are being used in a formal or informal\n context.\n\n* `:locale` is any locale returned by `Cldr.validate_locale/2`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"* `{:ok, unit_list, formatting_options}` or\n\n* `{:error, {exception, reason}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-returns"},{"type":"function","title":"Notes - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"`formatting_options` is a keyword list of options\nthat can be passed to `Cldr.Unit.to_string/3`. Its\nprimary intended usage is for localizing a unit that\ndecomposes into more than one unit (for example when\n2 meters might become 6 feet 6 inches.) In such\ncases, the last unit in the list (in this case the\ninches) is formatted with the `formatting_options`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-notes"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.preferred_units/2","doc":"iex> meter = Cldr.Unit.new!(:meter, 1)\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :person_height\n {:ok, [:foot, :inch], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :person\n {:ok, [:inch], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-AU\", usage: :person\n {:ok, [:centimeter], []}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-US\", usage: :road\n {:ok, [:foot], [round_nearest: 1]}\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: \"en-AU\", usage: :road\n {:ok, [:meter], [round_nearest: 1]}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"Returns a list of the preferred units for a given\nunit, locale, use case and scope.\n\nThe units used to represent length, volume and so on\ndepend on a given territory, measurement system and usage.\n\nFor example, in the US, people height is most commonly\nreferred to in `inches`, or informally as `feet and inches`.\nIn most of the rest of the world it is `centimeters`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `unit` is any unit returned by `Cldr.Unit.new/2`.\n\n* `backend` is any Cldr backend module. That is, any module\n that includes `use Cldr`. The default is `Cldr.default_backend/0`\n\n* `options` is a keyword list of options or a\n `Cldr.Unit.Conversion.Options` struct. The default\n is `[]`.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `:usage` is the unit usage. for example `;person` for a unit\n type of length. The available usage for a given unit category can\n be seen with `Cldr.Unit.unit_category_usage/0`. The default is `nil`\n\n* `:scope` is either `:small` or `nil`. In some usage, the units\n used are different when the unit size is small. It is up to the\n developer to determine when `scope: :small` is appropriate.\n\n* `:alt` is either `:informal` or `nil`. Like `:scope`, the units\n in use depend on whether they are being used in a formal or informal\n context.\n\n* `:locale` is any locale returned by `Cldr.validate_locale/2`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"* `unit_list` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.preferred_units!/2","doc":"iex> meter = Cldr.Unit.new!(:meter, 2)\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-US\", usage: :person_height\n [:foot, :inch]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-AU\", usage: :person\n [:centimeter]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-US\", usage: :road\n [:foot]\n iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: \"en-AU\", usage: :road\n [:meter]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#preferred_units!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.round/3","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#round/3"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.styles/0","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#styles/0"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.sub/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#sub/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.sub!/2","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#sub!/2"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"Formats a number into an iolist according to a unit definition\nfor a locale.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"* `{:ok, io_list}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_iolist/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist Cldr.Unit.new!(:gallon, 123)\n {:ok, [\"123\", \" gallons\"]}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"Formats a unit using `to_iolist/3` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles/0`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`.\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"* `io_list` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_iolist!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist! 123, unit: :gallon\n [\"123\", \" gallons\"]","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_iolist!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"Formats a number into a string according to a unit definition for a locale.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"* `{:ok, formatted_string}` or\n\n* `{:error, {exception, message}}`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_string/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 123)\n {:ok, \"123 gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1)\n {:ok, \"1 gallon\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"af\"\n {:ok, \"1 gelling\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"af-NA\"\n {:ok, \"1 gelling\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: \"bs\"\n {:ok, \"1 galon\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :long\n {:ok, \"1 thousand gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :short\n {:ok, \"1K gallons\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234)\n {:ok, \"1,234 megahertz\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234), style: :narrow\n {:ok, \"1,234Mhz\"}\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megabyte, 1234), locale: \"en\", style: :unknown\n {:error, {Cldr.UnknownFormatError, \"The unit style :unknown is not known.\"}}","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"Formats a list using `to_string/3` but raises if there is\nan error.","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2"},{"type":"function","title":"Arguments - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `list_or_number` is any number (integer, float or Decimal) or a\n `t:Cldr.Unit` struct or a list of `t:Cldr.Unit` structs\n\n* `options` is a keyword list","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-arguments"},{"type":"function","title":"Options - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `:unit` is any unit returned by `Cldr.Unit.known_units/0`. Ignored if\n the number to be formatted is a `t:Cldr.Unit` struct\n\n* `:locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct. The default is `Cldr.get_locale/0`\n\n* `:style` is one of those returned by `Cldr.Unit.known_styles`.\n The current styles are `:long`, `:short` and `:narrow`.\n The default is `style: :long`\n\n* `:grammatical_case` indicates that a localisation for the given\n locale and given grammatical case should be used. See `Cldr.Unit.known_grammatical_cases/0`\n for the list of known grammatical cases. Note that not all locales\n define all cases. However all locales do define the `:nominative`\n case, which is also the default.\n\n* `:gender` indicates that a localisation for the given\n locale and given grammatical gender should be used. See `Cldr.Unit.known_grammatical_genders/0`\n for the list of known grammatical genders. Note that not all locales\n define all genders. The default gender is `Bonfire.Common.Localise.Cldr.Unit.default_gender/1`\n for the given locale.\n\n* `:list_options` is a keyword list of options for formatting a list\n which is passed through to `Cldr.List.to_string/3`. This is only\n applicable when formatting a list of units.\n\n* Any other options are passed to `Cldr.Number.to_string/2`\n which is used to format the `number`","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-options"},{"type":"function","title":"Returns - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"* `formatted_string` or\n\n* raises an exception","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-returns"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Cldr.Unit.to_string!/2","doc":"iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 123, unit: :gallon\n \"123 gallons\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 1, unit: :gallon\n \"1 gallon\"\n\n iex> Bonfire.Common.Localise.Cldr.Unit.to_string! 1, unit: :gallon, locale: \"af\"\n \"1 gelling\"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#to_string!/2-examples"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.unit_category/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#unit_category/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.unit_strings_for/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#unit_strings_for/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.validate_style/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#validate_style/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.validate_unit/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#validate_unit/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.value/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#value/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.zero/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#zero/1"},{"type":"function","title":"Bonfire.Common.Localise.Cldr.Unit.zero?/1","doc":"","ref":"Bonfire.Common.Localise.Cldr.Unit.html#zero?/1"},{"type":"module","title":"Bonfire.Common.Localise.Gettext","doc":"Default Gettext module\nIt is recommended to use the more convenient macros in `Bonfire.Common.Localise.Gettext.Helpers` instead.","ref":"Bonfire.Common.Localise.Gettext.html"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dgettext/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dgettext/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dgettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dngettext/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dngettext/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dngettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpgettext/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpgettext/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpgettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpngettext/6","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpngettext/6"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.dpngettext_noop/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext_comment/1","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext_comment/1"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.gettext_noop/1","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#gettext_noop/1"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_bindings/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_plural_translation/7","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.handle_missing_translation/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#handle_missing_translation/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.ngettext/4","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#ngettext/4"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.ngettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pgettext/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pgettext/3"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pgettext_noop/2","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pngettext/5","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pngettext/5"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.pngettext_noop/3","doc":"","ref":"Bonfire.Common.Localise.Gettext.html#pngettext_noop/3"},{"type":"module","title":"Bonfire.Common.Localise.Gettext.Helpers","doc":"A module providing Internationalization with a gettext-based API.\n\nBy using [Gettext](https://hexdocs.pm/gettext),\nyour module gains a set of macros for translations, for example:\n\n\n# Simple translation\n\n iex> l(\"Hello\")\n \"Hello\"\n iex> l(\"Hello %{name}\", name: \"Bookchin\")\n \"Hello Bookchin\"\n iex> l(\"Hi\", [], \"test context\")\n \"Hi\"\n\n\n# Plural translation\n\n iex> lp(\"Hi friend\", \"Hi friends\", 2)\n \"Hi friends\"\n iex> lp(\"Hiya %{user_or_users}\", \"Hiyas %{user_or_users}\", 1, [user_or_users: \"Bookchin\"], \"test context\")\n \"Hiya Bookchin\"\n\nSee the [Gettext Docs](https://hexdocs.pm/gettext) for details.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"Translates a string with optional bindings, context, and domain.\n\nThis macro provides translation capabilities based on Gettext. It determines the appropriate domain and context for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"iex> l(\"Hello\")\n \"Hello\"\n iex> l(\"Hello %{name}\", name: \"Bookchin\")\n \"Hello Bookchin\"\n iex> l(\"Hi\", [], \"test context\")\n \"Hi\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.l/4","doc":"* `msgid` - The text or message ID to be translated.\n * `bindings` - (Optional) A list or map of bindings to interpolate in the message.\n * `context` - (Optional) A context for the translation.\n * `domain` - (Optional) A domain for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#l/4-parameters"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"Dynamically localises a text. This function is useful for localising strings only known at runtime (when you can't use the `l` or `lp` macros).","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"iex> localise_dynamic(\"some_message_id\")\n \"some_message_id\"\n iex> localise_dynamic(\"some_message_id\", MyApp.MyModule)\n \"some_message_id\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2-examples"},{"type":"function","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.localise_dynamic/2","doc":"* `msgid` - The message id to be localized.\n * `caller_module` - (Optional) The module from which the call originates.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_dynamic/2-parameters"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"Localizes a list of strings at compile time.\n\nThis macro evaluates the list of strings and localizes each string based on the domain derived from the caller module. This is useful if you want to provide a list of strings at compile time that will later be used at runtime by `localise_dynamic/2`.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"iex> localise_strings([\"hello\", \"world\"])\n [\"hello\", \"world\"]\n iex> localise_strings([\"hello\", \"world\"], MyApp.MyModule)\n [\"hello\", \"world\"]","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.localise_strings/2","doc":"* `strings` - A list of strings to be localized.\n * `caller_module` - (Optional) The module from which the call originates.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#localise_strings/2-parameters"},{"type":"macro","title":"Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"Translates a plural text with optional bindings, context, and domain.\n\nThis macro provides plural translation capabilities based on Gettext. It determines the appropriate domain and context for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6"},{"type":"macro","title":"Examples - Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"iex> lp(\"Hi friend\", \"Hi friends\", 2)\n \"Hi friends\"\n iex> lp(\"Hiya %{user_or_users}\", \"Hiyas %{user_or_users}\", 1, [user_or_users: \"Bookchin\"], \"test context\")\n \"Hiya Bookchin\"","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6-examples"},{"type":"macro","title":"Parameters - Bonfire.Common.Localise.Gettext.Helpers.lp/6","doc":"* `msgid` - The singular message id to be translated.\n * `msgid_plural` - The plural message id to be translated.\n * `n` - The number used to determine singular or plural form.\n * `bindings` - (Optional) A list or map of bindings to interpolate in the message.\n * `context` - (Optional) A context for the translation.\n * `domain` - (Optional) A domain for the translation.","ref":"Bonfire.Common.Localise.Gettext.Helpers.html#lp/6-parameters"},{"type":"module","title":"Bonfire.Common.Localise.Gettext.Plural","doc":"Defines a plural forms module for Gettext that uses CLDR plural rules\nhttps://cldr.unicode.org/index/cldr-spec/plural-rules","ref":"Bonfire.Common.Localise.Gettext.Plural.html"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Plural.nplurals/1","doc":"Returns the number of plural forms for a given locale.\n\n* `locale` is either a locale name in the list\n `{:__aliases__, [counter: {Bonfire.Common.Localise.Gettext.Plural, 2}, line: 6, column: 42], [:Bonfire, :Common, :Localise, :Cldr]}.known_locale_names/0` or\n a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`","ref":"Bonfire.Common.Localise.Gettext.Plural.html#nplurals/1"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Plural.nplurals/1","doc":"iex> Bonfire.Common.Localise.Gettext.Plural.nplurals(\"pl\")\n 4\n\n iex> Bonfire.Common.Localise.Gettext.Plural.nplurals(\"en\")\n 2","ref":"Bonfire.Common.Localise.Gettext.Plural.html#nplurals/1-examples"},{"type":"function","title":"Bonfire.Common.Localise.Gettext.Plural.plural/2","doc":"Returns the plural form of a number for a given\nlocale.\n\n* `locale` is either a locale name in the list `{:__aliases__, [counter: {Bonfire.Common.Localise.Gettext.Plural, 2}, line: 6, column: 42], [:Bonfire, :Common, :Localise, :Cldr]}.known_locale_names/0` or\n a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`","ref":"Bonfire.Common.Localise.Gettext.Plural.html#plural/2"},{"type":"function","title":"Examples - Bonfire.Common.Localise.Gettext.Plural.plural/2","doc":"iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 1)\n 0\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 2)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 5)\n 2\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"pl\", 112)\n 2\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 1)\n 0\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 2)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en\", 112)\n 1\n\n iex> Bonfire.Common.Localise.Gettext.Plural.plural(\"en_GB\", 112)\n 1","ref":"Bonfire.Common.Localise.Gettext.Plural.html#plural/2-examples"},{"type":"module","title":"Bonfire.Common.Media","doc":"Helpers for handling images and other media","ref":"Bonfire.Common.Media.html"},{"type":"function","title":"Bonfire.Common.Media.avatar_fallback/1","doc":"","ref":"Bonfire.Common.Media.html#avatar_fallback/1"},{"type":"function","title":"Bonfire.Common.Media.avatar_media/1","doc":"Takes a Media map (or an object containing one) and returns the avatar's URL.","ref":"Bonfire.Common.Media.html#avatar_media/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.avatar_media/1","doc":"iex> avatar_media(%{profile: %{icon: \"http://example.com/avatar.png\"}})\n %Media{...}\n\n iex> avatar_media(%{icon: \"http://example.com/icon.png\"})\n %Media{...}\n\n iex> avatar_media(%{profile: %{icon: %{path: \"http://example.com/path.png\"}}})\n %Media{...}\n\n iex> avatar_media(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#avatar_media/1-examples"},{"type":"function","title":"Bonfire.Common.Media.avatar_url/1","doc":"Takes a Media map (or an object containing one) and returns the avatar's URL.","ref":"Bonfire.Common.Media.html#avatar_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.avatar_url/1","doc":"iex> avatar_url(%{profile: %{icon: %{url: \"http://example.com/avatar.png\"}}})\n \"http://example.com/avatar.png\"\n\n iex> avatar_url(%{icon: %{path: \"http://example.com/path.png\"}})\n \"http://example.com/path.png\"\n\n iex> avatar_url(%{icon_id: \"icon123\"})\n # Assume Bonfire.Files.IconUploader.remote_url/1 returns \"http://example.com/icon123.png\"\n \"http://example.com/icon123.png\"\n\n iex> avatar_url(%{path: \"image.jpg\"})\n # Assume Bonfire.Files.IconUploader.remote_url/1 returns \"http://example.com/image.jpg\"\n \"http://example.com/image.jpg\"\n\n iex> avatar_url(%{icon: \"http://example.com/icon.png\"})\n \"http://example.com/icon.png\"\n\n iex> avatar_url(%{image: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> avatar_url(%{id: \"user123\", shared_user: nil})\n # Assume avatar_fallback/1 returns \"/images/avatar.png\"\n \"/images/avatar.png\"\n\n iex> avatar_url(%{id: \"user456\", shared_user: %{id: \"shared123\"}})\n \"https://picsum.photos/seed/user456/128/128?blur\"\n\n iex> avatar_url(%{id: \"user789\"})\n # Assume avatar_fallback/1 returns \"/images/avatar.png\"\n \"/images/avatar.png\"","ref":"Bonfire.Common.Media.html#avatar_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.banner_fallback/0","doc":"","ref":"Bonfire.Common.Media.html#banner_fallback/0"},{"type":"function","title":"Bonfire.Common.Media.banner_url/1","doc":"Takes a Media map (or an object containing one) and returns the banner's URL.","ref":"Bonfire.Common.Media.html#banner_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.banner_url/1","doc":"iex> banner_url(%{profile: %{image: %{id: \"banner123\"}}})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner123.png\"\n \"http://example.com/banner123.png\"\n\n iex> banner_url(%{image: %{url: \"http://example.com/banner.png\"}})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{image: %{path: \"http://example.com/banner.png\"}})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{path: \"http://example.com/banner.png\"})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{image_id: \"banner456\"})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner456.png\"\n \"http://example.com/banner456.png\"\n\n iex> banner_url(%{image: \"http://example.com/banner.png\"})\n \"http://example.com/banner.png\"\n\n iex> banner_url(%{profile: %{image: %{id: \"banner789\"}}})\n # Assume Bonfire.Files.BannerUploader.remote_url/1 returns \"http://example.com/banner789.png\"\n \"http://example.com/banner789.png\"\n\n iex> banner_url(%{nonexistent_key: \"value\"})\n # Assume banner_fallback/0 returns \"/images/bonfires.png\"\n \"/images/bonfires.png\"","ref":"Bonfire.Common.Media.html#banner_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.extract_tar/2","doc":"Returns a map containing all files and their contents from a tar or compressed tar.gz archive.","ref":"Bonfire.Common.Media.html#extract_tar/2"},{"type":"function","title":"Examples - Bonfire.Common.Media.extract_tar/2","doc":"iex> extract_tar(\"path/to/archive.tar.gz\")\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}\n\n iex> extract_tar(\"path/to/archive.tar\", [:memory])\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}\n\n iex> extract_tar(\"path/to/archive.tar\", [:compressed, :memory])\n %{\"file1.txt\" => <<...>> , \"file2.txt\" => <<...>>}","ref":"Bonfire.Common.Media.html#extract_tar/2-examples"},{"type":"function","title":"Bonfire.Common.Media.image_url/1","doc":"Takes a Media map (or an object containing one) and returns the image's URL.","ref":"Bonfire.Common.Media.html#image_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.image_url/1","doc":"iex> image_url(\"http://example.com/image.png\")\n \"http://example.com/image.png\"\n\n iex> image_url(%{media_type: \"text/plain\"})\n nil\n\n iex> image_url(%{profile: %{image: %{url: \"http://example.com/image.png\"}}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{image: %{url: \"http://example.com/image.png\"}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{icon: %{path: \"http://example.com/image.png\"}})\n \"http://example.com/image.png\"\n\n iex> image_url(%{path: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> image_url(%{image_id: \"image123\"})\n # Assume Bonfire.Files.ImageUploader.remote_url/1 returns \"http://example.com/image123.png\"\n \"http://example.com/image123.png\"\n\n iex> image_url(%{image: \"http://example.com/image.png\"})\n \"http://example.com/image.png\"\n\n iex> image_url(%{profile: %{image: \"http://example.com/profile_image.png\"}})\n \"http://example.com/profile_image.png\"\n\n iex> image_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#image_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.maybe_dominant_color/4","doc":"Determines the dominant color for a given user’s avatar or banner.","ref":"Bonfire.Common.Media.html#maybe_dominant_color/4"},{"type":"function","title":"Examples - Bonfire.Common.Media.maybe_dominant_color/4","doc":"iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}})\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}}, nil, \"http://example.com/banner.png\")\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: \"http://example.com/avatar.png\"}}, nil, nil, \"/images/bonfires.png\")\n \"#AA4203\" # Example dominant color\n\n iex> maybe_dominant_color(%{profile: %{icon: nil}}, \"http://example.com/banner.png\")\n nil","ref":"Bonfire.Common.Media.html#maybe_dominant_color/4-examples"},{"type":"function","title":"Bonfire.Common.Media.media_url/1","doc":"Takes a Media map (or an object containing one) and returns a URL for the media.","ref":"Bonfire.Common.Media.html#media_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.media_url/1","doc":"iex> media_url(%{path: \"http://example.com/image.jpg\"})\n \"http://example.com/image.jpg\"\n\n iex> media_url(%{path: \"remote.jpg\", metadata: %{\"module\" => \"MyModule\"}})\n # Assume MyModule.remote_url/1 is defined and returns \"http://example.com/remote.jpg\"\n \"http://example.com/remote.jpg\"\n\n iex> media_url(%{media_type: \"image/jpeg\", path: \"image.jpg\"})\n \"http://image.jpg\"\n\n iex> media_url(%{media_type: \"text/plain\", path: \"document.txt\"})\n \"http://document.txt\"\n\n iex> media_url(%{changes: %{path: \"http://changed.example.com/image.jpg\"}})\n \"http://changed.example.com/image.jpg\"\n\n iex> media_url(%{path: \"image.jpg\"})\n \"http://image.jpg\"\n\n iex> media_url(%{media: %{path: \"http://nested.example.com/image.jpg\"}})\n \"http://nested.example.com/image.jpg\"\n\n iex> media_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#media_url/1-examples"},{"type":"function","title":"Bonfire.Common.Media.read_tar_files/3","doc":"Reads specific files from a tar archive and returns their contents.","ref":"Bonfire.Common.Media.html#read_tar_files/3"},{"type":"function","title":"Examples - Bonfire.Common.Media.read_tar_files/3","doc":"iex> read_tar_files(\"path/to/archive.tar\", \"file1.txt\")\n {:ok, \"file1 contents\"}\n\n iex> read_tar_files(\"path/to/archive.tar\", [\"file1.txt\", \"file2.txt\"])\n {:ok, [\"file1 contents\", \"file2 contents\"]}\n\n iex> read_tar_files(\"path/to/nonexistent.tar\", \"file1.txt\")\n {:error, \"File not found\"}\n\n iex> read_tar_files(\"path/to/archive.tar\", \"nonexistent_file.txt\")\n {:error, \"File not found\"}","ref":"Bonfire.Common.Media.html#read_tar_files/3-examples"},{"type":"function","title":"Bonfire.Common.Media.thumbnail_url/1","doc":"Takes a Media map (or an object containing one) and returns the thumbnail's URL.","ref":"Bonfire.Common.Media.html#thumbnail_url/1"},{"type":"function","title":"Examples - Bonfire.Common.Media.thumbnail_url/1","doc":"iex> thumbnail_url(%{path: \"thumbnail.jpg\", metadata: %{\"module\" => \"MyModule\"}})\n # Assume MyModule.remote_url/2 with :thumbnail returns \"http://example.com/thumbnail.jpg\"\n \"http://example.com/thumbnail.jpg\"\n\n iex> thumbnail_url(%{media_type: \"image/jpeg\", path: \"thumbnail.jpg\"})\n \"http://thumbnail.jpg\"\n\n iex> thumbnail_url(%{media_type: \"video/mp4\", path: \"video.mpeg\"})\n # Assume Bonfire.Files.VideoUploader.remote_url/2 with :thumbnail returns \"http://video-thumbnail.jpg\"\n \"http://video-thumbnail.jpg\"\n\n iex> thumbnail_url(%{path: \"document.pdf\", media_type: \"document\"})\n # Assume Bonfire.Files.DocumentUploader.remote_url/2 with :thumbnail returns \"http://document-thumbnail.jpg\"\n \"http://document-thumbnail.jpg\"\n\n iex> thumbnail_url(%{nonexistent_key: \"value\"})\n nil","ref":"Bonfire.Common.Media.html#thumbnail_url/1-examples"},{"type":"module","title":"Bonfire.Common.MemoryMonitor","doc":"This module implements a GenServer that monitors the memory usage of a process.\nIt periodically checks the memory consumption.","ref":"Bonfire.Common.MemoryMonitor.html"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.MemoryMonitor.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.get_memory_usage/2","doc":"","ref":"Bonfire.Common.MemoryMonitor.html#get_memory_usage/2"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.handle_info/2","doc":"Handles incoming messages to the GenServer.\n - `:check` - Performs memory usage checks on the monitored process","ref":"Bonfire.Common.MemoryMonitor.html#handle_info/2"},{"type":"function","title":"Bonfire.Common.MemoryMonitor.start_link/2","doc":"Starts the MemoryMonitor process linked to the caller process with given options.","ref":"Bonfire.Common.MemoryMonitor.html#start_link/2"},{"type":"module","title":"Bonfire.Common.Modularity.DeclareHelpers","doc":"Helpers for declaring the existence of an extension (i.e., so it gets included in extension settings and nav).","ref":"Bonfire.Common.Modularity.DeclareHelpers.html"},{"type":"function","title":"Bonfire.Common.Modularity.DeclareHelpers.app/1","doc":"Gets the OTP app name for a module","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#app/1"},{"type":"macro","title":"Bonfire.Common.Modularity.DeclareHelpers.declare_extension/2","doc":"Declares an extension by setting up the module with the given name and options.","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#declare_extension/2"},{"type":"macro","title":"Examples - Bonfire.Common.Modularity.DeclareHelpers.declare_extension/2","doc":"iex> defmodule MyExtension do\n ...> import Bonfire.Common.Modularity.DeclareHelpers\n ...> declare_extension(\"My Extension\", readme: \"MY_README.md\")\n ...> end","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#declare_extension/2-examples"},{"type":"function","title":"Bonfire.Common.Modularity.DeclareHelpers.generate_link/3","doc":"Generates a map representing a link with metadata for the extension with the given name, module, and options.","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#generate_link/3"},{"type":"function","title":"Examples - Bonfire.Common.Modularity.DeclareHelpers.generate_link/3","doc":"iex> Bonfire.Common.Modularity.DeclareHelpers.generate_link(:bonfire_common, Bonfire.Common, href: \"/my_extension\")\n %{\n name: :bonfire_common,\n module: Bonfire.Common,\n app: :bonfire_common,\n href: \"/my_extension\",\n type: :link\n }","ref":"Bonfire.Common.Modularity.DeclareHelpers.html#generate_link/3-examples"},{"type":"module","title":"Bonfire.Common.Module.Override","doc":"Utility to clone a module under a new name","ref":"Bonfire.Common.Module.Override.html"},{"type":"function","title":"Bonfire.Common.Module.Override.clone/2","doc":"Clone the existing module under a new name","ref":"Bonfire.Common.Module.Override.html#clone/2"},{"type":"function","title":"Bonfire.Common.Module.Override.clone_original/2","doc":"","ref":"Bonfire.Common.Module.Override.html#clone_original/2"},{"type":"function","title":"Bonfire.Common.Module.Override.module_name_atom/1","doc":"","ref":"Bonfire.Common.Module.Override.html#module_name_atom/1"},{"type":"function","title":"Bonfire.Common.Module.Override.module_name_string/1","doc":"","ref":"Bonfire.Common.Module.Override.html#module_name_string/1"},{"type":"function","title":"Bonfire.Common.Module.Override.module_original_name_atom/2","doc":"","ref":"Bonfire.Common.Module.Override.html#module_original_name_atom/2"},{"type":"function","title":"Bonfire.Common.Module.Override.module_original_name_str/2","doc":"","ref":"Bonfire.Common.Module.Override.html#module_original_name_str/2"},{"type":"module","title":"Bonfire.Common.Needles","doc":"Helpers for handling `Needle` Pointers","ref":"Bonfire.Common.Needles.html"},{"type":"function","title":"Bonfire.Common.Needles.dataloader/1","doc":"Resolves pointers for GraphQL API batch loading.","ref":"Bonfire.Common.Needles.html#dataloader/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.dataloader/1","doc":"iex> Bonfire.Common.Needles.dataloader(context)\n %Dataloader{...}","ref":"Bonfire.Common.Needles.html#dataloader/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.exists?/2","doc":"Checks if an object exists based on the given filters.","ref":"Bonfire.Common.Needles.html#exists?/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.exists?/2","doc":"iex> Bonfire.Common.Needles.exists?(\"some_id\")\n true\n\n iex> Bonfire.Common.Needles.exists?(\"non_existent_id\")\n false","ref":"Bonfire.Common.Needles.html#exists?/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.filter_one/1","doc":"Filters a single pointer from a query result.","ref":"Bonfire.Common.Needles.html#filter_one/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.filter_one/1","doc":"iex> Bonfire.Common.Needles.filter_one(\"http://url\")\n [canonical_uri: \"http://url\"]","ref":"Bonfire.Common.Needles.html#filter_one/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.filters/3","doc":"Applies filters to a query.","ref":"Bonfire.Common.Needles.html#filters/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.filters/3","doc":"iex> Bonfire.Common.Needles.filters(query, filters)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#filters/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.follow!/2","doc":"Follows one or more pointers and returns the schema struct.","ref":"Bonfire.Common.Needles.html#follow!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.follow!/2","doc":"iex> Bonfire.Common.Needles.follow!(%Pointer{id: \"some_id\"})\n %SomeRecord{}\n\n iex> Bonfire.Common.Needles.follow!([%Pointer{id: \"some_id\"}])\n [%SomeRecord{}]","ref":"Bonfire.Common.Needles.html#follow!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.follow_function_error/2","doc":"","ref":"Bonfire.Common.Needles.html#follow_function_error/2"},{"type":"function","title":"Bonfire.Common.Needles.forge!/1","doc":"Forge a pointer from a pointable object.\n\nDoes not hit the database, is safe so long as the provided struct participates in the meta abstraction.","ref":"Bonfire.Common.Needles.html#forge!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.forge!/1","doc":"iex> Bonfire.Common.Needles.forge!(%{__struct__: MySchema, id: \"some_id\"})\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#forge!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.forge!/2","doc":"Forges a pointer to a participating meta entity\n\nDoes not hit the database, is safe so long as the entry we wish to\nsynthesise a pointer for represents a legitimate entry in the database.","ref":"Bonfire.Common.Needles.html#forge!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.forge!/2","doc":"iex> Bonfire.Common.Needles.forge!(:my_table, \"some_id\")\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#forge!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.get/2","doc":"Retrieves an object by its ID.","ref":"Bonfire.Common.Needles.html#get/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.get/2","doc":"iex> Bonfire.Common.Needles.get(\"existing_id\")\n {:ok, %Pointer{id: \"existing_id\", ...}}\n\n iex> Bonfire.Common.Needles.get(\"non_existent_id\")\n {:error, :not_found}","ref":"Bonfire.Common.Needles.html#get/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.get!/2","doc":"Retrieves an object by its ID. Raises `NotFound` if the object cannot be found.","ref":"Bonfire.Common.Needles.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.get!/2","doc":"iex> Bonfire.Common.Needles.get!(\"existing_id\")\n %Pointer{id: \"existing_id\", ...}\n\n iex> Bonfire.Common.Needles.get!(\"non_existent_id\")\n ** (Needle.NotFound) ...","ref":"Bonfire.Common.Needles.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.id_binary/1","doc":"Filters an object by its binary ID.","ref":"Bonfire.Common.Needles.html#id_binary/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.id_binary/1","doc":"iex> Bonfire.Common.Needles.id_binary(id: \"some_id\")","ref":"Bonfire.Common.Needles.html#id_binary/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.id_filter/2","doc":"Filters an object by its ID.","ref":"Bonfire.Common.Needles.html#id_filter/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.id_filter/2","doc":"iex> Bonfire.Common.Needles.id_filter(query, id: \"some_id\")","ref":"Bonfire.Common.Needles.html#id_filter/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.list!/2","doc":"Retrieves a list of objects based on pointers or IDs.","ref":"Bonfire.Common.Needles.html#list!/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list!/2","doc":"iex> Bonfire.Common.Needles.list!([\"id1\", \"id2\"])\n [%Pointer{id: \"id1\", ...}, %Pointer{id: \"id2\", ...}]\n\n iex> Bonfire.Common.Needles.list!([%Pointer{id: \"id1\"}, %Pointer{id: \"id2\"}])\n [%Pointer{id: \"id1\", ...}, %Pointer{id: \"id2\", ...}]","ref":"Bonfire.Common.Needles.html#list!/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.list_by_type!/3","doc":"Retrieves objects based on type and filters.","ref":"Bonfire.Common.Needles.html#list_by_type!/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list_by_type!/3","doc":"iex> Bonfire.Common.Needles.list_by_type!(:my_table, [filter: value])\n [%Pointer{...}, %Pointer{...}]","ref":"Bonfire.Common.Needles.html#list_by_type!/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.list_ids/0","doc":"Retrieves a list of known IDs","ref":"Bonfire.Common.Needles.html#list_ids/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.list_ids/0","doc":"iex> Bonfire.Common.Needles.list_ids()\n [\"id1\", \"id2\"]","ref":"Bonfire.Common.Needles.html#list_ids/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.many/2","doc":"Retrieves many objects based on the provided filters","ref":"Bonfire.Common.Needles.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.many/2","doc":"iex> Bonfire.Common.Needles.many([id: \"some_id\"])\n {:ok, [%Pointer{id: \"some_id\", ...}]}\n\n iex> Bonfire.Common.Needles.many([id: \"non_existing_id\"])\n {:ok, []}","ref":"Bonfire.Common.Needles.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.many!/2","doc":"Retrieves many objects based on the provided filters\n\n iex> Bonfire.Common.Needles.many!([id: \"some_id\"])\n [%Pointer{id: \"some_id\", ...}]","ref":"Bonfire.Common.Needles.html#many!/2"},{"type":"function","title":"Bonfire.Common.Needles.maybe_forge/1","doc":"Turns a thing into a pointer if it is not already or returns nil.","ref":"Bonfire.Common.Needles.html#maybe_forge/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.maybe_forge/1","doc":"iex> Bonfire.Common.Needles.maybe_forge(%Pointer{id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge(%{pointer_id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge(%{id: \"existing_id\"})\n nil","ref":"Bonfire.Common.Needles.html#maybe_forge/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.maybe_forge!/1","doc":"Turns a thing into a pointer if it is not already. Errors if it cannot be performed.\n\n iex> Bonfire.Common.Needles.maybe_forge!(%Pointer{id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge!(%{pointer_id: \"existing_id\"})\n %Pointer{id: \"existing_id\"}\n\n iex> Bonfire.Common.Needles.maybe_forge!(%{id: \"non_existing_id\"})\n ** (RuntimeError) ...","ref":"Bonfire.Common.Needles.html#maybe_forge!/1"},{"type":"function","title":"Bonfire.Common.Needles.maybe_resolve/4","doc":"Resolves associations or fields based on the given parent and context.","ref":"Bonfire.Common.Needles.html#maybe_resolve/4"},{"type":"function","title":"Examples - Bonfire.Common.Needles.maybe_resolve/4","doc":"iex> Bonfire.Common.Needles.maybe_resolve(parent, field, args, context)\n {:ok, resolved_data}","ref":"Bonfire.Common.Needles.html#maybe_resolve/4-examples"},{"type":"function","title":"Bonfire.Common.Needles.one/2","doc":"Retrieves an object by its ID or pointer.","ref":"Bonfire.Common.Needles.html#one/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.one/2","doc":"iex> Bonfire.Common.Needles.get(\"some_id\")\n {:ok, %Pointer{id: \"some_id\", ...}}\n\n iex> Bonfire.Common.Needles.get([id: \"some_id\"])\n {:ok, %Pointer{id: \"existing_id\", ...}}","ref":"Bonfire.Common.Needles.html#one/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.one!/2","doc":"Retrieves a single object based on the provided filters with bang.\n\n iex> Bonfire.Common.Needles.one!(\"some_id\")\n %Pointer{id: \"some_id\", ...}\n\n iex> Bonfire.Common.Needles.one!([id: \"some_id\"])\n %Pointer{id: \"some_id\", ...}","ref":"Bonfire.Common.Needles.html#one!/2"},{"type":"function","title":"Bonfire.Common.Needles.pointer_preloads/2","doc":"Preloads associations based on the given preloads option.","ref":"Bonfire.Common.Needles.html#pointer_preloads/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.pointer_preloads/2","doc":"iex> Bonfire.Common.Needles.pointer_preloads(query, :with_creator)\n %Ecto.Query{...}\n\n iex> Bonfire.Common.Needles.pointer_preloads(query, :tags)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#pointer_preloads/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.pointer_query/2","doc":"Prepares a query for pointers.","ref":"Bonfire.Common.Needles.html#pointer_query/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.pointer_query/2","doc":"iex> Bonfire.Common.Needles.pointer_query(query, opts)\n %Ecto.Query{...}\n\n iex> Bonfire.Common.Needles.pointer_query([id: \"some_id\"], opts)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#pointer_query/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.preload!/2","doc":"Follows one or more pointers and adds the pointed records to the `pointed` attrs.\n\n iex> Bonfire.Common.Needles.preload!(%Pointer{id: \"some_id\"})\n %Pointer{id: \"some_id\", pointed: %SomeRecord{}}\n\n iex> Bonfire.Common.Needles.preload!([%Pointer{id: \"some_id\"}])\n [%Pointer{id: \"some_id\", pointed: %SomeRecord{}}]","ref":"Bonfire.Common.Needles.html#preload!/2"},{"type":"function","title":"Bonfire.Common.Needles.query/3","doc":"Queries a dataset based on provided filters.","ref":"Bonfire.Common.Needles.html#query/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.query/3","doc":"iex> Bonfire.Common.Needles.query(filters)\n %Ecto.Query{...}","ref":"Bonfire.Common.Needles.html#query/3-examples"},{"type":"module","title":"Bonfire.Common.Needles.Pointers.Queries","doc":"Queries for `Needle` Pointers","ref":"Bonfire.Common.Needles.Pointers.Queries.html"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Common.Needles.Pointers.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query/1","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query/1"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query/2","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query/2"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.query_incl_deleted/0","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#query_incl_deleted/0"},{"type":"function","title":"Bonfire.Common.Needles.Pointers.Queries.schema_module/0","doc":"","ref":"Bonfire.Common.Needles.Pointers.Queries.html#schema_module/0"},{"type":"module","title":"Bonfire.Common.Needles.Preload","doc":"Helpers for preloading `Needle` Pointer associations. See also `Bonfire.Common.Repo.Preload`","ref":"Bonfire.Common.Needles.Preload.html"},{"type":"function","title":"Bonfire.Common.Needles.Preload.access_key/2","doc":"Generates an access function based on a key and default value.","ref":"Bonfire.Common.Needles.Preload.html#access_key/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.access_key/2","doc":"iex> Bonfire.Common.Needles.Preload.access_key(:key)","ref":"Bonfire.Common.Needles.Preload.html#access_key/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.custom_access_key_fun/3","doc":"Creates a custom access function for nested keys with an optional transformation function.","ref":"Bonfire.Common.Needles.Preload.html#custom_access_key_fun/3"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.custom_access_key_fun/3","doc":"iex> Bonfire.Common.Needles.Preload.custom_access_key_fun(:key)\n #Function<...>","ref":"Bonfire.Common.Needles.Preload.html#custom_access_key_fun/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"Conditionally preloads nested pointers in object(s) based on provided keys and options.\n\nThis function handles various cases including nested keys for preloading. It supports preloading pointers in objects, lists of objects, and nested structures. The function processes lists of keys for deeply nested preloading.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3"},{"type":"function","title":"Parameters - Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"- `object`: The object in which nested pointers may be preloaded. This can be a map, list, or other data structures.\n - `keys`: A list of nested keys for preloading pointers. The keys can be deeply nested to access and preload pointers at various levels (like in `proload` as opposed to `maybe_preload`)\n - `opts`: Options for preloading, which may include configuration for how pointers are fetched and handled.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers/3","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers(%{key: %{nested_key: %Ecto.AssociationNotLoaded{}}}, [key: [:nested_key]], [])\n %{key: %{nested_key: %LoadedObject{}}}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers(%{edges: []}, [:key], [])\n %{edges: []}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_nested_pointers([%{key: %Ecto.AssociationNotLoaded{}}], [:key], [])\n [%{key: %LoadedObject{}}]","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_nested_pointers/3-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_pointer/2","doc":"Preloads a single pointer if the provided value is a `Needle.Pointer`.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointer/2"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_pointer/2","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_pointer(%Needle.Pointer{...}, [])\n %LoadedObject{}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointer(\"not_a_pointer\", [])\n \"not_a_pointer\"","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointer/2-examples"},{"type":"function","title":"Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"Conditionally preloads pointers in an object based on provided keys and options.\n\nThis function handles various cases including tuples with `{:ok, obj}`, maps with an `:edges` key, lists of objects, and individual objects. It supports both single and nested keys for preloading.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3"},{"type":"function","title":"Parameters - Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"- `object`: The object(s) in which pointers may be preloaded. This can be a map, list, tuple, or other data structures.\n - `keys`: A list of keys or a single key for preloading pointers. Nested keys can be specified for deeper levels of preloading.\n - `opts`: Options for preloading, which may include configuration for how pointers are fetched and handled.","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Preload.maybe_preload_pointers/3","doc":"iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{edges: [...]}, [:key], [])\n %{edges: [...]}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{key: %Ecto.AssociationNotLoaded{}}, [:key], [])\n %{key: %LoadedObject{}}\n\n iex> Bonfire.Common.Needles.Preload.maybe_preload_pointers(%{key: %{nested_key: %Ecto.AssociationNotLoaded{}}}, [:key, :nested_key], [])\n %{key: %{nested_key: %LoadedObject{}}}","ref":"Bonfire.Common.Needles.Preload.html#maybe_preload_pointers/3-examples"},{"type":"module","title":"Bonfire.Common.Needles.Tables","doc":"Helpers for querying `Needle` types/tables","ref":"Bonfire.Common.Needles.Tables.html"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_ids/0","doc":"Lists IDs of all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_ids/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_ids/0","doc":"iex> Bonfire.Common.Needles.Tables.list_ids()\n [\"id1\", \"id2\"]","ref":"Bonfire.Common.Needles.Tables.html#list_ids/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_schemas/0","doc":"Lists schemas of all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_schemas/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_schemas/0","doc":"iex> Bonfire.Common.Needles.Tables.list_schemas()\n [:schema1, :schema2]","ref":"Bonfire.Common.Needles.Tables.html#list_schemas/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_tables/1","doc":"Lists all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_tables/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_tables/1","doc":"iex> Bonfire.Common.Needles.Tables.list_tables()\n [%Table{}]\n\n iex> Bonfire.Common.Needles.Tables.list_tables(:db)\n %{\"table_name\" => %Table{}}","ref":"Bonfire.Common.Needles.Tables.html#list_tables/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.list_tables_debug/0","doc":"Lists and debugs all Pointable Tables.","ref":"Bonfire.Common.Needles.Tables.html#list_tables_debug/0"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.list_tables_debug/0","doc":"iex> Bonfire.Common.Needles.Tables.list_tables_debug()\n [{:ok, \"table1\"}, {:error, \"Code and DB have differing IDs for the same table\", \"table2\", \"id2a\", \"id2b\"}, {:error, \"Table present in DB but not in code\", \"table3\"}]","ref":"Bonfire.Common.Needles.Tables.html#list_tables_debug/0-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.many/1","doc":"Retrieves details of multiple tables based on filters.","ref":"Bonfire.Common.Needles.Tables.html#many/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.many/1","doc":"iex> Bonfire.Common.Needles.Tables.many(%{field: \"value\"})\n {:ok, [%Table{}]}","ref":"Bonfire.Common.Needles.Tables.html#many/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.one/1","doc":"Retrieves a single record by ID or filters.","ref":"Bonfire.Common.Needles.Tables.html#one/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.one/1","doc":"iex> Bonfire.Common.Needles.Tables.one(\"valid_ulid\")\n {:ok, %Table{}}\n\n iex> Bonfire.Common.Needles.Tables.one(%{field: \"value\"})\n %Table{}","ref":"Bonfire.Common.Needles.Tables.html#one/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.one!/1","doc":"Retrieves a single record by filters, raising an error if not found.","ref":"Bonfire.Common.Needles.Tables.html#one!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.one!/1","doc":"iex> Bonfire.Common.Needles.Tables.one!(%{field: \"value\"})\n %Table{}","ref":"Bonfire.Common.Needles.Tables.html#one!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.schema_or_table!/1","doc":"Retrieves the schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#schema_or_table!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.schema_or_table!/1","doc":"iex> Bonfire.Common.Needles.Tables.schema_or_table!(\"valid_id\")\n MySchema\n\n iex> Bonfire.Common.Needles.Tables.schema_or_table!(\"table_name\")\n MySchema","ref":"Bonfire.Common.Needles.Tables.html#schema_or_table!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table!/1","doc":"Retrieves the Table that a pointer points to.","ref":"Bonfire.Common.Needles.Tables.html#table!/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table!/1","doc":"iex> Bonfire.Common.Needles.Tables.table!(%Pointer{table_id: \"valid_id\"})\n %Table{}\n\n iex> Bonfire.Common.Needles.Tables.table!(\"valid_id\")\n %Table{}\n\n iex> Bonfire.Common.Needles.Tables.table!(\"invalid_id\")\n # throws error","ref":"Bonfire.Common.Needles.Tables.html#table!/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table_fields/1","doc":"Retrieves fields of a table given a schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#table_fields/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table_fields/1","doc":"iex> Bonfire.Common.Needles.Tables.table_fields(MySchema)\n [:field1, :field2]\n\n iex> Bonfire.Common.Needles.Tables.table_fields(\"table_name\")\n [:field1, :field2]","ref":"Bonfire.Common.Needles.Tables.html#table_fields/1-examples"},{"type":"function","title":"Bonfire.Common.Needles.Tables.table_fields_meta/1","doc":"Retrieves metadata about fields of a table given a schema or table name.","ref":"Bonfire.Common.Needles.Tables.html#table_fields_meta/1"},{"type":"function","title":"Examples - Bonfire.Common.Needles.Tables.table_fields_meta/1","doc":"iex> Bonfire.Common.Needles.Tables.table_fields_meta(MySchema)\n [%{column_name: \"field1\", data_type: \"type\", column_default: nil, is_nullable: \"NO\"}]\n\n iex> Bonfire.Common.Needles.Tables.table_fields_meta(\"table_name\")\n [%{column_name: \"field1\", data_type: \"type\", column_default: nil, is_nullable: \"NO\"}]","ref":"Bonfire.Common.Needles.Tables.html#table_fields_meta/1-examples"},{"type":"module","title":"Bonfire.Common.Needles.Tables.Queries","doc":"Queries for `Bonfire.Common.Needles.Tables`","ref":"Bonfire.Common.Needles.Tables.Queries.html"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Common.Needles.Tables.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.query/1","doc":"","ref":"Bonfire.Common.Needles.Tables.Queries.html#query/1"},{"type":"function","title":"Bonfire.Common.Needles.Tables.Queries.query/2","doc":"","ref":"Bonfire.Common.Needles.Tables.Queries.html#query/2"},{"type":"module","title":"Bonfire.Common.Opts","doc":"Helpers to handle functions' `opts` parameter (usually a `Keyword` list)","ref":"Bonfire.Common.Opts.html"},{"type":"function","title":"Bonfire.Common.Opts.maybe_from_opts/3","doc":"Retrieves the value associated with a key from options (list or map), or returns a fallback if the key is not present or if the value is empty.\n\nThis function looks for the key in the options and returns its value if present. If the key is not found or the value is empty, it returns the provided fallback value.","ref":"Bonfire.Common.Opts.html#maybe_from_opts/3"},{"type":"function","title":"Examples - Bonfire.Common.Opts.maybe_from_opts/3","doc":"iex> maybe_from_opts([key: \"value\"], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts([key: nil], :key, \"default\")\n \"default\"\n\n iex> maybe_from_opts(%{key: \"value\"}, :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{missing_key: \"value\"}, :key, \"default\")\n \"default\"\n\n iex> maybe_from_opts([context: %{key: \"value\"}], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts([context: %{key: \"value\"}], :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{context: %{key: \"value\"}}, :key, \"default\")\n \"value\"\n\n iex> maybe_from_opts(%{context: %{key: \"value\"}}, :key, \"default\")\n \"value\"","ref":"Bonfire.Common.Opts.html#maybe_from_opts/3-examples"},{"type":"function","title":"Bonfire.Common.Opts.to_options/1","doc":"Converts various types of input (e.g. map, user, socket, tuple) into a standardized keyword list for use as function options.\n\nThis function handles different types of inputs and converts them to keyword lists. The conversion logic includes:\n\n- Extracting assigns from Phoenix socket maps, dropping specific keys.\n- Wrapping user structs into a keyword list with the key `:current_user`.\n- Wrapping other structs into a keyword list with the key `:context`.\n- Converting tuples, maps, and lists into keyword lists or wrapping them as context.","ref":"Bonfire.Common.Opts.html#to_options/1"},{"type":"function","title":"Examples - Bonfire.Common.Opts.to_options/1","doc":"iex> to_options(%{assigns: %{user: \"user_data\"}})\n [user: \"user_data\"]\n\n iex> to_options(%Bonfire.Data.Identity.User{})\n [current_user: %Bonfire.Data.Identity.User{}]\n\n iex> to_options(%{key: \"value\"})\n [key: \"value\"]\n\n iex> to_options({:key, \"value\"})\n [key: \"value\"]\n\n iex> to_options([{:key, \"value\"}])\n [{:key, \"value\"}]\n\n iex> to_options(%{other: \"data\"})\n [other: \"data\"]\n \n iex> to_options(%{\"non_existing_other\"=> \"data\"})\n [__item_discarded__: true]","ref":"Bonfire.Common.Opts.html#to_options/1-examples"},{"type":"module","title":"Bonfire.Common.PubSub","doc":"Pub/sub helpers for subscribing and broadcasting to topics","ref":"Bonfire.Common.PubSub.html"},{"type":"function","title":"Bonfire.Common.PubSub.broadcast/2","doc":"Broadcast some data for realtime updates, for example to a feed or thread","ref":"Bonfire.Common.PubSub.html#broadcast/2"},{"type":"macro","title":"Bonfire.Common.PubSub.broadcast_with_telemetry/2","doc":"Broadcast while attaching telemetry info. The receiving module must `use Bonfire.Common.PubSub` to correctly unwrap the Event","ref":"Bonfire.Common.PubSub.html#broadcast_with_telemetry/2"},{"type":"function","title":"Bonfire.Common.PubSub.broadcast_with_telemetry/3","doc":"","ref":"Bonfire.Common.PubSub.html#broadcast_with_telemetry/3"},{"type":"function","title":"Bonfire.Common.PubSub.current_function/1","doc":"","ref":"Bonfire.Common.PubSub.html#current_function/1"},{"type":"function","title":"Bonfire.Common.PubSub.subscribe/2","doc":"Subscribe to something for realtime updates, like a feed or thread","ref":"Bonfire.Common.PubSub.html#subscribe/2"},{"type":"module","title":"Bonfire.Common.PubSub.Event","doc":"","ref":"Bonfire.Common.PubSub.Event.html"},{"type":"behaviour","title":"Bonfire.Common.QueryModule","doc":"Properly query some data using the appropriate module depending on its schema.\nBack by a global cache of known query_modules to be queried by their schema, or vice versa.","ref":"Bonfire.Common.QueryModule.html"},{"type":"function","title":"Bonfire.Common.QueryModule.app_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#app_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.apply_error/2","doc":"","ref":"Bonfire.Common.QueryModule.html#apply_error/2"},{"type":"callback","title":"Bonfire.Common.QueryModule.context_module/0","doc":"Points to the related context module","ref":"Bonfire.Common.QueryModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.QueryModule.linked_context_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#linked_context_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.linked_schema_modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#linked_schema_modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.maybe_query/3","doc":"","ref":"Bonfire.Common.QueryModule.html#maybe_query/3"},{"type":"function","title":"Bonfire.Common.QueryModule.maybe_query_module/1","doc":"","ref":"Bonfire.Common.QueryModule.html#maybe_query_module/1"},{"type":"function","title":"Bonfire.Common.QueryModule.modules/0","doc":"","ref":"Bonfire.Common.QueryModule.html#modules/0"},{"type":"function","title":"Bonfire.Common.QueryModule.query_function_error/3","doc":"","ref":"Bonfire.Common.QueryModule.html#query_function_error/3"},{"type":"callback","title":"Bonfire.Common.QueryModule.query_module/0","doc":"Declares a query module","ref":"Bonfire.Common.QueryModule.html#c:query_module/0"},{"type":"function","title":"Bonfire.Common.QueryModule.query_module/1","doc":"Get a Queryable identified by name or id.","ref":"Bonfire.Common.QueryModule.html#query_module/1"},{"type":"function","title":"Bonfire.Common.QueryModule.query_module!/1","doc":"Look up a Queryable by name or id, throw :not_found if not found.","ref":"Bonfire.Common.QueryModule.html#query_module!/1"},{"type":"function","title":"Bonfire.Common.QueryModule.query_modules/1","doc":"Look up many ids at once, throw :not_found if any of them are not found","ref":"Bonfire.Common.QueryModule.html#query_modules/1"},{"type":"callback","title":"Bonfire.Common.QueryModule.schema_module/0","doc":"Points to the related schema module","ref":"Bonfire.Common.QueryModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.Repo","doc":"Main Ecto Repo.\n\nNote: functions are defined in `Bonfire.Common.RepoTemplate`","ref":"Bonfire.Common.Repo.html"},{"type":"function","title":"Bonfire.Common.Repo.aggregate/3","doc":"","ref":"Bonfire.Common.Repo.html#aggregate/3"},{"type":"function","title":"Bonfire.Common.Repo.aggregate/4","doc":"","ref":"Bonfire.Common.Repo.html#aggregate/4"},{"type":"function","title":"Bonfire.Common.Repo.all/2","doc":"","ref":"Bonfire.Common.Repo.html#all/2"},{"type":"function","title":"Bonfire.Common.Repo.checked_out?/0","doc":"","ref":"Bonfire.Common.Repo.html#checked_out?/0"},{"type":"function","title":"Bonfire.Common.Repo.checkout/2","doc":"","ref":"Bonfire.Common.Repo.html#checkout/2"},{"type":"function","title":"Bonfire.Common.Repo.child_spec/1","doc":"","ref":"Bonfire.Common.Repo.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Repo.config/0","doc":"","ref":"Bonfire.Common.Repo.html#config/0"},{"type":"function","title":"Bonfire.Common.Repo.default_options/1","doc":"","ref":"Bonfire.Common.Repo.html#default_options/1"},{"type":"function","title":"Bonfire.Common.Repo.default_repo_opts/0","doc":"","ref":"Bonfire.Common.Repo.html#default_repo_opts/0"},{"type":"function","title":"Bonfire.Common.Repo.delete/2","doc":"","ref":"Bonfire.Common.Repo.html#delete/2"},{"type":"function","title":"Bonfire.Common.Repo.delete!/2","doc":"","ref":"Bonfire.Common.Repo.html#delete!/2"},{"type":"function","title":"Bonfire.Common.Repo.delete_all/2","doc":"","ref":"Bonfire.Common.Repo.html#delete_all/2"},{"type":"function","title":"Bonfire.Common.Repo.delete_many/1","doc":"Execute a query to delete all matching records.","ref":"Bonfire.Common.Repo.html#delete_many/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.delete_many/1","doc":"iex> delete_many(from u in User, where: u.id < 100)\n {:ok, _count}","ref":"Bonfire.Common.Repo.html#delete_many/1-examples"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#disconnect_all/2"},{"type":"function","title":"Bonfire.Common.Repo.exists?/2","doc":"","ref":"Bonfire.Common.Repo.html#exists?/2"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#explain/3"},{"type":"function","title":"Bonfire.Common.Repo.fetch/2","doc":"Execute a query for one result where the primary key matches the given id, and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.Repo.html#fetch/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch/2","doc":"iex> fetch(User, 1)\n {:ok, %User{}}\n\n iex> fetch(User, 999)\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#fetch/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.fetch_all/2","doc":"Execute a query for multiple results given one or multiple IDs.","ref":"Bonfire.Common.Repo.html#fetch_all/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch_all/2","doc":"iex> fetch_all(User, [1, 2, 3])\n [%User{}, %User{}, %User{}]\n\n iex> fetch_all(User, 999)\n []","ref":"Bonfire.Common.Repo.html#fetch_all/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.fetch_by/2","doc":"Execute a query for one result (using a keyword list to specify the key/value to query with), and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.Repo.html#fetch_by/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.fetch_by/2","doc":"iex> fetch_by(User, name: \"Alice\")\n {:ok, %User{}}\n\n iex> fetch_by(User, name: \"Nonexistent\")\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#fetch_by/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.find/3","doc":"Like `single/1`, except on failure, adds an error to the changeset.","ref":"Bonfire.Common.Repo.html#find/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.find/3","doc":"iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 1, changeset)\n {:ok, %User{}}\n\n iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 999, changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.Repo.html#find/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.get/3","doc":"","ref":"Bonfire.Common.Repo.html#get/3"},{"type":"function","title":"Bonfire.Common.Repo.get!/3","doc":"","ref":"Bonfire.Common.Repo.html#get!/3"},{"type":"function","title":"Bonfire.Common.Repo.get_by/3","doc":"","ref":"Bonfire.Common.Repo.html#get_by/3"},{"type":"function","title":"Bonfire.Common.Repo.get_by!/3","doc":"","ref":"Bonfire.Common.Repo.html#get_by!/3"},{"type":"function","title":"Bonfire.Common.Repo.get_dynamic_repo/0","doc":"","ref":"Bonfire.Common.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Bonfire.Common.Repo.in_transaction?/0","doc":"","ref":"Bonfire.Common.Repo.html#in_transaction?/0"},{"type":"function","title":"Bonfire.Common.Repo.insert/2","doc":"","ref":"Bonfire.Common.Repo.html#insert/2"},{"type":"function","title":"Bonfire.Common.Repo.insert!/2","doc":"","ref":"Bonfire.Common.Repo.html#insert!/2"},{"type":"function","title":"Bonfire.Common.Repo.insert_all/3","doc":"","ref":"Bonfire.Common.Repo.html#insert_all/3"},{"type":"function","title":"Bonfire.Common.Repo.insert_all_or_ignore/2","doc":"Insert all or ignore a list of maps into a schema.","ref":"Bonfire.Common.Repo.html#insert_all_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_all_or_ignore/2","doc":"iex> insert_all_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#insert_all_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_ignore/1","doc":"Insert or ignore a changeset or struct into a schema.","ref":"Bonfire.Common.Repo.html#insert_or_ignore/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_or_ignore/1","doc":"iex> insert_or_ignore(%Ecto.Changeset{})\n {:ok, _result}\n\n iex> insert_or_ignore(%MySchema{field: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#insert_or_ignore/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_ignore/2","doc":"Insert or ignore a map (or iterate over a list of maps) into a schema.","ref":"Bonfire.Common.Repo.html#insert_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.insert_or_ignore/2","doc":"iex> insert_or_ignore(MySchema, %{field: \"value\"})\n [{:ok, _result}]\n\n iex> insert_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n [{:ok, _result}]","ref":"Bonfire.Common.Repo.html#insert_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_update/2","doc":"","ref":"Bonfire.Common.Repo.html#insert_or_update/2"},{"type":"function","title":"Bonfire.Common.Repo.insert_or_update!/2","doc":"","ref":"Bonfire.Common.Repo.html#insert_or_update!/2"},{"type":"function","title":"Bonfire.Common.Repo.load/2","doc":"","ref":"Bonfire.Common.Repo.html#load/2"},{"type":"function","title":"Bonfire.Common.Repo.make_subquery/1","doc":"","ref":"Bonfire.Common.Repo.html#make_subquery/1"},{"type":"function","title":"Bonfire.Common.Repo.many/2","doc":"Execute a query for multiple results and return the results.","ref":"Bonfire.Common.Repo.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.many/2","doc":"iex> many(from u in User)\n [%User{}, %User{}]\n\n iex> many(from u in User, return: :query)\n #Ecto.Query<...>","ref":"Bonfire.Common.Repo.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.many_paginated/3","doc":"Execute a query for multiple results and return one page of results.\nThis uses the main implementation for pagination, which is cursor-based and powered by the `Paginator` library.","ref":"Bonfire.Common.Repo.html#many_paginated/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.many_paginated/3","doc":"iex> many_paginated(User, [limit: 10])\n %Paginator.Page{}","ref":"Bonfire.Common.Repo.html#many_paginated/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.maybe_one/2","doc":"Execute a query for one result and return either a result or a fallback value (`nil` by default).","ref":"Bonfire.Common.Repo.html#maybe_one/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.maybe_one/2","doc":"iex> maybe_one(from u in User, where: u.id == 1)\n %User{}\n\n iex> maybe_one(from u in User, where: u.id == 999, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.Repo.html#maybe_one/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.maybe_preload/3","doc":"","ref":"Bonfire.Common.Repo.html#maybe_preload/3"},{"type":"function","title":"Bonfire.Common.Repo.maybe_where_ilike/5","doc":"Add an `ilike` clause to a query if the user query is safe.","ref":"Bonfire.Common.Repo.html#maybe_where_ilike/5"},{"type":"function","title":"Examples - Bonfire.Common.Repo.maybe_where_ilike/5","doc":"iex> maybe_where_ilike(Needle.Pointer, :id, \"Alice\")\n #Ecto.Query<...>\n\n iex> maybe_where_ilike(Needle.Pointer, :id, \"Al%ice\")\n Needle.Pointer \n # ^ unchanged due to unsafe query","ref":"Bonfire.Common.Repo.html#maybe_where_ilike/5-examples"},{"type":"function","title":"Bonfire.Common.Repo.migrate/0","doc":"","ref":"Bonfire.Common.Repo.html#migrate/0"},{"type":"function","title":"Bonfire.Common.Repo.one/2","doc":"","ref":"Bonfire.Common.Repo.html#one/2"},{"type":"function","title":"Bonfire.Common.Repo.one!/2","doc":"","ref":"Bonfire.Common.Repo.html#one!/2"},{"type":"function","title":"Bonfire.Common.Repo.paginate/2","doc":"Different implementation for pagination using Scrivener (used by eg. rauversion).","ref":"Bonfire.Common.Repo.html#paginate/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.paginate/2","doc":"iex> paginate(User, page: 1, page_size: 10)\n %Scrivener.Page{}","ref":"Bonfire.Common.Repo.html#paginate/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.pluck/3","doc":"Select and return only specific fields (specified as an atom or list of atoms)","ref":"Bonfire.Common.Repo.html#pluck/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.pluck/3","doc":"> pluck(:id)\n [id1, id2]\n\n > pluck([:id, :inserted_at])\n [%{id: id1, inserted_at: _}, %{id: id2, inserted_at: _}]","ref":"Bonfire.Common.Repo.html#pluck/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.preload/3","doc":"","ref":"Bonfire.Common.Repo.html#preload/3"},{"type":"function","title":"Bonfire.Common.Repo.preload_all/2","doc":"","ref":"Bonfire.Common.Repo.html#preload_all/2"},{"type":"function","title":"Bonfire.Common.Repo.preload_mixins/2","doc":"","ref":"Bonfire.Common.Repo.html#preload_mixins/2"},{"type":"function","title":"Bonfire.Common.Repo.prepare_query/3","doc":"","ref":"Bonfire.Common.Repo.html#prepare_query/3"},{"type":"function","title":"Bonfire.Common.Repo.put/1","doc":"Like `insert/1`, but understands remapping changeset errors to attr\nnames from config (and only config, no overrides at present!)","ref":"Bonfire.Common.Repo.html#put/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.put/1","doc":"iex> changeset = %Ecto.Changeset{valid?: false}\n iex> put(changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.Repo.html#put/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.put_dynamic_repo/1","doc":"","ref":"Bonfire.Common.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Bonfire.Common.Repo.put_many/1","doc":"Like `put/1` but for multiple `changesets`","ref":"Bonfire.Common.Repo.html#put_many/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.put_many/1","doc":"iex> changesets = [%{valid?: true}, %{valid?: false}]\n iex> put_many(changesets)\n {:error, [%{valid?: false}]}\n\n iex> changesets = [%{valid?: true}, %{valid?: true}]\n iex> put_many(changesets)\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#put_many/1-examples"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query!/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query_many/3"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#query_many!/3"},{"type":"function","title":"Bonfire.Common.Repo.reload/2","doc":"","ref":"Bonfire.Common.Repo.html#reload/2"},{"type":"function","title":"Bonfire.Common.Repo.reload!/2","doc":"","ref":"Bonfire.Common.Repo.html#reload!/2"},{"type":"function","title":"Bonfire.Common.Repo.rollback/1","doc":"","ref":"Bonfire.Common.Repo.html#rollback/1"},{"type":"function","title":"Bonfire.Common.Repo.single/1","doc":"Execute a query for one result and return either an `{:ok, result}` or `{:error, :not_found}` tuple.","ref":"Bonfire.Common.Repo.html#single/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.single/1","doc":"iex> single(from u in User, where: u.id == 1)\n {:ok, %User{}}\n\n iex> single(from u in User, where: u.id == 999)\n {:error, :not_found}","ref":"Bonfire.Common.Repo.html#single/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.sql/3","doc":"Executes raw SQL query.","ref":"Bonfire.Common.Repo.html#sql/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.sql/3","doc":"> YourModule.sql(\"SELECT * FROM pointers\")","ref":"Bonfire.Common.Repo.html#sql/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.start_link/1","doc":"","ref":"Bonfire.Common.Repo.html#start_link/1"},{"type":"function","title":"Bonfire.Common.Repo.stop/1","doc":"","ref":"Bonfire.Common.Repo.html#stop/1"},{"type":"function","title":"Bonfire.Common.Repo.stream/2","doc":"","ref":"Bonfire.Common.Repo.html#stream/2"},{"type":"function","title":"Bonfire.Common.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":"Bonfire.Common.Repo.html#to_sql/2"},{"type":"function","title":"Bonfire.Common.Repo.trace/1","doc":"Can be used to log specific queries (by calling function) in production.","ref":"Bonfire.Common.Repo.html#trace/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.trace/1","doc":"iex> trace(fn -> Repo.all(User) end)\n [%User{}, %User{}]","ref":"Bonfire.Common.Repo.html#trace/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.transact_many/1","doc":"","ref":"Bonfire.Common.Repo.html#transact_many/1"},{"type":"function","title":"Bonfire.Common.Repo.transact_with/2","doc":"Run a transaction, similar to `Repo.transaction/1`, but it expects an ok or error\ntuple. If an error tuple is returned, the transaction is aborted.","ref":"Bonfire.Common.Repo.html#transact_with/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.transact_with/2","doc":"iex> transact_with(fn -> {:ok, \"success\"} end)\n \"success\"\n\n iex> transact_with(fn -> {:error, \"failure\"} end)\n ** (Ecto.RollbackError) Rolling back the DB transaction, error reason: failure","ref":"Bonfire.Common.Repo.html#transact_with/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.transaction/2","doc":"","ref":"Bonfire.Common.Repo.html#transaction/2"},{"type":"function","title":"Bonfire.Common.Repo.update/2","doc":"","ref":"Bonfire.Common.Repo.html#update/2"},{"type":"function","title":"Bonfire.Common.Repo.update!/2","doc":"","ref":"Bonfire.Common.Repo.html#update!/2"},{"type":"function","title":"Bonfire.Common.Repo.update_all/3","doc":"","ref":"Bonfire.Common.Repo.html#update_all/3"},{"type":"function","title":"Bonfire.Common.Repo.upsert/3","doc":"Inserts or updates data in the database with upsert semantics.\n\n* `cs` - The changeset or schema to insert or update.\n* `keys_or_attrs_to_update` - A list of keys or a map of attributes to update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.Repo.html#upsert/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.upsert/3","doc":"iex> upsert(%Ecto.Changeset{}, [:field1, :field2])\n {:ok, _result}\n\n iex> upsert(%Ecto.Changeset{}, %{field1: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#upsert/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.upsert_all/3","doc":"Insert or update all entries with upsert semantics.\n\n* `schema` - The schema or table name to insert or update.\n* `data` - A list of maps containing the data to insert or update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.Repo.html#upsert_all/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.upsert_all/3","doc":"iex> upsert_all(User, [%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n {:ok, _result}\n\n iex> upsert_all(User, [%{id: 1, name: \"Alice Updated\"}], [:id])\n {:ok, _result}","ref":"Bonfire.Common.Repo.html#upsert_all/3-examples"},{"type":"module","title":"Bonfire.Common.Repo.Delete","doc":"Helpers for deleting Ecto data","ref":"Bonfire.Common.Repo.Delete.html"},{"type":"function","title":"Bonfire.Common.Repo.Delete.deletion_result/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#deletion_result/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.deletion_result!/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#deletion_result!/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.hard_delete/1","doc":"Actually deletes an entry from the database.","ref":"Bonfire.Common.Repo.Delete.html#hard_delete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.hard_delete/1","doc":"iex> hard_delete(some_entry)\n {:ok, some_entry}\n\n iex> hard_delete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#hard_delete/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.hard_delete!/1","doc":"Actually deletes an entry from the database, or throws an error.","ref":"Bonfire.Common.Repo.Delete.html#hard_delete!/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.hard_delete!/1","doc":"iex> hard_delete!(some_entry)\n some_entry\n\n iex> hard_delete!(non_existent_entry)\n ** (RuntimeError) :deletion_error","ref":"Bonfire.Common.Repo.Delete.html#hard_delete!/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.maybe_allow_delete?/2","doc":"","ref":"Bonfire.Common.Repo.Delete.html#maybe_allow_delete?/2"},{"type":"function","title":"Bonfire.Common.Repo.Delete.schema/1","doc":"","ref":"Bonfire.Common.Repo.Delete.html#schema/1"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete/1","doc":"Marks an entry as deleted in the database.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete/1","doc":"iex> soft_delete(some_entry)\n {:ok, some_entry}\n\n iex> soft_delete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#soft_delete/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete!/1","doc":"Marks an entry as deleted in the database or throws an error.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete!/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete!/1","doc":"iex> soft_delete!(some_entry)\n some_entry\n\n iex> soft_delete!(non_existent_entry)\n ** (RuntimeError) :deletion_error","ref":"Bonfire.Common.Repo.Delete.html#soft_delete!/1-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.soft_delete_changeset/4","doc":"Creates a changeset for marking an entity as deleted.","ref":"Bonfire.Common.Repo.Delete.html#soft_delete_changeset/4"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.soft_delete_changeset/4","doc":"iex> soft_delete_changeset(some_entry)\n %Ecto.Changeset{...}\n\n iex> soft_delete_changeset({SomeSchema, some_entry}, :deleted_at, nil, \"was already deleted\")\n %Ecto.Changeset{...}","ref":"Bonfire.Common.Repo.Delete.html#soft_delete_changeset/4-examples"},{"type":"function","title":"Bonfire.Common.Repo.Delete.undelete/1","doc":"Marks an entry as not deleted.","ref":"Bonfire.Common.Repo.Delete.html#undelete/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Delete.undelete/1","doc":"iex> undelete(some_entry)\n {:ok, some_entry}\n\n iex> undelete(non_existent_entry)\n {:error, :deletion_error}","ref":"Bonfire.Common.Repo.Delete.html#undelete/1-examples"},{"type":"module","title":"Bonfire.Common.Repo.Filter","doc":"`query_filter` brings convenience and shortens the boilterplate of ecto queries\n\nCommon filters available include:\n\n- `preload` - Preloads fields onto the query results\n- `start_date` - Query for items inserted after this date\n- `end_date` - Query for items inserted before this date\n- `before` - Get items with IDs before this value\n- `after` - Get items with IDs after this value\n- `ids` - Get items with a list of ids\n- `first` - Gets the first n items\n- `last` - Gets the last n items\n- `limit` - Gets the first n items\n- `offset` - Offsets limit by n items\n- `search` - ***Warning:*** This requires schemas using this to have a `&by_search(query, val)` function\n\nYou are also able to filter on any natural field of a model, as well as use\n\n- gte/gt\n- lte/lt\n- like/ilike\n- is_nil/not(is_nil)\n\n```elixir\nquery_filter(User, %{name: %{ilike: \"steve\"}})\nquery_filter(User, %{name: %{ilike: \"steve\"}}, :last_name, :asc)\nquery_filter(User, %{name: %{age: %{gte: 18, lte: 30}}})\nquery_filter(User, %{name: %{is_banned: %{!=: nil}}})\nquery_filter(User, %{name: %{is_banned: %{==: nil}}})\n\nmy_query = query_filter(User, %{name: \"Billy\"})\nquery_filter(my_query, %{last_name: \"Joe\"})\n```","ref":"Bonfire.Common.Repo.Filter.html"},{"type":"function","title":"Bonfire.Common.Repo.Filter.query_filter/4","doc":"","ref":"Bonfire.Common.Repo.Filter.html#query_filter/4"},{"type":"module","title":"Bonfire.Common.Repo.Preload","doc":"Helpers for preloading Ecto struct associations","ref":"Bonfire.Common.Repo.Preload.html"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preload/3","doc":"Conditionally preloads associations based on provided options.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preload/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preload/3","doc":"iex> maybe_preload(some_struct, [:assoc1, :assoc2])\n %{...}\n\n iex> maybe_preload({:ok, some_struct}, [:assoc1, :assoc2])\n {:ok, %{...}}","ref":"Bonfire.Common.Repo.Preload.html#maybe_preload/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preloads_per_nested_schema/4","doc":"Conditionally preloads associations for nested schemas.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_nested_schema/4"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preloads_per_nested_schema/4","doc":"iex> maybe_preloads_per_nested_schema(objects, path, preloads)\n [%{...}, %{...}]","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_nested_schema/4-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.maybe_preloads_per_schema/3","doc":"Conditionally preloads associations for a schema.","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_schema/3"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.maybe_preloads_per_schema/3","doc":"iex> maybe_preloads_per_schema(some_struct, {Schema, [:assoc1, :assoc2]})\n\n iex> maybe_preloads_per_schema(pointer_struct, {PointerSchema, [:assoc1, :assoc2]})","ref":"Bonfire.Common.Repo.Preload.html#maybe_preloads_per_schema/3-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.preload_all/2","doc":"Preloads all associations for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#preload_all/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.preload_all/2","doc":"iex> preload_all(some_struct)","ref":"Bonfire.Common.Repo.Preload.html#preload_all/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.preload_mixins/2","doc":"Preloads mixin associations for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#preload_mixins/2"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.preload_mixins/2","doc":"iex> preload_mixins(some_struct)","ref":"Bonfire.Common.Repo.Preload.html#preload_mixins/2-examples"},{"type":"function","title":"Bonfire.Common.Repo.Preload.schema_mixins/1","doc":"Retrieves schema mixins for a given Ecto struct.","ref":"Bonfire.Common.Repo.Preload.html#schema_mixins/1"},{"type":"function","title":"Examples - Bonfire.Common.Repo.Preload.schema_mixins/1","doc":"iex> schema_mixins(some_struct)\n [:assoc1, :assoc2]","ref":"Bonfire.Common.Repo.Preload.html#schema_mixins/1-examples"},{"type":"module","title":"Bonfire.Common.Repo.Utils","doc":"Helper functions for changesets","ref":"Bonfire.Common.Repo.Utils.html"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_disabled/1","doc":"Keeps disabled_at in accord with is_disabled","ref":"Bonfire.Common.Repo.Utils.html#change_disabled/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_muted/1","doc":"Keeps muted_at in accord with is_muted","ref":"Bonfire.Common.Repo.Utils.html#change_muted/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_public/1","doc":"Keeps published_at in accord with is_public","ref":"Bonfire.Common.Repo.Utils.html#change_public/1"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_synced_timestamp/3","doc":"If a changeset includes a change to `bool_field`, we ensure that the\n`timestamp` field is updated if required. In the case of true, this\nmeans setting it to now if it is null and in the case of false, this\nmeans setting it to null if it is not null.","ref":"Bonfire.Common.Repo.Utils.html#change_synced_timestamp/3"},{"type":"function","title":"Bonfire.Common.Repo.Utils.change_synced_timestamps/5","doc":"If a changeset includes a change to `bool_field`, we change two\ntimestamps columns (representing activated and deactivated) so that\nonly one is set to a non-null value at a time.","ref":"Bonfire.Common.Repo.Utils.html#change_synced_timestamps/5"},{"type":"macro","title":"Bonfire.Common.Repo.Utils.match_admin/0","doc":"","ref":"Bonfire.Common.Repo.Utils.html#match_admin/0"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_email/2","doc":"Validates an email for correctness","ref":"Bonfire.Common.Repo.Utils.html#validate_email/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_email_domain/2","doc":"","ref":"Bonfire.Common.Repo.Utils.html#validate_email_domain/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_exactly_one/3","doc":"","ref":"Bonfire.Common.Repo.Utils.html#validate_exactly_one/3"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_http_url/2","doc":"Validates that a URL uses HTTP(S) and has a correct format.","ref":"Bonfire.Common.Repo.Utils.html#validate_http_url/2"},{"type":"function","title":"Bonfire.Common.Repo.Utils.validate_not_expired/4","doc":"Validates that the entity has not expired","ref":"Bonfire.Common.Repo.Utils.html#validate_not_expired/4"},{"type":"module","title":"Bonfire.Common.RepoTemplate","doc":"Common functions useful in Ecto Repos","ref":"Bonfire.Common.RepoTemplate.html"},{"type":"module","title":"Bonfire.Common.RuntimeConfig","doc":"Config and helpers for this library","ref":"Bonfire.Common.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.skip_test_tags/1","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#skip_test_tags/1"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.test_formatters/0","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#test_formatters/0"},{"type":"function","title":"Bonfire.Common.RuntimeConfig.test_formatters/1","doc":"","ref":"Bonfire.Common.RuntimeConfig.html#test_formatters/1"},{"type":"behaviour","title":"Bonfire.Common.SchemaModule","doc":"Find a context or query module via its schema, backed by a global cache of known schema modules to be queried by their schema, or vice versa (eg. via ContextModule).","ref":"Bonfire.Common.SchemaModule.html"},{"type":"function","title":"Bonfire.Common.SchemaModule.app_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#app_modules/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.context_module/0","doc":"Points to the related context module","ref":"Bonfire.Common.SchemaModule.html#c:context_module/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.linked_context_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#linked_context_modules/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.linked_query_modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#linked_query_modules/0"},{"type":"function","title":"Bonfire.Common.SchemaModule.modules/0","doc":"","ref":"Bonfire.Common.SchemaModule.html#modules/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.query_module/0","doc":"Points to the related query module","ref":"Bonfire.Common.SchemaModule.html#c:query_module/0"},{"type":"callback","title":"Bonfire.Common.SchemaModule.schema_module/0","doc":"Declares a schema module","ref":"Bonfire.Common.SchemaModule.html#c:schema_module/0"},{"type":"module","title":"Bonfire.Common.Settings","doc":"Helpers to get app/extension settings, or to override a config key.\n\nThis module provides functionality for fetching and updating application and extension settings. The process for fetching settings follows a bottom-up system of overrides:\n\n1. **User-specific settings:** \n If `opts` contains `current_user`, settings are fetched from the user's settings.\n\n2. **Account-specific settings:** \n If no settings are found for the user and `opts` contains `current_account`, settings are fetched from the account's settings.\n\n3. **Instance-specific settings:** \n NOTE: Changes to instance settings are stored both in the database and the OTP app config/application environment, and are loaded from the DB into OTP config at app startup by `Bonfire.Common.Settings.LoadInstanceConfig`.\n\n4. **Default OTP config:** \n If no settings are found at the user or account level, instance settings are loaded from OTP application configuration via `Bonfire.Common.Config`.\n\n5. **Default value:** \n If no settings are found in the previous steps, the provided `default` value is returned.","ref":"Bonfire.Common.Settings.html"},{"type":"function","title":"Bonfire.Common.Settings.do_get_in/2","doc":"","ref":"Bonfire.Common.Settings.html#do_get_in/2"},{"type":"function","title":"Bonfire.Common.Settings.get/3","doc":"Retrieves the setting value for a given config key or nested key path.\n\nAs explained above, this function checks settings in the following order:\n1. **User settings** (if `opts` contains `current_user`).\n2. **Account settings** (if `opts` contains `current_account` and no user settings are found).\n3. **Instance settings**.\n4. **OTP application config (includes compile time and runtime config)**.\n5. **Default value** (if no settings are found).","ref":"Bonfire.Common.Settings.html#get/3"},{"type":"function","title":"Examples - Bonfire.Common.Settings.get/3","doc":"iex> get(:test_key)\n \"test_value\"\n\n iex> get([:non_existing_extension, :sub_key])\n nil\n\n iex> get(:non_existing_key, \"default\")\n \"default\"\n\n iex> get(:otp_app)\n :bonfire\n\n iex> get([:bonfire_common, :otp_app])\n :bonfire\n \n iex> get([:bonfire_common, :otp_app])\n :bonfire\n\n iex> get([Bonfire.Common.Localise.Cldr, :gettext])\n Bonfire.Common.Localise.Gettext\n\n iex> get([:bonfire_common, Bonfire.Common.Localise.Cldr, :gettext])\n Bonfire.Common.Localise.Gettext","ref":"Bonfire.Common.Settings.html#get/3-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.get/3","doc":"* `:otp_app` - Optionally specifies the OTP application for which to fetch settings. If none is specified, it will look at the (first) key and check if it references a known OTP application (i.e. an extension) or a module, in which case it will fetch settings from that application. Otherwise it will look in the configured top-level OTP app (see `Config.top_level_otp_app/0`). \n * `:scope` - Optionally defines the scope for settings retrieval (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#get/3-options"},{"type":"function","title":"Bonfire.Common.Settings.get!/2","doc":"Retrieves the setting value for a given config key like in `get/3`, but raises an exception if the key is not found, ensuring that the setting must be present.","ref":"Bonfire.Common.Settings.html#get!/2"},{"type":"function","title":"Examples - Bonfire.Common.Settings.get!/2","doc":"iex> get!(:test_key)\n \"test_value\"\n\n iex> get!(:non_existing_key)\n ** (RuntimeError) Missing setting or configuration value: :non_existing_key","ref":"Bonfire.Common.Settings.html#get!/2-examples"},{"type":"function","title":"Bonfire.Common.Settings.get_for_process/1","doc":"","ref":"Bonfire.Common.Settings.html#get_for_process/1"},{"type":"function","title":"Bonfire.Common.Settings.get_settings/4","doc":"","ref":"Bonfire.Common.Settings.html#get_settings/4"},{"type":"function","title":"Bonfire.Common.Settings.load_instance_settings/0","doc":"","ref":"Bonfire.Common.Settings.html#load_instance_settings/0"},{"type":"function","title":"Bonfire.Common.Settings.put/3","doc":"Sets a value for a specific key or list of nested keys.\n\nThis function updates the configuration with the provided value. You can specify a single key or a list of nested keys.","ref":"Bonfire.Common.Settings.html#put/3"},{"type":"function","title":"Examples - Bonfire.Common.Settings.put/3","doc":"# when no scope or current_user are passed in opts:\n > put(:some_key, \"new_value\")\n {:error, \"You need to be authenticated to change settings.\"}\n\n # when the scope is :instance but an admin isn't passed as current_user in opts:\n > put(:some_key, \"new_value\", scope: :instance)\n ** (Bonfire.Fail) You do not have permission to change instance settings. Please contact an admin.\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = put(:some_key, \"new_value\", skip_boundary_check: true, scope: :instance)\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = put([:top_key, :sub_key], \"new_value\", skip_boundary_check: true, scope: \"instance\")","ref":"Bonfire.Common.Settings.html#put/3-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.put/3","doc":"* `:otp_app` - Specifies the OTP application for which to set settings. If not specified, it decides where to put it using the same logic as `get/3`.\n * `:scope` - Defines the scope for settings (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#put/3-options"},{"type":"function","title":"Bonfire.Common.Settings.reset_all/0","doc":"Resets all settings.\n\nThis function deletes all settings from the database, including instance-specific settings and user-specific settings for all users. Please be careful!","ref":"Bonfire.Common.Settings.html#reset_all/0"},{"type":"function","title":"Examples - Bonfire.Common.Settings.reset_all/0","doc":"> reset_all()\n {:ok, %{}}","ref":"Bonfire.Common.Settings.html#reset_all/0-examples"},{"type":"function","title":"Bonfire.Common.Settings.reset_instance/0","doc":"Resets settings for the instance scope.\n\nThis function deletes the settings associated with the whole instance and returns the result.","ref":"Bonfire.Common.Settings.html#reset_instance/0"},{"type":"function","title":"Examples - Bonfire.Common.Settings.reset_instance/0","doc":"> reset_instance()\n {:ok, %Bonfire.Data.Identity.Settings{id: \"some_id\"}}","ref":"Bonfire.Common.Settings.html#reset_instance/0-examples"},{"type":"function","title":"Bonfire.Common.Settings.set/2","doc":"Sets multiple settings at once.\n\nThis function accepts a map or keyword list of settings to be updated. It determines the appropriate scope and updates the settings accordingly.","ref":"Bonfire.Common.Settings.html#set/2"},{"type":"function","title":"Examples - Bonfire.Common.Settings.set/2","doc":"> {:ok, %Bonfire.Data.Identity.Settings{}} = set(%{some_key: \"value\", another_key: \"another_value\"}, skip_boundary_check: true, scope: :instance)\n\n > {:ok, %Bonfire.Data.Identity.Settings{}} = set([some_key: \"value\", another_key: \"another_value\"], skip_boundary_check: true, scope: \"instance\")","ref":"Bonfire.Common.Settings.html#set/2-examples"},{"type":"function","title":"Options - Bonfire.Common.Settings.set/2","doc":"* `:otp_app` - Specifies the OTP application for which to set settings.\n * `:scope` - Defines the scope for settings (e.g., `:user`, `:account`, or `:instance`).","ref":"Bonfire.Common.Settings.html#set/2-options"},{"type":"module","title":"Bonfire.Common.Settings.LiveHandler","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.input_name/1","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#input_name/1"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.maybe_assign_input_value_from_keys/1","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#maybe_assign_input_value_from_keys/1"},{"type":"function","title":"Bonfire.Common.Settings.LiveHandler.scoped/2","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#scoped/2"},{"type":"macro","title":"Bonfire.Common.Settings.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Common.Settings.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Common.Settings.LoadInstanceConfig","doc":"Loads instance Settings (see `Bonfire.Common.Settings`) from DB into OTP config / application env (see `Bonfire.Common.Config`)\n\nWhile this module is a GenServer, it is only responsible for querying the settings, putting them in Config, and then exits with :ignore having done so.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.load_config/0","doc":"","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#load_config/0"},{"type":"function","title":"Bonfire.Common.Settings.LoadInstanceConfig.start_link/1","doc":"Populates the global cache with table data via introspection.","ref":"Bonfire.Common.Settings.LoadInstanceConfig.html#start_link/1"},{"type":"module","title":"Bonfire.Common.Simulation","doc":"Fake data generators","ref":"Bonfire.Common.Simulation.html"},{"type":"function","title":"Bonfire.Common.Simulation.ap_url_base/0","doc":"Picks a unique random url for an ap endpoint","ref":"Bonfire.Common.Simulation.html#ap_url_base/0"},{"type":"function","title":"Bonfire.Common.Simulation.base64/0","doc":"Generates random base64 text","ref":"Bonfire.Common.Simulation.html#base64/0"},{"type":"function","title":"Bonfire.Common.Simulation.bool/0","doc":"Generates a random boolean","ref":"Bonfire.Common.Simulation.html#bool/0"},{"type":"function","title":"Bonfire.Common.Simulation.canonical_url/0","doc":"Picks a random canonical url and makes it unique","ref":"Bonfire.Common.Simulation.html#canonical_url/0"},{"type":"function","title":"Bonfire.Common.Simulation.content_type/0","doc":"Generate a random content type","ref":"Bonfire.Common.Simulation.html#content_type/0"},{"type":"function","title":"Bonfire.Common.Simulation.content_url/0","doc":"Picks a remote url from a set of available ones.","ref":"Bonfire.Common.Simulation.html#content_url/0"},{"type":"function","title":"Bonfire.Common.Simulation.date_of_birth/0","doc":"Generates a random date of birth based on an age range of 18-99","ref":"Bonfire.Common.Simulation.html#date_of_birth/0"},{"type":"function","title":"Bonfire.Common.Simulation.domain/0","doc":"Generates a random domain name","ref":"Bonfire.Common.Simulation.html#domain/0"},{"type":"function","title":"Bonfire.Common.Simulation.email/0","doc":"Generates a random unique email","ref":"Bonfire.Common.Simulation.html#email/0"},{"type":"function","title":"Bonfire.Common.Simulation.email_user/0","doc":"Generates the first half of an email address","ref":"Bonfire.Common.Simulation.html#email_user/0"},{"type":"function","title":"Bonfire.Common.Simulation.falsehood/0","doc":"Returns false","ref":"Bonfire.Common.Simulation.html#falsehood/0"},{"type":"function","title":"Bonfire.Common.Simulation.float/0","doc":"Generate a random floating point number","ref":"Bonfire.Common.Simulation.html#float/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_date/0","doc":"Picks a date up to 300 days in the future, not including today","ref":"Bonfire.Common.Simulation.html#future_date/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_datetime/0","doc":"Picks a datetime up to 300 days in the future, not including today","ref":"Bonfire.Common.Simulation.html#future_datetime/0"},{"type":"function","title":"Bonfire.Common.Simulation.future_datetime_iso/0","doc":"Same as future_datetime, but as an ISO8601 formatted string.","ref":"Bonfire.Common.Simulation.html#future_datetime_iso/0"},{"type":"function","title":"Bonfire.Common.Simulation.icon/0","doc":"Picks an icon url","ref":"Bonfire.Common.Simulation.html#icon/0"},{"type":"function","title":"Bonfire.Common.Simulation.image/0","doc":"Picks an image url","ref":"Bonfire.Common.Simulation.html#image/0"},{"type":"function","title":"Bonfire.Common.Simulation.integer/0","doc":"Generate a random signed integer","ref":"Bonfire.Common.Simulation.html#integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.license/0","doc":"A random license for content","ref":"Bonfire.Common.Simulation.html#license/0"},{"type":"function","title":"Bonfire.Common.Simulation.location/0","doc":"Returns a city and country","ref":"Bonfire.Common.Simulation.html#location/0"},{"type":"function","title":"Bonfire.Common.Simulation.long_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#long_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.long_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#long_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.markdown/0","doc":"","ref":"Bonfire.Common.Simulation.html#markdown/0"},{"type":"function","title":"Bonfire.Common.Simulation.maybe_bool/0","doc":"Generate a random boolean that can also be nil","ref":"Bonfire.Common.Simulation.html#maybe_bool/0"},{"type":"function","title":"Bonfire.Common.Simulation.maybe_one_of/1","doc":"","ref":"Bonfire.Common.Simulation.html#maybe_one_of/1"},{"type":"function","title":"Bonfire.Common.Simulation.med_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#med_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.med_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#med_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.name/0","doc":"Picks a name","ref":"Bonfire.Common.Simulation.html#name/0"},{"type":"function","title":"Bonfire.Common.Simulation.neg_integer/0","doc":"Generate a random negative integer","ref":"Bonfire.Common.Simulation.html#neg_integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.one_of/1","doc":"","ref":"Bonfire.Common.Simulation.html#one_of/1"},{"type":"function","title":"Bonfire.Common.Simulation.paragraph/0","doc":"Generates a random paragraph","ref":"Bonfire.Common.Simulation.html#paragraph/0"},{"type":"function","title":"Bonfire.Common.Simulation.password/0","doc":"Generates a random password string","ref":"Bonfire.Common.Simulation.html#password/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_date/0","doc":"Picks a date up to 300 days in the past, not including today","ref":"Bonfire.Common.Simulation.html#past_date/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_datetime/0","doc":"Picks a datetime up to 300 days in the past, not including today","ref":"Bonfire.Common.Simulation.html#past_datetime/0"},{"type":"function","title":"Bonfire.Common.Simulation.past_datetime_iso/0","doc":"Same as past_datetime, but as an ISO8601 formatted string.","ref":"Bonfire.Common.Simulation.html#past_datetime_iso/0"},{"type":"function","title":"Bonfire.Common.Simulation.path/0","doc":"Picks a path from a set of available files.","ref":"Bonfire.Common.Simulation.html#path/0"},{"type":"function","title":"Bonfire.Common.Simulation.pos_integer/0","doc":"Generate a random positive integer","ref":"Bonfire.Common.Simulation.html#pos_integer/0"},{"type":"function","title":"Bonfire.Common.Simulation.preferred_username/0","doc":"Picks a unique preferred_username","ref":"Bonfire.Common.Simulation.html#preferred_username/0"},{"type":"function","title":"Bonfire.Common.Simulation.short_count/0","doc":"","ref":"Bonfire.Common.Simulation.html#short_count/0"},{"type":"function","title":"Bonfire.Common.Simulation.short_list/1","doc":"","ref":"Bonfire.Common.Simulation.html#short_list/1"},{"type":"function","title":"Bonfire.Common.Simulation.signing_key/0","doc":"Picks a fake signing key","ref":"Bonfire.Common.Simulation.html#signing_key/0"},{"type":"function","title":"Bonfire.Common.Simulation.some/2","doc":"Repeats a function count times if count_or_range is a positive integer.\n\nIf count_or_range is a positive range, a random number from this\nrange is selected and that value used as a count","ref":"Bonfire.Common.Simulation.html#some/2"},{"type":"function","title":"Bonfire.Common.Simulation.summary/0","doc":"Picks a summary text paragraph","ref":"Bonfire.Common.Simulation.html#summary/0"},{"type":"function","title":"Bonfire.Common.Simulation.title/0","doc":"","ref":"Bonfire.Common.Simulation.html#title/0"},{"type":"function","title":"Bonfire.Common.Simulation.truth/0","doc":"Returns true","ref":"Bonfire.Common.Simulation.html#truth/0"},{"type":"function","title":"Bonfire.Common.Simulation.uid/1","doc":"Generates a random unique ID, optionally for a specific schema","ref":"Bonfire.Common.Simulation.html#uid/1"},{"type":"function","title":"Bonfire.Common.Simulation.ulid/0","doc":"Generates a random unique ULID","ref":"Bonfire.Common.Simulation.html#ulid/0"},{"type":"function","title":"Bonfire.Common.Simulation.url/0","doc":"Generates a random url","ref":"Bonfire.Common.Simulation.html#url/0"},{"type":"function","title":"Bonfire.Common.Simulation.username/0","doc":"Generates a random username","ref":"Bonfire.Common.Simulation.html#username/0"},{"type":"function","title":"Bonfire.Common.Simulation.uuid/0","doc":"Generates a random unique UUID","ref":"Bonfire.Common.Simulation.html#uuid/0"},{"type":"function","title":"Bonfire.Common.Simulation.verb/0","doc":"A verb to be used for an activity.","ref":"Bonfire.Common.Simulation.html#verb/0"},{"type":"function","title":"Bonfire.Common.Simulation.website/0","doc":"A website address","ref":"Bonfire.Common.Simulation.html#website/0"},{"type":"module","title":"Bonfire.Common.StartupTimer","doc":"Open the console without starting the app: `iex -S mix run --no-start` or `just imix run --no-start`\n\nAnd then run `Bonfire.Common.StartupTimer.run()`","ref":"Bonfire.Common.StartupTimer.html"},{"type":"function","title":"Bonfire.Common.StartupTimer.run/1","doc":"","ref":"Bonfire.Common.StartupTimer.html#run/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive","doc":"This utility allows to get the same effect of using\n`fcwatch | mix test --stale --listen-on-stdin` to watch for\ncode changes and run stale tests, but with more control and\nwithout the starting time penalty.\n\nNote that watching requires fswatch on your system.\nEg on Mac run `brew install fswatch`.\n\nTo use it, in your project's `.iex` file add:\n```\nunless GenServer.whereis(Bonfire.Common.Test.Interactive) do\n {:ok, pid} = Bonfire.Common.Test.Interactive.start_link()\n # Process will not exit when the iex goes out\n Process.unlink(pid)\nend\nimport Bonfire.Common.Test.Interactive.Helpers\n```\nThen to call `iex` and run tests just do:\n```\nMIX_ENV=test iex -S mix\n```\nThe `Bonfire.Common.Test.Interactive.Helpers` allows to call `f` and `s` and `a`\nto run failed, stale and all tests respectively.\nYou can call `w` to watch tests and `uw` to unwatch.\nThere is a really simple throttle mecanism that disallow running the suite concurrently.","ref":"Bonfire.Common.Test.Interactive.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Test.Interactive.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_all_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_all_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_failed_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_failed_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.run_stale_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#run_stale_tests/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.setup_test_repo/1","doc":"Sets up database options for tests\n\nYou can tell a specific test to not wrap in a transaction and rollback with:\n`@tag db_sandbox: false`","ref":"Bonfire.Common.Test.Interactive.html#setup_test_repo/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.start_link/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#start_link/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.unlock/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#unlock/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.unwatch_tests/0","doc":"","ref":"Bonfire.Common.Test.Interactive.html#unwatch_tests/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.watch_tests/1","doc":"","ref":"Bonfire.Common.Test.Interactive.html#watch_tests/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive.Helpers","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.f/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#f/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.ready/0","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#ready/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.s/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#s/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.ta/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#ta/1"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.uw/0","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#uw/0"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Helpers.w/1","doc":"","ref":"Bonfire.Common.Test.Interactive.Helpers.html#w/1"},{"type":"module","title":"Bonfire.Common.Test.Interactive.Observer","doc":"","ref":"Bonfire.Common.Test.Interactive.Observer.html"},{"type":"function","title":"Bonfire.Common.Test.Interactive.Observer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Common.Test.Interactive.Observer.html#child_spec/1"},{"type":"module","title":"Bonfire.Common.TestInstanceRepo","doc":"Special Ecto Repo used for federation testing.\n\nNote: more generic functions are defined in `Bonfire.Common.RepoTemplate`","ref":"Bonfire.Common.TestInstanceRepo.html"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.aggregate/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#aggregate/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.aggregate/4","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#aggregate/4"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.apply/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#apply/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.checked_out?/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#checked_out?/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.checkout/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#checkout/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.child_spec/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#child_spec/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.config/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#config/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_endpoint/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_endpoint/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_options/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_options/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_repo/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_repo/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.default_repo_opts/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#default_repo_opts/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete_all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#delete_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.delete_many/1","doc":"Execute a query to delete all matching records.","ref":"Bonfire.Common.TestInstanceRepo.html#delete_many/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.delete_many/1","doc":"iex> delete_many(from u in User, where: u.id < 100)\n {:ok, _count}","ref":"Bonfire.Common.TestInstanceRepo.html#delete_many/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#disconnect_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.exists?/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#exists?/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#explain/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch/2","doc":"Execute a query for one result where the primary key matches the given id, and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch/2","doc":"iex> fetch(User, 1)\n {:ok, %User{}}\n\n iex> fetch(User, 999)\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#fetch/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch_all/2","doc":"Execute a query for multiple results given one or multiple IDs.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_all/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch_all/2","doc":"iex> fetch_all(User, [1, 2, 3])\n [%User{}, %User{}, %User{}]\n\n iex> fetch_all(User, 999)\n []","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_all/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.fetch_by/2","doc":"Execute a query for one result (using a keyword list to specify the key/value to query with), and return either an {:ok, result} tuple or a {:error, :not_found}.","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_by/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.fetch_by/2","doc":"iex> fetch_by(User, name: \"Alice\")\n {:ok, %User{}}\n\n iex> fetch_by(User, name: \"Nonexistent\")\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#fetch_by/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.find/3","doc":"Like `single/1`, except on failure, adds an error to the changeset.","ref":"Bonfire.Common.TestInstanceRepo.html#find/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.find/3","doc":"iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 1, changeset)\n {:ok, %User{}}\n\n iex> changeset = %Ecto.Changeset{}\n iex> find(from u in User, where: u.id == 999, changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.TestInstanceRepo.html#find/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get!/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_by/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_by/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_by!/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_by!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.get_dynamic_repo/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.in_transaction?/0","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#in_transaction?/0"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_all/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_all_or_ignore/2","doc":"Insert all or ignore a list of maps into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_all_or_ignore/2","doc":"iex> insert_all_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#insert_all_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_ignore/1","doc":"Insert or ignore a changeset or struct into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_or_ignore/1","doc":"iex> insert_or_ignore(%Ecto.Changeset{})\n {:ok, _result}\n\n iex> insert_or_ignore(%MySchema{field: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_ignore/2","doc":"Insert or ignore a map (or iterate over a list of maps) into a schema.","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.insert_or_ignore/2","doc":"iex> insert_or_ignore(MySchema, %{field: \"value\"})\n [{:ok, _result}]\n\n iex> insert_or_ignore(MySchema, [%{field: \"value1\"}, %{field: \"value2\"}])\n [{:ok, _result}]","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_ignore/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_update/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_update/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.insert_or_update!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#insert_or_update!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.load/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#load/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.make_subquery/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#make_subquery/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.many/2","doc":"Execute a query for multiple results and return the results.","ref":"Bonfire.Common.TestInstanceRepo.html#many/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.many/2","doc":"iex> many(from u in User)\n [%User{}, %User{}]\n\n iex> many(from u in User, return: :query)\n #Ecto.Query<...>","ref":"Bonfire.Common.TestInstanceRepo.html#many/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.many_paginated/3","doc":"Execute a query for multiple results and return one page of results.\nThis uses the main implementation for pagination, which is cursor-based and powered by the `Paginator` library.","ref":"Bonfire.Common.TestInstanceRepo.html#many_paginated/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.many_paginated/3","doc":"iex> many_paginated(User, [limit: 10])\n %Paginator.Page{}","ref":"Bonfire.Common.TestInstanceRepo.html#many_paginated/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_declare_test_instance/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_declare_test_instance/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_one/2","doc":"Execute a query for one result and return either a result or a fallback value (`nil` by default).","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_one/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.maybe_one/2","doc":"iex> maybe_one(from u in User, where: u.id == 1)\n %User{}\n\n iex> maybe_one(from u in User, where: u.id == 999, \"fallback\")\n \"fallback\"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_one/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_preload/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_preload/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.maybe_where_ilike/5","doc":"Add an `ilike` clause to a query if the user query is safe.","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_where_ilike/5"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.maybe_where_ilike/5","doc":"iex> maybe_where_ilike(Needle.Pointer, :id, \"Alice\")\n #Ecto.Query<...>\n\n iex> maybe_where_ilike(Needle.Pointer, :id, \"Al%ice\")\n Needle.Pointer \n # ^ unchanged due to unsafe query","ref":"Bonfire.Common.TestInstanceRepo.html#maybe_where_ilike/5-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.one/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#one/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.one!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#one!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.paginate/2","doc":"Different implementation for pagination using Scrivener (used by eg. rauversion).","ref":"Bonfire.Common.TestInstanceRepo.html#paginate/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.paginate/2","doc":"iex> paginate(User, page: 1, page_size: 10)\n %Scrivener.Page{}","ref":"Bonfire.Common.TestInstanceRepo.html#paginate/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.pluck/3","doc":"Select and return only specific fields (specified as an atom or list of atoms)","ref":"Bonfire.Common.TestInstanceRepo.html#pluck/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.pluck/3","doc":"> pluck(:id)\n [id1, id2]\n\n > pluck([:id, :inserted_at])\n [%{id: id1, inserted_at: _}, %{id: id2, inserted_at: _}]","ref":"Bonfire.Common.TestInstanceRepo.html#pluck/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload_all/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload_all/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.preload_mixins/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#preload_mixins/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.prepare_query/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#prepare_query/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.process_put/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#process_put/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put/1","doc":"Like `insert/1`, but understands remapping changeset errors to attr\nnames from config (and only config, no overrides at present!)","ref":"Bonfire.Common.TestInstanceRepo.html#put/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.put/1","doc":"iex> changeset = %Ecto.Changeset{valid?: false}\n iex> put(changeset)\n {:error, %Ecto.Changeset{}}","ref":"Bonfire.Common.TestInstanceRepo.html#put/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put_dynamic_repo/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.put_many/1","doc":"Like `put/1` but for multiple `changesets`","ref":"Bonfire.Common.TestInstanceRepo.html#put_many/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.put_many/1","doc":"iex> changesets = [%{valid?: true}, %{valid?: false}]\n iex> put_many(changesets)\n {:error, [%{valid?: false}]}\n\n iex> changesets = [%{valid?: true}, %{valid?: true}]\n iex> put_many(changesets)\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#put_many/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query_many/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#query_many!/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.reload/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#reload/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.reload!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#reload!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.rollback/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#rollback/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.single/1","doc":"Execute a query for one result and return either an `{:ok, result}` or `{:error, :not_found}` tuple.","ref":"Bonfire.Common.TestInstanceRepo.html#single/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.single/1","doc":"iex> single(from u in User, where: u.id == 1)\n {:ok, %User{}}\n\n iex> single(from u in User, where: u.id == 999)\n {:error, :not_found}","ref":"Bonfire.Common.TestInstanceRepo.html#single/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.sql/3","doc":"Executes raw SQL query.","ref":"Bonfire.Common.TestInstanceRepo.html#sql/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.sql/3","doc":"> YourModule.sql(\"SELECT * FROM pointers\")","ref":"Bonfire.Common.TestInstanceRepo.html#sql/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.start_link/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#start_link/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.stop/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#stop/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.stream/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#stream/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.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":"Bonfire.Common.TestInstanceRepo.html#to_sql/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.trace/1","doc":"Can be used to log specific queries (by calling function) in production.","ref":"Bonfire.Common.TestInstanceRepo.html#trace/1"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.trace/1","doc":"iex> trace(fn -> Repo.all(User) end)\n [%User{}, %User{}]","ref":"Bonfire.Common.TestInstanceRepo.html#trace/1-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transact_many/1","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#transact_many/1"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transact_with/2","doc":"Run a transaction, similar to `Repo.transaction/1`, but it expects an ok or error\ntuple. If an error tuple is returned, the transaction is aborted.","ref":"Bonfire.Common.TestInstanceRepo.html#transact_with/2"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.transact_with/2","doc":"iex> transact_with(fn -> {:ok, \"success\"} end)\n \"success\"\n\n iex> transact_with(fn -> {:error, \"failure\"} end)\n ** (Ecto.RollbackError) Rolling back the DB transaction, error reason: failure","ref":"Bonfire.Common.TestInstanceRepo.html#transact_with/2-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.transaction/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#transaction/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update!/2","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update!/2"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.update_all/3","doc":"","ref":"Bonfire.Common.TestInstanceRepo.html#update_all/3"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.upsert/3","doc":"Inserts or updates data in the database with upsert semantics.\n\n* `cs` - The changeset or schema to insert or update.\n* `keys_or_attrs_to_update` - A list of keys or a map of attributes to update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.TestInstanceRepo.html#upsert/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.upsert/3","doc":"iex> upsert(%Ecto.Changeset{}, [:field1, :field2])\n {:ok, _result}\n\n iex> upsert(%Ecto.Changeset{}, %{field1: \"value\"})\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#upsert/3-examples"},{"type":"function","title":"Bonfire.Common.TestInstanceRepo.upsert_all/3","doc":"Insert or update all entries with upsert semantics.\n\n* `schema` - The schema or table name to insert or update.\n* `data` - A list of maps containing the data to insert or update.\n* `conflict_target` - The column(s) or constraint to check for conflicts, defaults to `[:id]`.","ref":"Bonfire.Common.TestInstanceRepo.html#upsert_all/3"},{"type":"function","title":"Examples - Bonfire.Common.TestInstanceRepo.upsert_all/3","doc":"iex> upsert_all(User, [%{id: 1, name: \"Alice\"}, %{id: 2, name: \"Bob\"}])\n {:ok, _result}\n\n iex> upsert_all(User, [%{id: 1, name: \"Alice Updated\"}], [:id])\n {:ok, _result}","ref":"Bonfire.Common.TestInstanceRepo.html#upsert_all/3-examples"},{"type":"module","title":"Bonfire.Common.Text","doc":"Helpers for handling plain or rich text (markdown, HTML, etc)","ref":"Bonfire.Common.Text.html"},{"type":"function","title":"Bonfire.Common.Text.blank?/1","doc":"Checks if a string is blank.","ref":"Bonfire.Common.Text.html#blank?/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.blank?/1","doc":"iex> blank?(nil)\n true\n\n iex> blank?(\" \")\n true\n\n iex> blank?(\"not blank\")\n false","ref":"Bonfire.Common.Text.html#blank?/1-examples"},{"type":"function","title":"Bonfire.Common.Text.camelise/1","doc":"Converts a string to CamelCase.","ref":"Bonfire.Common.Text.html#camelise/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.camelise/1","doc":"iex> camelise(\"hello world\")\n \"HelloWorld\"","ref":"Bonfire.Common.Text.html#camelise/1-examples"},{"type":"function","title":"Bonfire.Common.Text.code_syntax/2","doc":"Highlights code using Makeup or falls back to Phoenix.HTML if unsupported.","ref":"Bonfire.Common.Text.html#code_syntax/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.code_syntax/2","doc":"> code_syntax(\"defmodule Test {}\", \"test.ex\")\n #=> \" defmodule Test {} \"","ref":"Bonfire.Common.Text.html#code_syntax/2-examples"},{"type":"function","title":"Bonfire.Common.Text.contains?/2","doc":"Checks if a string contains a substring.","ref":"Bonfire.Common.Text.html#contains?/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.contains?/2","doc":"iex> contains?(\"hello world\", \"world\")\n true\n\n iex> contains?(\"hello world\", \"foo\")\n false","ref":"Bonfire.Common.Text.html#contains?/2-examples"},{"type":"function","title":"Bonfire.Common.Text.contains_html?/1","doc":"Checks if a string contains HTML tags.","ref":"Bonfire.Common.Text.html#contains_html?/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.contains_html?/1","doc":"iex> contains_html?(\" Test \")\n true\n\n iex> contains_html?(\"Just text\")\n false","ref":"Bonfire.Common.Text.html#contains_html?/1-examples"},{"type":"function","title":"Bonfire.Common.Text.hash/2","doc":"Hashes the input using a specified algorithm.","ref":"Bonfire.Common.Text.html#hash/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.hash/2","doc":"iex> hash(\"data\", algorithm: :sha256)\n \"Om6weQ85rIfJTzhWst0sXREOaBFgImGpqSPTuyOtyLc\"\n\n iex> hash(\"data\")\n \"jXd_OF09_siBXSD3SWAm3A\"","ref":"Bonfire.Common.Text.html#hash/2-examples"},{"type":"function","title":"Bonfire.Common.Text.list_checkboxes/1","doc":"Lists all checkboxes from the text.","ref":"Bonfire.Common.Text.html#list_checkboxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_checkboxes/1","doc":"> list_checkboxes(\"* [ ] task\n* [x] done\")\n [[\" \", \"task\"], [\" \", \"done\"]]","ref":"Bonfire.Common.Text.html#list_checkboxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.list_checked_boxes/1","doc":"Lists checked boxes from the text.","ref":"Bonfire.Common.Text.html#list_checked_boxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_checked_boxes/1","doc":"> list_checked_boxes(\"* [x] done\")\n [[\"done\"]]","ref":"Bonfire.Common.Text.html#list_checked_boxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.list_unchecked_boxes/1","doc":"Lists unchecked boxes from the text.","ref":"Bonfire.Common.Text.html#list_unchecked_boxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.list_unchecked_boxes/1","doc":"> list_unchecked_boxes(\"* [ ] task\")\n [[\"task\"]]","ref":"Bonfire.Common.Text.html#list_unchecked_boxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.make_local_links_live/1","doc":"Makes local links within content live.","ref":"Bonfire.Common.Text.html#make_local_links_live/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.make_local_links_live/1","doc":"> make_local_links_live(\" Link \")\n \" Link \"","ref":"Bonfire.Common.Text.html#make_local_links_live/1-examples"},{"type":"function","title":"Bonfire.Common.Text.markdown_checkboxes/1","doc":"Converts markdown checkboxes to HTML checkboxes.","ref":"Bonfire.Common.Text.html#markdown_checkboxes/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.markdown_checkboxes/1","doc":"> markdown_checkboxes(\"* [ ] task\n* [x] done\")\n \" task done \"","ref":"Bonfire.Common.Text.html#markdown_checkboxes/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_emote/3","doc":"Converts text to emotes if the Emote module is enabled.","ref":"Bonfire.Common.Text.html#maybe_emote/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_emote/3","doc":"iex> maybe_emote(\":smile:\", nil, [])\n \"😄\"","ref":"Bonfire.Common.Text.html#maybe_emote/3-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_markdown_to_html/2","doc":"Converts the input content from markdown to HTML if the markdown library is enabled.\nIf the content starts with an HTML tag or if the markdown library is not enabled, it skips conversion.\n\n > Bonfire.Common.Text.maybe_markdown_to_html(\"*Hello World*\", [])\n \" Hello World \"\n\n iex> Bonfire.Common.Text.maybe_markdown_to_html(\" Hello \", [])\n \" Hello \"\n\n > Bonfire.Common.Text.maybe_markdown_to_html(\"Not markdown\", [])\n \" Not markdown \"","ref":"Bonfire.Common.Text.html#maybe_markdown_to_html/2"},{"type":"function","title":"Bonfire.Common.Text.maybe_normalize_html/1","doc":"Normalizes HTML content, handling various edge cases.","ref":"Bonfire.Common.Text.html#maybe_normalize_html/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_normalize_html/1","doc":"iex> maybe_normalize_html(\" Test \")\n \"Test\"\n\n iex> maybe_normalize_html(\" \")\n \"\"","ref":"Bonfire.Common.Text.html#maybe_normalize_html/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_other_custom_emoji/2","doc":"","ref":"Bonfire.Common.Text.html#maybe_other_custom_emoji/2"},{"type":"function","title":"Bonfire.Common.Text.maybe_render_templated/2","doc":"Renders templated content if the `Solid` library is enabled.","ref":"Bonfire.Common.Text.html#maybe_render_templated/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_render_templated/2","doc":"> maybe_render_templated(\"Hello {{name}}\", %{name: \"World\"})\n \"Hello World\"","ref":"Bonfire.Common.Text.html#maybe_render_templated/2-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_sane_html/1","doc":"Sanitizes HTML content to ensure it is safe.\n\nIt is recommended to call this before storing any that data is coming in from the user or from a remote instance","ref":"Bonfire.Common.Text.html#maybe_sane_html/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_sane_html/1","doc":"> maybe_sane_html(\" alert('XSS') \")\n #=> \"alert('XSS')\" (if HtmlSanitizeEx is enabled)","ref":"Bonfire.Common.Text.html#maybe_sane_html/1-examples"},{"type":"function","title":"Bonfire.Common.Text.maybe_to_snake/1","doc":"Converts input to snake_case.","ref":"Bonfire.Common.Text.html#maybe_to_snake/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.maybe_to_snake/1","doc":"iex> maybe_to_snake(\"CamelCase\")\n \"camel_case\"","ref":"Bonfire.Common.Text.html#maybe_to_snake/1-examples"},{"type":"function","title":"Bonfire.Common.Text.normalise_links/2","doc":"Normalizes links in the content based on format.","ref":"Bonfire.Common.Text.html#normalise_links/2"},{"type":"function","title":"Examples - Bonfire.Common.Text.normalise_links/2","doc":"> normalise_links(\" Actor \", :markdown)\n \" Actor \"","ref":"Bonfire.Common.Text.html#normalise_links/2-examples"},{"type":"function","title":"Bonfire.Common.Text.random_string/1","doc":"Generates a random string of a given length.","ref":"Bonfire.Common.Text.html#random_string/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.random_string/1","doc":"iex> random_string(5) |> String.length()\n 5\n\n > random_string()\n #=> a string of length 10","ref":"Bonfire.Common.Text.html#random_string/1-examples"},{"type":"function","title":"Bonfire.Common.Text.regex_list/2","doc":"","ref":"Bonfire.Common.Text.html#regex_list/2"},{"type":"function","title":"Bonfire.Common.Text.sentence_truncate/3","doc":"Truncates a string to a maximum length, ensuring it ends on a sentence boundary.","ref":"Bonfire.Common.Text.html#sentence_truncate/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.sentence_truncate/3","doc":"iex> sentence_truncate(\"Hello world. This is a test.\", 12)\n \"Hello world.\"\n\n iex> sentence_truncate(\"Hello world. This is a test.\", 12, \"...\")\n \"Hello world....\"","ref":"Bonfire.Common.Text.html#sentence_truncate/3-examples"},{"type":"function","title":"Bonfire.Common.Text.slug/1","doc":"Generates a URL-friendly slug from the given text.\nThe text is downcased, trimmed, spaces are replaced with dashes, and it is URI-encoded.\n\n iex> Bonfire.Common.Text.slug(\"Hello World!\")\n \"hello-world!\"\n\n iex> Bonfire.Common.Text.slug(\"Elixir Programming\")\n \"elixir-programming\"\n\n iex> Bonfire.Common.Text.slug(\"Special & Characters\")\n \"special-&-characters\"","ref":"Bonfire.Common.Text.html#slug/1"},{"type":"function","title":"Bonfire.Common.Text.split_lines/1","doc":"Splits a string into lines.","ref":"Bonfire.Common.Text.html#split_lines/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.split_lines/1","doc":"iex> split_lines(\"line1\\nline2\\r\\nline3\\rline4\")\n [\"line1\", \"line2\", \"line3\", \"line4\"]","ref":"Bonfire.Common.Text.html#split_lines/1-examples"},{"type":"function","title":"Bonfire.Common.Text.strlen/1","doc":"Returns the length of the input based on its type.","ref":"Bonfire.Common.Text.html#strlen/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.strlen/1","doc":"iex> strlen(\"hello\")\n 5\n\n iex> strlen([1, 2, 3])\n 3\n\n iex> strlen(%{})\n 0\n\n iex> strlen(nil)\n 0\n\n iex> strlen(0)\n 0\n\n iex> strlen(123)\n 1","ref":"Bonfire.Common.Text.html#strlen/1-examples"},{"type":"function","title":"Bonfire.Common.Text.text_only/1","doc":"Extracts plain text from HTML content.","ref":"Bonfire.Common.Text.html#text_only/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.text_only/1","doc":"iex> text_only(\" Text \")\n \"Text\"\n\n iex> text_only({:safe, \" Safe Text \"})\n \"Safe Text\"","ref":"Bonfire.Common.Text.html#text_only/1-examples"},{"type":"function","title":"Bonfire.Common.Text.truncate/3","doc":"Truncates a string to a maximum length, optionally adding a suffix.","ref":"Bonfire.Common.Text.html#truncate/3"},{"type":"function","title":"Examples - Bonfire.Common.Text.truncate/3","doc":"iex> truncate(\"Hello world\", 5)\n \"Hello\"\n\n iex> truncate(\"Hello world\", 5, \"...\")\n \"He...\"\n\n iex> truncate(\"Hello world\", 7, \"...\")\n \"Hell...\"","ref":"Bonfire.Common.Text.html#truncate/3-examples"},{"type":"function","title":"Bonfire.Common.Text.underscore_truncate/2","doc":"Truncates the input string at the last underscore (`_`) if its length exceeds the given length.\nIf the input string is shorter than or equal to the given length, it returns the string as is.\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 4)\n \"abc\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 10)\n \"abc_def\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 5)\n \"abc\"\n\n iex> Bonfire.Common.Text.underscore_truncate(\"abc_def_ghi\", 0)","ref":"Bonfire.Common.Text.html#underscore_truncate/2"},{"type":"function","title":"Bonfire.Common.Text.upcase_first/1","doc":"Converts the first character of a binary to uppercase.","ref":"Bonfire.Common.Text.html#upcase_first/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.upcase_first/1","doc":"iex> upcase_first(\"hello\")\n \"Hello\"","ref":"Bonfire.Common.Text.html#upcase_first/1-examples"},{"type":"function","title":"Bonfire.Common.Text.verb_infinitive/1","doc":"Converts an English conjugated verb to its infinitive form using the `Verbs` library. Currently only supports irregular verbs.","ref":"Bonfire.Common.Text.html#verb_infinitive/1"},{"type":"function","title":"Examples - Bonfire.Common.Text.verb_infinitive/1","doc":"> verb_infinitive(\"running\")\n \"run\"","ref":"Bonfire.Common.Text.html#verb_infinitive/1-examples"},{"type":"module","title":"Bonfire.Common.TextExtended","doc":"","ref":"Bonfire.Common.TextExtended.html"},{"type":"function","title":"Bonfire.Common.TextExtended.blank?/1","doc":"Returns the length of the input based on its type.","ref":"Bonfire.Common.TextExtended.html#blank?/1"},{"type":"function","title":"Examples - Bonfire.Common.TextExtended.blank?/1","doc":"iex> strlen(\"hello\")\n 5\n\n iex> strlen([1, 2, 3])\n 3\n\n iex> strlen(%{})\n 0\n\n iex> strlen(nil)\n 0\n\n iex> strlen(0)\n 0\n\n iex> strlen(123)\n 1","ref":"Bonfire.Common.TextExtended.html#blank?/1-examples"},{"type":"function","title":"Bonfire.Common.TextExtended.camelise/1","doc":"","ref":"Bonfire.Common.TextExtended.html#camelise/1"},{"type":"function","title":"Bonfire.Common.TextExtended.code_syntax/2","doc":"","ref":"Bonfire.Common.TextExtended.html#code_syntax/2"},{"type":"function","title":"Bonfire.Common.TextExtended.contains?/2","doc":"","ref":"Bonfire.Common.TextExtended.html#contains?/2"},{"type":"function","title":"Bonfire.Common.TextExtended.contains_html?/1","doc":"","ref":"Bonfire.Common.TextExtended.html#contains_html?/1"},{"type":"function","title":"Bonfire.Common.TextExtended.hash/1","doc":"","ref":"Bonfire.Common.TextExtended.html#hash/1"},{"type":"function","title":"Bonfire.Common.TextExtended.hash/2","doc":"","ref":"Bonfire.Common.TextExtended.html#hash/2"},{"type":"function","title":"Bonfire.Common.TextExtended.list_checkboxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_checkboxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.list_checked_boxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_checked_boxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.list_unchecked_boxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#list_unchecked_boxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.make_local_links_live/1","doc":"","ref":"Bonfire.Common.TextExtended.html#make_local_links_live/1"},{"type":"function","title":"Bonfire.Common.TextExtended.markdown_checkboxes/1","doc":"","ref":"Bonfire.Common.TextExtended.html#markdown_checkboxes/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_emote/3","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_emote/3"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_markdown_to_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_markdown_to_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_markdown_to_html/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_markdown_to_html/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_normalize_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_normalize_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_other_custom_emoji/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_other_custom_emoji/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_render_templated/2","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_render_templated/2"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_sane_html/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_sane_html/1"},{"type":"function","title":"Bonfire.Common.TextExtended.maybe_to_snake/1","doc":"","ref":"Bonfire.Common.TextExtended.html#maybe_to_snake/1"},{"type":"function","title":"Bonfire.Common.TextExtended.normalise_links/1","doc":"","ref":"Bonfire.Common.TextExtended.html#normalise_links/1"},{"type":"function","title":"Bonfire.Common.TextExtended.normalise_links/2","doc":"","ref":"Bonfire.Common.TextExtended.html#normalise_links/2"},{"type":"function","title":"Bonfire.Common.TextExtended.random_string/0","doc":"","ref":"Bonfire.Common.TextExtended.html#random_string/0"},{"type":"function","title":"Bonfire.Common.TextExtended.random_string/1","doc":"","ref":"Bonfire.Common.TextExtended.html#random_string/1"},{"type":"function","title":"Bonfire.Common.TextExtended.regex_list/2","doc":"","ref":"Bonfire.Common.TextExtended.html#regex_list/2"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.sentence_truncate/3","doc":"","ref":"Bonfire.Common.TextExtended.html#sentence_truncate/3"},{"type":"function","title":"Bonfire.Common.TextExtended.slug/1","doc":"","ref":"Bonfire.Common.TextExtended.html#slug/1"},{"type":"function","title":"Bonfire.Common.TextExtended.split_lines/1","doc":"","ref":"Bonfire.Common.TextExtended.html#split_lines/1"},{"type":"function","title":"Bonfire.Common.TextExtended.strlen/1","doc":"","ref":"Bonfire.Common.TextExtended.html#strlen/1"},{"type":"function","title":"Bonfire.Common.TextExtended.text_only/1","doc":"","ref":"Bonfire.Common.TextExtended.html#text_only/1"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.truncate/3","doc":"","ref":"Bonfire.Common.TextExtended.html#truncate/3"},{"type":"function","title":"Bonfire.Common.TextExtended.underscore_truncate/1","doc":"","ref":"Bonfire.Common.TextExtended.html#underscore_truncate/1"},{"type":"function","title":"Bonfire.Common.TextExtended.underscore_truncate/2","doc":"","ref":"Bonfire.Common.TextExtended.html#underscore_truncate/2"},{"type":"function","title":"Bonfire.Common.TextExtended.upcase_first/1","doc":"","ref":"Bonfire.Common.TextExtended.html#upcase_first/1"},{"type":"function","title":"Bonfire.Common.TextExtended.verb_infinitive/1","doc":"","ref":"Bonfire.Common.TextExtended.html#verb_infinitive/1"},{"type":"module","title":"Bonfire.Common.Types","doc":"Helpers for handling the type of objects (structs and more)","ref":"Bonfire.Common.Types.html"},{"type":"function","title":"Bonfire.Common.Types.all_object_type_names/0","doc":"Outputs the names of all object types for the purpose of adding to the localisation strings (as long as the output is piped through to `Bonfire.Common.Localise.Gettext.localise_strings/1` at compile time)\n\n > all_object_type_names()\n [\"User\", \"Delete this User\", \"Post\", \"Delete this Post\", ...]","ref":"Bonfire.Common.Types.html#all_object_type_names/0"},{"type":"function","title":"Bonfire.Common.Types.defines_struct?/1","doc":"Takes an object or module name and checks if it defines a struct.","ref":"Bonfire.Common.Types.html#defines_struct?/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.defines_struct?/1","doc":"iex> defines_struct?(Needle.Pointer)\n true\n\n iex> defines_struct?(%{__struct__: Bonfire.Common})\n true\n\n iex> defines_struct?(%{some_key: \"some_value\"})\n false","ref":"Bonfire.Common.Types.html#defines_struct?/1-examples"},{"type":"function","title":"Bonfire.Common.Types.is_numeric/1","doc":"Takes a value and returns true if it's a number or can be converted to a float.","ref":"Bonfire.Common.Types.html#is_numeric/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.is_numeric/1","doc":"iex> is_numeric(123)\n true\n\n iex> is_numeric(\"123.45\")\n true\n\n iex> is_numeric(\"abc\")\n false","ref":"Bonfire.Common.Types.html#is_numeric/1-examples"},{"type":"function","title":"Bonfire.Common.Types.is_uid?/2","doc":"Takes a string and returns true if it is a valid UUID or ULID.","ref":"Bonfire.Common.Types.html#is_uid?/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.is_uid?/2","doc":"iex> is_uid?(\"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\")\n true\n\n iex> is_uid?(\"550e8400-e29b-41d4-a716-446655440000\")\n true\n\n iex> is_uid?(\"invalid_id\")\n false","ref":"Bonfire.Common.Types.html#is_uid?/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_convert_ulids/1","doc":"Takes a map or list of maps, and if the value of a key in the map is a ULID, it replaces it with the corresponding Crockford Base32 encoded string.","ref":"Bonfire.Common.Types.html#maybe_convert_ulids/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_convert_ulids/1","doc":"iex> maybe_convert_ulids(%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"})\n %{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}\n\n iex> maybe_convert_ulids([%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}])\n [%{key: \"01FJ4ZZZ8P5RMZMM00XDDDF8\"}]","ref":"Bonfire.Common.Types.html#maybe_convert_ulids/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom/1","doc":"Takes a string and returns an atom if it can be converted to one, else returns the input itself.","ref":"Bonfire.Common.Types.html#maybe_to_atom/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom/1","doc":"iex> maybe_to_atom(\"atom_name\")\n :atom_name\n\n iex> maybe_to_atom(\"def_non_existing_atom\")\n \"def_non_existing_atom\"","ref":"Bonfire.Common.Types.html#maybe_to_atom/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom!/1","doc":"Takes a string or an atom and returns an atom if it is one or can be converted to one, else returns nil.","ref":"Bonfire.Common.Types.html#maybe_to_atom!/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom!/1","doc":"iex> maybe_to_atom!(\"atom_name\")\n :atom_name\n\n iex> maybe_to_atom!(\"def_non_existing_atom\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_atom!/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_atom_or_module/3","doc":"Takes a string or atom and attempts to convert it to an atom or module, depending on the flags.","ref":"Bonfire.Common.Types.html#maybe_to_atom_or_module/3"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_atom_or_module/3","doc":"iex> maybe_to_atom_or_module(:some_atom, true, true)\n :some_atom\n\n iex> maybe_to_atom_or_module(\"Enum\", true, true)\n Enum","ref":"Bonfire.Common.Types.html#maybe_to_atom_or_module/3-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_float/2","doc":"Converts a value to a floating-point number if possible. If the value cannot be converted to a float, it returns a fallback value (which defaults to 0 if not provided).","ref":"Bonfire.Common.Types.html#maybe_to_float/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_float/2","doc":"iex> maybe_to_float(123)\n 123\n\n iex> maybe_to_float(\"123.45\")\n 123.45\n\n iex> maybe_to_float(\"abc\", 0.0)\n 0.0","ref":"Bonfire.Common.Types.html#maybe_to_float/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_integer/2","doc":"Converts a value to an integer if possible. If the value is not an integer, it attempts to convert it to a float and then rounds it to the nearest integer. Otherwise it returns a fallback value (which defaults to 0 if not provided).","ref":"Bonfire.Common.Types.html#maybe_to_integer/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_integer/2","doc":"iex> maybe_to_integer(123.45)\n 123\n\n iex> maybe_to_integer(\"123\")\n 123\n\n iex> maybe_to_integer(\"abc\", 0)\n 0","ref":"Bonfire.Common.Types.html#maybe_to_integer/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_module/2","doc":"Takes a string and returns the corresponding Elixir module if it exists and is not disabled in the app.","ref":"Bonfire.Common.Types.html#maybe_to_module/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_module/2","doc":"iex> maybe_to_module(\"Enum\")\n Enum\n\n iex> maybe_to_module(\"NonExistentModule\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_module/2-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_snake_atom/1","doc":"Takes a string as input, converts it to snake_case, and converts it to an atom if such an atom exists, otherwise returns nil.","ref":"Bonfire.Common.Types.html#maybe_to_snake_atom/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_snake_atom/1","doc":"iex> maybe_to_snake_atom(\"SomeString\")\n :some_string\n\n iex> maybe_to_snake_atom(\"DefNonExistingAtom\")\n nil","ref":"Bonfire.Common.Types.html#maybe_to_snake_atom/1-examples"},{"type":"function","title":"Bonfire.Common.Types.maybe_to_string/1","doc":"Handles multiple cases where the input value is of a different type (atom, list, tuple, etc.) and returns a string representation of it.","ref":"Bonfire.Common.Types.html#maybe_to_string/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.maybe_to_string/1","doc":"iex> maybe_to_string(:some_atom)\n \"some_atom\"\n\n iex> maybe_to_string([1, 2, 3])\n \"[1, 2, 3]\"\n\n iex> maybe_to_string({:a, :tuple})\n \"a: tuple\"","ref":"Bonfire.Common.Types.html#maybe_to_string/1-examples"},{"type":"function","title":"Bonfire.Common.Types.module_to_human_readable/1","doc":"Takes a module name (as a string or an atom) and converts it to a human-readable string. \n\nIt removes the `Elixir.` prefix (if it exists) and any other prefixes (e.g., `Bonfire.Common.`) and converts the final part of the module name to a string in title case (e.g., `Types`).","ref":"Bonfire.Common.Types.html#module_to_human_readable/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.module_to_human_readable/1","doc":"iex> module_to_human_readable(\"Elixir.Bonfire.Common.Types\")\n \"Types\"\n\n iex> module_to_human_readable(Bonfire.Common.Types)\n \"Types\"","ref":"Bonfire.Common.Types.html#module_to_human_readable/1-examples"},{"type":"function","title":"Bonfire.Common.Types.module_to_str/1","doc":"Takes a module atom and converts it to a string, or a string and removes the `Elixir.` prefix if it exists.","ref":"Bonfire.Common.Types.html#module_to_str/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.module_to_str/1","doc":"iex> module_to_str(SomeModule)\n \"SomeModule\"\n\n iex> module_to_str(Elixir.SomeModule)\n \"SomeModule\"","ref":"Bonfire.Common.Types.html#module_to_str/1-examples"},{"type":"function","title":"Bonfire.Common.Types.object_type/2","doc":"Takes an object, module name, or string, and returns the type of the object. \n\nThe function uses various patterns to match different object types (such as associations, Pointables, edges/verbs, etc.). If none of the patterns match, the function returns nil.","ref":"Bonfire.Common.Types.html#object_type/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.object_type/2","doc":"iex> object_type(%Ecto.Association.NotLoaded{})\n nil\n\n > object_type(%{table_id: \"601NTERTAB1EF0RA11TAB1ES00\"})\n Needle.Table\n\n iex> object_type(%{pointer_id: \"User\"})\n Bonfire.Data.Identity.User\n\n iex> object_type(\"User\")\n Bonfire.Data.Identity.User\n\n iex> object_type(:some_atom)\n :some_atom","ref":"Bonfire.Common.Types.html#object_type/2-examples"},{"type":"function","title":"Bonfire.Common.Types.object_type_display/1","doc":"Outputs a human-readable representation of an object type.","ref":"Bonfire.Common.Types.html#object_type_display/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.object_type_display/1","doc":"iex> object_type_display(:user)\n \"user\"\n\n > object_type_display(%Bonfire.Data.Social.APActivity{})\n \"apactivity\"","ref":"Bonfire.Common.Types.html#object_type_display/1-examples"},{"type":"function","title":"Bonfire.Common.Types.sanitise_name/1","doc":"Used for mapping schema types to user-friendly names. Given a string representing a schema type name, returns a sanitised version of it, or nil for object types (or mixins) that shouldn't be displayed.","ref":"Bonfire.Common.Types.html#sanitise_name/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.sanitise_name/1","doc":"iex> sanitise_name(\"Apactivity\")\n \"Federated Object\"\n\n iex> sanitise_name(\"Settings\")\n \"Setting\"\n\n iex> sanitise_name(\"Created\")\n nil","ref":"Bonfire.Common.Types.html#sanitise_name/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_id/1","doc":"Given a schema module, returns its table ID (i.e. Pointable ULID).","ref":"Bonfire.Common.Types.html#table_id/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.table_id/1","doc":"> table_id(Bonfire.Data.Social.APActivity)\n \"30NF1REAPACTTAB1ENVMBER0NE\"","ref":"Bonfire.Common.Types.html#table_id/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_type/1","doc":"Given an object or module name, returns its respective table table ID (i.e. Pointable ULID).","ref":"Bonfire.Common.Types.html#table_type/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.table_type/1","doc":"> table_type(%Bonfire.Data.Social.APActivity{})\n \"30NF1REAPACTTAB1ENVMBER0NE\"\n \n iex> table_type(%Needle.Pointer{table_id: \"30NF1REAPACTTAB1ENVMBER0NE\"})\n \"30NF1REAPACTTAB1ENVMBER0NE\"\n\n > table_type(Bonfire.Data.Social.APActivity)\n \"30NF1REAPACTTAB1ENVMBER0NE\"","ref":"Bonfire.Common.Types.html#table_type/1-examples"},{"type":"function","title":"Bonfire.Common.Types.table_types/1","doc":"Given a list of schema types, returns a list of their respective table types. Filters out any empty values. \n\n > table_types([%Needle.Pointer{table_id: \"30NF1REAPACTTAB1ENVMBER0NE\"}, %Bonfire.Data.Social.APActivity{}])\n [\"30NF1REAPACTTAB1ENVMBER0NE\"]\n\n Given a single schema type, it returns its respective table type.\n\n > table_types(Bonfire.Data.Social.APActivity)\n [\"30NF1REAPACTTAB1ENVMBER0NE\"]","ref":"Bonfire.Common.Types.html#table_types/1"},{"type":"function","title":"Bonfire.Common.Types.typeof/1","doc":"Takes an object and returns its data type as a module name or atom.","ref":"Bonfire.Common.Types.html#typeof/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.typeof/1","doc":"iex> typeof(%{__struct__: Ecto.Schema})\n Ecto.Schema\n\n iex> typeof(%{__context__: nil, __changed__: nil})\n :assigns\n\n iex> typeof(nil)\n :empty\n\n iex> typeof(%Ecto.Changeset{})\n Ecto.Changeset\n\n iex> typeof([1, 2])\n List\n\n iex> typeof([])\n :empty\n\n iex> typeof(\"string\")\n String\n\n iex> typeof(:atom)\n Atom\n\n iex> typeof(123)\n Integer\n\n iex> typeof(%{id: 1})\n Map\n\n iex> typeof(%{})\n :empty\n\n iex> typeof(3.14)\n Float\n\n iex> typeof({:ok, 42})\n Tuple\n\n iex> typeof(fn -> :ok end)\n Function\n\n iex> typeof(self())\n Process\n\n iex> typeof(Port.open({:spawn, \"cat\"}, [:binary]))\n Port\n\n iex> typeof(make_ref())\n :reference\n\n iex> typeof(%{__struct__: Bonfire.Classify.Category})\n Bonfire.Classify.Category","ref":"Bonfire.Common.Types.html#typeof/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uid/2","doc":"Takes an object and returns a single ULID (Universally Unique Lexicographically Sortable Identifier) ID(s) if present in the object.","ref":"Bonfire.Common.Types.html#uid/2"},{"type":"function","title":"Examples - Bonfire.Common.Types.uid/2","doc":"iex> uid(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid(%{pointer: %{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid(%{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n \n iex> uid(\"01J3MNBPD0VX96MFY9B15BCHYP\")\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n > uid([\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"])\n # ** (ArgumentError) Expected an ID (ULID or UUID) or an object or list containing a single one, but got several\n\n iex> uid(\"invalid_id\")\n nil\n\n iex> uid(\"invalid_id\", :fallback)\n :fallback","ref":"Bonfire.Common.Types.html#uid/2-examples"},{"type":"function","title":"Bonfire.Common.Types.uid!/1","doc":"Takes an object and returns the ULID (Universally Unique Lexicographically Sortable Identifier) ID if present in the object. Throws an error if a ULID ID is not present.","ref":"Bonfire.Common.Types.html#uid!/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.uid!/1","doc":"iex> uid!(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n \"01J3MNBPD0VX96MFY9B15BCHYP\"\n\n iex> uid!(\"invalid_id\")\n ** (RuntimeError) Expected an object or ID (ULID)","ref":"Bonfire.Common.Types.html#uid!/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uid_or_uids/1","doc":"","ref":"Bonfire.Common.Types.html#uid_or_uids/1"},{"type":"function","title":"Bonfire.Common.Types.uids/1","doc":"Takes an object or list of objects and returns a list of ULIDs (Universally Unique Lexicographically Sortable Identifier) ID(s) if present.","ref":"Bonfire.Common.Types.html#uids/1"},{"type":"function","title":"Examples - Bonfire.Common.Types.uids/1","doc":"iex> uids(%{pointer_id: \"01J3MNBPD0VX96MFY9B15BCHYP\"})\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids(%{pointer: %{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}})\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids([%{id: \"01J3MNBPD0VX96MFY9B15BCHYP\"}])\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n \n iex> uids(\"01J3MNBPD0VX96MFY9B15BCHYP\")\n [\"01J3MNBPD0VX96MFY9B15BCHYP\"]\n\n iex> uids([\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"])\n [\"01J3MNBPD0VX96MFY9B15BCHYP\", \"01J3MQ2Q4RVB1WTE3KT1D8ZNX1\"]\n\n iex> uids(\"invalid_id\")\n []","ref":"Bonfire.Common.Types.html#uids/1-examples"},{"type":"function","title":"Bonfire.Common.Types.uids_or/2","doc":"","ref":"Bonfire.Common.Types.html#uids_or/2"},{"type":"module","title":"Bonfire.Common.URIs","doc":"URI/URL/path helpers","ref":"Bonfire.Common.URIs.html"},{"type":"function","title":"Bonfire.Common.URIs.base_domain/1","doc":"Returns the base domain from the given URI or endpoint.\n\n iex> base_domain(%URI{host: \"example.com\", port: 443})\n \"example.com\"","ref":"Bonfire.Common.URIs.html#base_domain/1"},{"type":"function","title":"Bonfire.Common.URIs.base_uri/1","doc":"Returns the homepage URI (as struct) of the local instance.\n\n > %URI{scheme: \"http\", host: \"localhost\"} = base_uri(:my_endpoint)","ref":"Bonfire.Common.URIs.html#base_uri/1"},{"type":"function","title":"Bonfire.Common.URIs.base_url/1","doc":"Return the homepage URL (as string) of the local instance","ref":"Bonfire.Common.URIs.html#base_url/1"},{"type":"function","title":"Bonfire.Common.URIs.based_url/2","doc":"TODOC","ref":"Bonfire.Common.URIs.html#based_url/2"},{"type":"function","title":"Bonfire.Common.URIs.canonical_url/1","doc":"Returns the canonical URL (i.e., the one used for ActivityPub federation) of an object.","ref":"Bonfire.Common.URIs.html#canonical_url/1"},{"type":"function","title":"Examples - Bonfire.Common.URIs.canonical_url/1","doc":"iex> canonical_url(%{canonical_uri: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{canonical_url: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{\"canonicalUrl\" => \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{peered: %{canonical_uri: \"http://example.com\"}})\n \"http://example.com\"\n\n iex> canonical_url(%{character: %{canonical_uri: \"http://example.com\"}})\n \"http://example.com\"\n\n iex> canonical_url(%{character: %{peered: %{canonical_uri: \"http://example.com\"}}})\n \"http://example.com\"\n\n iex> canonical_url(%{peered: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{created: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{character: %Ecto.Association.NotLoaded{}})\n nil\n\n iex> canonical_url(%{character: %{peered: %{}}})\n nil\n\n iex> canonical_url(%{path: \"http://example.com\"})\n \"http://example.com\"\n\n iex> canonical_url(%{other: \"data\"})\n nil","ref":"Bonfire.Common.URIs.html#canonical_url/1-examples"},{"type":"function","title":"Bonfire.Common.URIs.display_url/1","doc":"Removes the scheme from a URL to get the display URL.\n\n iex> display_url(\"https://example.com/path\")\n \"example.com/path\"\n\n iex> display_url(\"http://example.com/path\")\n \"example.com/path\"\n\n iex> display_url(\"/path\")\n \"/path\"","ref":"Bonfire.Common.URIs.html#display_url/1"},{"type":"function","title":"Bonfire.Common.URIs.fallback/1","doc":"","ref":"Bonfire.Common.URIs.html#fallback/1"},{"type":"function","title":"Bonfire.Common.URIs.fallback/2","doc":"","ref":"Bonfire.Common.URIs.html#fallback/2"},{"type":"function","title":"Bonfire.Common.URIs.fallback/3","doc":"","ref":"Bonfire.Common.URIs.html#fallback/3"},{"type":"function","title":"Bonfire.Common.URIs.is_uri?/1","doc":"Returns true if the given string is a valid URI.\n\n iex> is_uri?(\"http://example.com\")\n true\n\n iex> is_uri?(\"invalid_uri\")\n false","ref":"Bonfire.Common.URIs.html#is_uri?/1"},{"type":"function","title":"Bonfire.Common.URIs.maybe_generate_canonical_url/1","doc":"","ref":"Bonfire.Common.URIs.html#maybe_generate_canonical_url/1"},{"type":"function","title":"Bonfire.Common.URIs.path/3","doc":"Returns the path (URL on the local instance) for the given object/struct (eg. a User), view or schema module, or path name (atom defined in routes), along with optional arguments.\n\nReturns the path (URL on the local instance) for the given object/struct (e.g., a User), view or schema module, or path name (atom defined in routes), along with optional arguments.","ref":"Bonfire.Common.URIs.html#path/3"},{"type":"function","title":"Examples - Bonfire.Common.URIs.path/3","doc":"> path(:user, [1], [])\n \"/users/1\"\n\n > path(User, [1], [])\n \"/users/1\"\n\n > path(%{id: \"1\"}, :show, [])\n \"/users/1/show\"\n\n > path(%{id: \"1\"}, [some: :args], [])\n \"/users/1/some_args\"\n\n iex> path(\"12345\", [some: :args], [])\n nil","ref":"Bonfire.Common.URIs.html#path/3-examples"},{"type":"function","title":"Bonfire.Common.URIs.path_by_id/4","doc":"","ref":"Bonfire.Common.URIs.html#path_by_id/4"},{"type":"function","title":"Bonfire.Common.URIs.remote_canonical_url/1","doc":"","ref":"Bonfire.Common.URIs.html#remote_canonical_url/1"},{"type":"function","title":"Bonfire.Common.URIs.static_path/2","doc":"Generates a static path based on the given path and endpoint module.\n\n > static_path(\"/assets/image.png\")\n \"/assets/image.png\"","ref":"Bonfire.Common.URIs.html#static_path/2"},{"type":"function","title":"Bonfire.Common.URIs.url_path/2","doc":"Returns the full URL (including domain and path) for a given object, module, or path name.\n\n > url_path(:user, [1])\n \"http://localhost:4000/discussion/user/1\"","ref":"Bonfire.Common.URIs.html#url_path/2"},{"type":"function","title":"Bonfire.Common.URIs.validate_uri/1","doc":"Validates a URI string.","ref":"Bonfire.Common.URIs.html#validate_uri/1"},{"type":"function","title":"Examples - Bonfire.Common.URIs.validate_uri/1","doc":"iex> {:ok, %URI{scheme: \"http\", host: \"example.com\"}} = validate_uri(\"http://example.com\")\n\n iex> {:error, %URI{scheme: nil, host: nil}} = validate_uri(\"invalid_uri\")","ref":"Bonfire.Common.URIs.html#validate_uri/1-examples"},{"type":"module","title":"Bonfire.Common.Utils","doc":"Various very commonly used utility functions for the Bonfire application.\n\nThis module should contain only a few generic and/or heavily-used functions, and any other functions should be in more specific modules (or in other extensions altogether) for e.g.: \n- `Bonfire.Common.Enums` for functions around maps, structs, keyword lists, and the like\n- `Bonfire.Common.Types` for object types\n- `Bonfire.Common.URIs` and `Linkify` for URI handling\n- `Bonfire.Common.DatesTimes` for date/time helpers\n- `Bonfire.Common.E` to extract nested data from an object\n- `Bonfire.Common.Errors` and `Bonfire.Fail` for error handling\n- `Bonfire.Common.Extend` for functions around modularity\n- `Bonfire.Common.Opts` for handling function options\n- `Bonfire.Common.Config` for handling app-wide config\n- `Bonfire.Common.Settings` for handling account/user/instance level settings\n- `Bonfire.Common.HTTP` for HTTP requests\n- `Bonfire.Common.Cache` for caching\n- `Bonfire.Common.Text` for plain or rich text\n- `Bonfire.Common.Localise` for app localisation\n- `Bonfire.Common.Media` and `Bonfire.Files` for avatars/images/videos/etc\n- `Bonfire.Common.Repo` and `Needle` for database access\n- `Bonfire.Common.PubSub` for pub/sub\n\nWe may also want to consider reusing functions from existing utils libraries when possible and contributing missing ones there, for example:\n- https://hexdocs.pm/moar/readme.html\n- https://hexdocs.pm/bunch/api-reference.html\n- https://hexdocs.pm/swiss/api-reference.html\n- https://hexdocs.pm/wuunder_utils/api-reference.html\n- https://github.com/cozy-elixir","ref":"Bonfire.Common.Utils.html"},{"type":"function","title":"Bonfire.Common.Utils.apply_error/3","doc":"","ref":"Bonfire.Common.Utils.html#apply_error/3"},{"type":"function","title":"Bonfire.Common.Utils.apply_task/3","doc":"Runs a function asynchronously in a Task. Simply a shorthand for calling functions in `Task` and `Task.Supervisor` but with support for multi-tenancy in the spawned process. \n\n- `Task.async/1` the caller creates a new process links and monitors it. Once the task action finishes, a message is sent to the caller with the result. `Task.await/2` is used to read the message sent by the task. When using `async`, you *must* `await` a reply as they are always sent. \n\n- `Task.start_link/1` is suggested instead if you are not expecting a reply. It starts a statically supervised task as part of a supervision tree, linked to the calling process (meaning it will be stopped when the caller stops). \n\n- `Task.start/1` can be used for fire-and-forget tasks, like side-effects, when you have no interest on its results nor if it completes successfully (because if the server is shut down it won't be restarted).\n\nFor more serious tasks, consider using `Oban` or `apply_task_supervised/3` for supervised tasks when possible:\n\n- `Task.Supervisor.start_child/2` allows you to start a fire-and-forget task when you don't care about its results or if it completes successfully or not.\n\n- `Task.Supervisor.async/2` + `Task.await/2` allows you to execute tasks concurrently and retrieve its result. If the task fails, the caller will also fail.","ref":"Bonfire.Common.Utils.html#apply_task/3"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.apply_task/3","doc":"- `function`: The type of task to start (e.g. `:async`, `:start_link`, or `:start`).\n- `fun`: The function to execute async.\n- `opts`: Options for task execution, including:\n - `:module` - The module to use for task execution (defaults to `Task`).","ref":"Bonfire.Common.Utils.html#apply_task/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.apply_task/3","doc":"> apply_task(:async, fn -> IO.puts(\"Async task\") end)\n # Output: \"Async task\"\n\n > {apply_task(:start, fn -> IO.puts(\"Fire-and-forget task\") end)\n # Output: \"Fire-and-forget task\"\n\n > apply_task(:start_link, fn -> IO.puts(\"Supervised task\") end)\n # Output: \"Supervised task\"","ref":"Bonfire.Common.Utils.html#apply_task/3-examples"},{"type":"function","title":"Bonfire.Common.Utils.apply_task_supervised/3","doc":"Runs a function asynchronously using `Task.Supervisor`. This is similar to `apply_task/3` but specifically uses `Task.Supervisor` for supervision.","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.apply_task_supervised/3","doc":"- `module`: The supervisor module to use for task execution\n - `fun`: The function to execute async\n - `opts`: Options for task execution, including:\n - `:function` - The `Task.Supervisor` function to use for task execution (defaults to `:async`).","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.apply_task_supervised/3","doc":"> apply_task_supervised(MySupervisor, fn -> IO.puts(\"Supervised async task\") end)\n ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started\n # because `MySupervisor` is not defined and/or started ^","ref":"Bonfire.Common.Utils.html#apply_task_supervised/3-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account/2","doc":"Returns the current account from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current account.","ref":"Bonfire.Common.Utils.html#current_account/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account/2","doc":"iex> Bonfire.Common.Utils.current_account(%{current_account: %{id: \"account1\"}})\n %{id: \"account1\"}\n\n iex> Bonfire.Common.Utils.current_account(%{assigns: %{current_account: %{id: \"account2\"}}})\n %{id: \"account2\"}\n\n iex> Bonfire.Common.Utils.current_account(%{socket: %{assigns: %{current_account: %{id: \"account3\"}}}})\n %{id: \"account3\"}\n\n iex> Bonfire.Common.Utils.current_account([current_account: %{id: \"account4\"}])\n %{id: \"account4\"}","ref":"Bonfire.Common.Utils.html#current_account/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_and_or_user_ids/1","doc":"Returns a list of current account IDs and/or user IDs.\n\nThis function returns a keyword list with the current account IDs and/or user IDs.","ref":"Bonfire.Common.Utils.html#current_account_and_or_user_ids/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_and_or_user_ids/1","doc":"iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\", current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\", user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n \n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account: %{id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}, current_user: %{id: \"5EVSER1S0STENS1B1YHVMAN01D\"}})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\", user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"})\n [account: \"2CC0VNTSARE1S01AT10NGR0VPS\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n [user: \"5EVSER1S0STENS1B1YHVMAN01D\"]\n\n iex> Bonfire.Common.Utils.current_account_and_or_user_ids(%{})\n []","ref":"Bonfire.Common.Utils.html#current_account_and_or_user_ids/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_auth!/2","doc":"(Re)authenticates the current account using the provided password.\n\nRaises an exception if the credentials are invalid.","ref":"Bonfire.Common.Utils.html#current_account_auth!/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_auth!/2","doc":"> Bonfire.Common.Utils.current_account_auth!(%{current_account: %{id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}}, \"wrong-password\")\n ** (Bonfire.Fail.Auth) We couldn't find an account with the details you provided.","ref":"Bonfire.Common.Utils.html#current_account_auth!/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_account_id/2","doc":"Returns the current account ID from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current account ID.","ref":"Bonfire.Common.Utils.html#current_account_id/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_account_id/2","doc":"iex> Bonfire.Common.Utils.current_account_id(%{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(%{assigns: %{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(%{socket: %{assigns: %{current_account_id: \"2CC0VNTSARE1S01AT10NGR0VPS\"}}})\n \"2CC0VNTSARE1S01AT10NGR0VPS\"\n\n iex> Bonfire.Common.Utils.current_account_id(\"2CC0VNTSARE1S01AT10NGR0VPS\")\n \"2CC0VNTSARE1S01AT10NGR0VPS\"","ref":"Bonfire.Common.Utils.html#current_account_id/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user/2","doc":"Returns the current user from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current user (or current user ID if that's all that's available).","ref":"Bonfire.Common.Utils.html#current_user/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user/2","doc":"iex> Bonfire.Common.Utils.current_user(%{current_user: %{id: \"user1\"}})\n %{id: \"user1\"}\n\n iex> Bonfire.Common.Utils.current_user(%{assigns: %{current_user: %{id: \"user2\"}}})\n %{id: \"user2\"}\n\n iex> Bonfire.Common.Utils.current_user(%{socket: %{assigns: %{current_user: %{id: \"user3\"}}}})\n %{id: \"user3\"}\n\n iex> Bonfire.Common.Utils.current_user([current_user: %{id: \"user4\"}])\n %{id: \"user4\"}\n\n iex> Bonfire.Common.Utils.current_user(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n \"5EVSER1S0STENS1B1YHVMAN01D\"","ref":"Bonfire.Common.Utils.html#current_user/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_auth!/2","doc":"(Re)authenticates the current user using the provided password.\n\nRaises an exception if the credentials are invalid.","ref":"Bonfire.Common.Utils.html#current_user_auth!/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_auth!/2","doc":"> Bonfire.Common.Utils.current_user_auth!(%{current_user: %{id: \"user1\"}}, \"password123\")\n ** (Bonfire.Fail.Auth) We couldn't find an account with the details you provided.","ref":"Bonfire.Common.Utils.html#current_user_auth!/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_id/2","doc":"Returns the current user ID from socket, assigns, or options.\n\nThis function traverses various possible structures to find and return the current user ID.","ref":"Bonfire.Common.Utils.html#current_user_id/2"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_id/2","doc":"iex> Bonfire.Common.Utils.current_user_id(%{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(%{assigns: %{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"}})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(%{assigns: %{__context__: %{current_user_id: \"5EVSER1S0STENS1B1YHVMAN01D\"}}})\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n\n iex> Bonfire.Common.Utils.current_user_id(\"5EVSER1S0STENS1B1YHVMAN01D\")\n \"5EVSER1S0STENS1B1YHVMAN01D\"\n \n iex> Bonfire.Common.Utils.current_user_id(\"invalid id\")\n nil","ref":"Bonfire.Common.Utils.html#current_user_id/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.current_user_required!/1","doc":"Ensures that the current user is present and raises an exception if not logged in.","ref":"Bonfire.Common.Utils.html#current_user_required!/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.current_user_required!/1","doc":"iex> Bonfire.Common.Utils.current_user_required!(%{current_user: %{id: \"user1\"}})\n %{id: \"user1\"}\n\n > Bonfire.Common.Utils.current_user_required!(%{})\n ** (Bonfire.Fail.Auth) You need to log in first.","ref":"Bonfire.Common.Utils.html#current_user_required!/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.declared_extension/0","doc":"","ref":"Bonfire.Common.Utils.html#declared_extension/0"},{"type":"function","title":"Bonfire.Common.Utils.empty?/1","doc":"Checks if the given value is `nil`, an empty enumerable, or an empty string.","ref":"Bonfire.Common.Utils.html#empty?/1"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.empty?/1","doc":"- `v`: The value to check.","ref":"Bonfire.Common.Utils.html#empty?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.empty?/1","doc":"iex> empty?(nil)\n true\n\n iex> empty?(\"\")\n true\n\n iex> empty?([])\n true\n\n iex> empty?([1, 2, 3])\n false\n\n iex> empty?(\"hello\")\n false","ref":"Bonfire.Common.Utils.html#empty?/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe/2","doc":"Applies the given function if the first parameter is not `nil`.","ref":"Bonfire.Common.Utils.html#maybe/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.maybe/2","doc":"- `val`: The value to check.\n - `change_fn`: A function to apply if `val` is not `nil`.","ref":"Bonfire.Common.Utils.html#maybe/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.maybe/2","doc":"iex> maybe(nil, fn x -> x * 2 end)\n nil\n\n iex> maybe(3, fn x -> x * 2 end)\n 6","ref":"Bonfire.Common.Utils.html#maybe/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe_apply/4","doc":"Helper for calling hypothetical functions another modules. \n \nAttempts to apply a function from a specified module with the given arguments and returns the result. \n\nReturns an error if the function is not defined, unless a fallback function was provided to be invoked, or a fallback value to be returned.","ref":"Bonfire.Common.Utils.html#maybe_apply/4"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.maybe_apply/4","doc":"- `module`: The module to check for the function.\n - `funs`: A list of function names (atoms) to try.\n - `args`: Arguments to pass to the function.\n - `opts`: Options for error handling and fallback. Options include:\n - `:fallback_fun` - A function to call if the primary function is not found.\n - `:fallback_return` - A default return value if the function cannot be applied.","ref":"Bonfire.Common.Utils.html#maybe_apply/4-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.maybe_apply/4","doc":"iex> maybe_apply(Enum, :map, [[1, 2, 3], &(&1 * 2)])\n [2, 4, 6]\n\n iex> maybe_apply(Enum, [:nonexistent_fun], [])\n {:error, \"None of the functions [:nonexistent_fun] are defined at Elixir.Enum with arity 0\"}\n\n iex> maybe_apply(Enum, [:nonexistent_fun], [], fallback_fun: fn error, _args, _opts -> raise \"Failed\" end)\n ** (RuntimeError) Failed\n\n iex> maybe_apply(SomeModule, [:some_fun], [1, 2, 3], fallback_return: \"Failed\")\n # Output: [warning] maybe_apply: No such module (Elixir.SomeModule) could be loaded. - with args: ([1, 2, 3])\n \"Failed\"","ref":"Bonfire.Common.Utils.html#maybe_apply/4-examples"},{"type":"function","title":"Bonfire.Common.Utils.maybe_apply_fallback/3","doc":"","ref":"Bonfire.Common.Utils.html#maybe_apply_fallback/3"},{"type":"function","title":"Bonfire.Common.Utils.maybe_from_opts/3","doc":"Returns the value of a key from options keyword list or map, or a fallback if not present or empty.","ref":"Bonfire.Common.Utils.html#maybe_from_opts/3"},{"type":"function","title":"Bonfire.Common.Utils.nothing?/1","doc":"Checks if the given value is `nil`, `false`, `0`, or an empty value (using `empty?/1`).","ref":"Bonfire.Common.Utils.html#nothing?/1"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.nothing?/1","doc":"- `v`: The value to check.","ref":"Bonfire.Common.Utils.html#nothing?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.nothing?/1","doc":"iex> nothing?(nil)\n true\n\n iex> nothing?(false)\n true\n\n iex> nothing?(0)\n true\n\n iex> nothing?(\"\")\n true\n\n iex> nothing?([1, 2, 3])\n false\n\n iex> nothing?(\"hello\")\n false","ref":"Bonfire.Common.Utils.html#nothing?/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.ok_unwrap/2","doc":"Unwraps an `{:ok, val}` tuple, returning the value. If not OK, returns a fallback value (default is `nil`).","ref":"Bonfire.Common.Utils.html#ok_unwrap/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.ok_unwrap/2","doc":"- `val`: The value or tuple to unwrap.\n - `fallback`: The fallback value if the tuple is an error.","ref":"Bonfire.Common.Utils.html#ok_unwrap/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.ok_unwrap/2","doc":"iex> ok_unwrap({:ok, 42})\n 42\n\n iex> ok_unwrap({:error, \"something went wrong\"}, \"default\")\n \"default\"\n\n iex> ok_unwrap(:error, \"default\")\n \"default\"\n\n iex> ok_unwrap(nil, \"default\")\n \"default\"","ref":"Bonfire.Common.Utils.html#ok_unwrap/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.round_nearest/1","doc":"Rounds a number and uses `Bonfire.Common.Localise.Cldr.Number.to_string/2` function to format into a human readable string.","ref":"Bonfire.Common.Utils.html#round_nearest/1"},{"type":"function","title":"Examples - Bonfire.Common.Utils.round_nearest/1","doc":"iex> round_nearest(1234)\n \"1K\"\n\n iex> round_nearest(1600000)\n \"2M\"","ref":"Bonfire.Common.Utils.html#round_nearest/1-examples"},{"type":"function","title":"Bonfire.Common.Utils.round_nearest/2","doc":"Rounds a number to the nearest specified target.","ref":"Bonfire.Common.Utils.html#round_nearest/2"},{"type":"function","title":"Parameters - Bonfire.Common.Utils.round_nearest/2","doc":"- `num`: The number to round.\n - `target`: The target to round to (optional).","ref":"Bonfire.Common.Utils.html#round_nearest/2-parameters"},{"type":"function","title":"Examples - Bonfire.Common.Utils.round_nearest/2","doc":"iex> round_nearest(1234, 10)\n 1230\n\n iex> round_nearest(1234, 100)\n 1200\n\n iex> round_nearest(1234, 1000)\n 1000","ref":"Bonfire.Common.Utils.html#round_nearest/2-examples"},{"type":"function","title":"Bonfire.Common.Utils.to_options/1","doc":"Converts a map, user, socket, tuple, etc, to a keyword list for standardised use as function options.","ref":"Bonfire.Common.Utils.html#to_options/1"},{"type":"module","title":"Bonfire.Ecto","doc":"`Bonfire.Ecto` contains `Ecto` transactional support as acts for `Bonfire.Epics`","ref":"Bonfire.Ecto.html"},{"type":"module","title":"Introduction - Bonfire.Ecto","doc":"`Bonfire.Ecto` is designed to facilitate complex Ecto transaction handling within an Elixir application that uses `Bonfire.Epics` to execute a sequence of operations (or `Acts`). These modules provide a structured way to manage database transactions as a series of acts and managing them within an `Epic`, offering flexibility and control over database interactions, ensuring that transactions are executed efficiently.","ref":"Bonfire.Ecto.html#module-introduction"},{"type":"module","title":"Modules Overview - Bonfire.Ecto","doc":"1. `Bonfire.Ecto.Acts.Begin`\n - Responsible for initiating a transaction if certain conditions are met. It ensures that the transaction is only started when it is sensible to do so, based on the current state of the `Epic`.\n\n2. `Bonfire.Ecto.Acts.Work`\n - Handles queued database operations within a transaction. Operations are queued using the `Bonfire.Ecto.Acts.Work.add/2` function and executed if there are no errors in the `Epic` or changesets.\n\n3. `Bonfire.Ecto.Acts.Commit`\n - A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.html#module-modules-overview"},{"type":"module","title":"Usage - Bonfire.Ecto","doc":"#### 1. Initial Setup\n\nEnsure that you have `Ecto` and `Bonfire.Epics` installed and configured in your application, and then install this linrary.\n\n#### 2. Using `Bonfire.Ecto.Acts.Begin`\n\nRefer to `Bonfire.Epics` docs to define some `Act`s and `Epic`s: https://github.com/bonfire-networks/bonfire_epics\n\n#### 3. Queue database operation(s) in an Act \n\nQueue operations by calling the `Bonfire.Ecto.Acts.Work.add/2` function, providing the epic and a key representing the changeset to be processed.\n\n```elixir\nepic = Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n```\n\n#### 3. Add the three `Bonfire.Ecto` Acts to your Epic\n```\n # First come the Acts that prepare the changeset and call `Bonfire.Ecto.Acts.Work.add/2` to queue it\n\n # Open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Then can come some Acts that process the result of the transaction \n```","ref":"Bonfire.Ecto.html#module-usage"},{"type":"module","title":"Bonfire.Ecto.Acts.Begin","doc":"An Act that enters a transaction unless it senses that it would be futile.","ref":"Bonfire.Ecto.Acts.Begin.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Begin.run/2","doc":"Runs the given act(s) within a transaction if no errors are detected in the epic.\n\nThis function takes the modules before the `Commit` module in the `epic.next` list, runs them,\nand then processes the remaining modules. If there are any errors in the epic, it avoids\nentering a transaction.","ref":"Bonfire.Ecto.Acts.Begin.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Begin.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Begin.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Begin.run/2","doc":"iex> epic = %Epic{next: [%{module: OtherModule}, %{module: Commit}], errors: []}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Begin.run(epic, act)\n %Epic{next: [], errors: []}\n\n iex> epic = %Epic{next: [%{module: OtherModule}, %{module: Commit}], errors: [\"error\"]}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Begin.run(epic, act)\n %Epic{next: [], errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Begin.html#run/2-examples"},{"type":"module","title":"Bonfire.Ecto.Acts.Commit","doc":"A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.Acts.Commit.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Commit.run/2","doc":"","ref":"Bonfire.Ecto.Acts.Commit.html#run/2"},{"type":"module","title":"Bonfire.Ecto.Acts.Delete","doc":"","ref":"Bonfire.Ecto.Acts.Delete.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"Attempts to delete the given objects or struct from the repository.\n\nThis function handles the deletion of objects, whether they are a list, a `Needle.Pointer`, or a regular struct. It returns the number of objects deleted.","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"- `objects` - The object(s) to be deleted, can be a list or a single struct.\n - `repo` - The repository module to use for deletion.","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Delete.maybe_delete/2","doc":"iex> objects = [%SomeStruct{id: 1}, %SomeStruct{id: 2}]\n iex> repo = MyApp.Repo\n iex> Bonfire.Ecto.Acts.Delete.maybe_delete(objects, repo)\n {:ok, 2}\n\n iex> object = %SomeStruct{id: 1}\n iex> repo = MyApp.Repo\n iex> Bonfire.Ecto.Acts.Delete.maybe_delete(object, repo)\n {:ok, 1}","ref":"Bonfire.Ecto.Acts.Delete.html#maybe_delete/2-examples"},{"type":"function","title":"Bonfire.Ecto.Acts.Delete.run/2","doc":"Runs the delete act, marking the specified changeset or struct for deletion.\n\nThis function marks an object for deletion based on the `:on` key in the act options.\nIf associations are specified for deletion, they will be processed as well.","ref":"Bonfire.Ecto.Acts.Delete.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Delete.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Delete.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Delete.run/2","doc":"iex> epic = %Epic{assigns: %{some_key: %SomeStruct{}}, errors: []}\n iex> act = %{options: %{on: :some_key}}\n iex> Bonfire.Ecto.Acts.Delete.run(epic, act)\n %Epic{assigns: %{some_key: %SomeStruct{}}, errors: []}\n\n iex> epic = %Epic{assigns: %{some_key: %SomeStruct{}}, errors: [\"error\"]}\n iex> act = %{options: %{on: :some_key}}\n iex> Bonfire.Ecto.Acts.Delete.run(epic, act)\n %Epic{assigns: %{some_key: %SomeStruct{}}, errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Delete.html#run/2-examples"},{"type":"module","title":"Bonfire.Ecto.Acts.Work","doc":"An act that performs queued up work in a transaction.\n\nWork is queued up with calls to `add/2` in earlier acts and when run, this act will apply the\nappropriate actions.\n\nOnly runs if there are no epic or changesets errors.","ref":"Bonfire.Ecto.Acts.Work.html"},{"type":"function","title":"Bonfire.Ecto.Acts.Work.add/2","doc":"Records that a particular key contains an `Ecto.Changeset` that needs to be processed (inserted, updated, upserted, or deleted).\n\nCall this in earlier acts to queue work for in-transaction processing.\n\nIf you wish to delete, you must ensure you set the changeset's `:action` key to `:delete`.","ref":"Bonfire.Ecto.Acts.Work.html#add/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Work.add/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `key` - The key representing the changeset to be processed.","ref":"Bonfire.Ecto.Acts.Work.html#add/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Work.add/2","doc":"iex> epic = %Epic{}\n iex> Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}}","ref":"Bonfire.Ecto.Acts.Work.html#add/2-examples"},{"type":"function","title":"Bonfire.Ecto.Acts.Work.run/2","doc":"Runs the queued work within a transaction if no errors are detected in the epic.\n\nThis function retrieves the list of keys scheduled for processing, validates them,\nand performs the appropriate actions (`:insert`, `:update`, `:upsert`, `:delete`) in a transaction.","ref":"Bonfire.Ecto.Acts.Work.html#run/2"},{"type":"function","title":"Parameters - Bonfire.Ecto.Acts.Work.run/2","doc":"- `epic` - The epic struct that contains the list of acts to be executed.\n - `act` - The current act being processed.","ref":"Bonfire.Ecto.Acts.Work.html#run/2-parameters"},{"type":"function","title":"Examples - Bonfire.Ecto.Acts.Work.run/2","doc":"iex> epic = %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: []}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Work.run(epic, act)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: []}\n\n iex> epic = %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: [\"error\"]}\n iex> act = %{}\n iex> Bonfire.Ecto.Acts.Work.run(epic, act)\n %Epic{assigns: %{Bonfire.Ecto.Acts.Work => [:some_changeset]}, errors: [\"error\"]}","ref":"Bonfire.Ecto.Acts.Work.html#run/2-examples"},{"type":"module","title":"Bonfire.Epics","doc":"Epics are a extensible way of structuring tasks.\n\nThis library is designed to provide a structured way to define and execute complex workflows in Elixir applications. It introduces the concept of \"Epics\" and \"Acts\" to organize and run sequences of operations.","ref":"Bonfire.Epics.html"},{"type":"module","title":"Key components and concepts: - Bonfire.Epics","doc":"- `Bonfire.Epics.Epic`: An Epic represents a complete workflow or process. It's a container that holds a sequence of Acts to be executed, along with state information, errors, and assigned values.\n- `Bonfire.Epics.Act`: An Act is an individual step or operation within an Epic. Each Act is typically a module that implements a specific task or functionality.\n- Execution Flow & Parallel Execution: Epics are executed by running their Acts in sequence. The library provides mechanisms to define, modify, and run these sequences. The library supports running multiple Acts in parallel for improved performance in certain scenarios.\n- Shared State: An Epic can maintain state throughout its execution using the 'assigns' map, allowing data to be passed between Acts.\n- Configurable: Epics can be defined in configuration, including at runtime, making it easy to set up and modify workflows without changing code.\n- Database Transactions: See the `Bonfire.Ecto` library for helpers to queue changeset operations within Acts and then run them all together in a single transaction: https://github.com/bonfire-networks/bonfire_ecto\n- Error Handling: The library includes built-in error handling, allowing errors to be captured and associated with specific Acts within an Epic.\n\nThis library is particularly useful for applications that need to manage complex, multi-step tasks with error handling and state management. It provides a flexible and extensible way to define, configure, and execute these processes, making it easier to maintain and modify complex workflows.","ref":"Bonfire.Epics.html#module-key-components-and-concepts"},{"type":"module","title":"How it works - Bonfire.Epics","doc":"1. Each Act is implemented as a module with a `run/2` function that performs a specific task.\n2. Users define an Epic, either in code or configuration, as sequences of Acts.\n3. When the Epic is run, it executes each Act in sequence (or with some Acts optionally running in parallel), maintaining state and handling errors along the way. Acts can update the Epic's state, adding errors, and assigning values that can be used by subsequent Acts.\n4. After all Acts are executed, the final state of the Epic is returned, including any errors or assigned values.","ref":"Bonfire.Epics.html#module-how-it-works"},{"type":"module","title":"1. How to write an Act - Bonfire.Epics","doc":"Write a module with a `run/2` function that takes an Epic and an Act, performs a specific task, and returns an Epic.\n\n```elixir\ndefmodule Bonfire.Label.Acts.LabelObject do\n @moduledoc \"\"\"\n Takes an object and label and returns a changeset for labeling that object. \n Implements `Bonfire.Epics.Act`.\n\n Epic Options:\n * `:current_user` - user that will create the page, required.\n\n Act Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.\n \"\"\"\n\n use Arrows\n import Bonfire.Epics\n\n @doc false\n def run(epic, act) do\n current_user = Bonfire.Common.Utils.current_user(epic.assigns[:options])\n\n cond do\n epic.errors != [] ->\n maybe_debug(\n epic,\n act,\n length(epic.errors),\n \"Skipping due to epic errors\"\n )\n\n epic\n\n not (is_struct(current_user) or is_binary(current_user)) ->\n maybe_debug(\n epic,\n act,\n current_user,\n \"Skipping due to missing current_user\"\n )\n\n epic\n\n true ->\n as = Keyword.get(act.options, :as) || Keyword.get(act.options, :on, :label)\n object_key = Keyword.get(act.options, :object, :object)\n\n label = Keyword.get(epic.assigns[:options], as, [])\n object = Keyword.get(epic.assigns[:options], object_key, nil)\n\n Bonfire.Label.Labelling.label_object(label, object,\n return: :changeset,\n current_user: current_user\n )\n |> Map.put(:action, :insert)\n |> Bonfire.Epics.Epic.assign(epic, as, ...)\n |> Bonfire.Ecto.Acts.Work.add(:label)\n end\n end\nend\n```","ref":"Bonfire.Epics.html#module-1-how-to-write-an-act"},{"type":"module","title":"2. How to define an Epic - Bonfire.Epics","doc":"","ref":"Bonfire.Epics.html#module-2-how-to-define-an-epic"},{"type":"module","title":"Simple Epic where each Act executes sequentially - Bonfire.Epics","doc":"```elixir\n @page_act_opts [on: :page, attrs: :page_attrs]\n\n config :bonfire_pages, Bonfire.Pages,\n epics: [\n create: [\n # Create a changeset for insertion\n {Bonfire.Pages.Acts.Page.Create, @page_act_opts},\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, @page_act_opts},\n # a caretaker,\n {Bonfire.Me.Acts.Caretaker, @page_act_opts},\n # and a creator,\n {Bonfire.Me.Acts.Creator, @page_act_opts},\n # and possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, @page_act_opts},\n # possibly with uploaded files,\n {Bonfire.Files.Acts.AttachMedia, @page_act_opts},\n # with extracted tags fully hooked up,\n {Bonfire.Tag.Acts.Tag, @page_act_opts},\n # and the appropriate boundaries established,\n {Bonfire.Boundaries.Acts.SetBoundaries, @page_act_opts},\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, @page_act_opts}\n ]\n ]\n```","ref":"Bonfire.Epics.html#module-simple-epic-where-each-act-executes-sequentially"},{"type":"module","title":"Advanced Epic, where some Acts execute in parallel - Bonfire.Epics","doc":"```elixir\n config :bonfire_posts, Bonfire.Posts,\n epics: [\n publish: [\n # Create a changeset for insertion\n Bonfire.Posts.Acts.Posts.Publish,\n # These next 3 Acts are run in parallel\n [\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, on: :post},\n\n # assign a caretaker,\n {Bonfire.Me.Acts.Caretaker, on: :post},\n\n # record the creator,\n {Bonfire.Me.Acts.Creator, on: :post}\n ],\n # These next 4 Acts are run in parallel (they run after the previous 3 because they depend on the outputs of those Acts)\n [\n # possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, on: :post},\n\n # possibly occurring in a thread,\n {Bonfire.Social.Acts.Threaded, on: :post},\n\n # with extracted tags/mentions fully hooked up,\n {Bonfire.Tag.Acts.Tag, on: :post},\n\n # maybe set as sensitive,\n {Bonfire.Social.Acts.Sensitivity, on: :post}\n ],\n # These next 3 Acts are run in parallel (they run after the previous 4 because they depend on the outputs of those Acts)\n [\n # possibly with uploaded/linked media (optionally depends on URLPreviews),\n {Bonfire.Files.Acts.AttachMedia, on: :post},\n\n # with appropriate boundaries established (depends on Threaded),\n {Bonfire.Boundaries.Acts.SetBoundaries, on: :post},\n\n # summarised by an activity (possibly appearing in feeds),\n {Bonfire.Social.Acts.Activity, on: :post}\n ],\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Preload data & Publish live feed updates via (in-memory) PubSub\n {Bonfire.Social.Acts.LivePush, on: :post},\n\n # These steps are run in parallel\n [\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, on: :post},\n\n # Prepare JSON for federation and add to queue (oban).\n {Bonfire.Social.Acts.Federate, on: :post}\n ],\n\n # Once the activity/object exists (depends on federation being done)\n {Bonfire.Tags.Acts.AutoBoost, on: :post}\n ]\n ]\n```","ref":"Bonfire.Epics.html#module-advanced-epic-where-some-acts-execute-in-parallel"},{"type":"module","title":"3. How to run an Epic - Bonfire.Epics","doc":"```elixir\nBonfire.Epics.run_epic(Bonfire.Posts, :publish, on: :post)\n```","ref":"Bonfire.Epics.html#module-3-how-to-run-an-epic"},{"type":"module","title":"Copyright and License - Bonfire.Epics","doc":"Copyright (c) 2022 Bonfire Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Bonfire.Epics.html#module-copyright-and-license"},{"type":"macro","title":"Bonfire.Epics.maybe_debug/3","doc":"","ref":"Bonfire.Epics.html#maybe_debug/3"},{"type":"macro","title":"Bonfire.Epics.maybe_debug/4","doc":"","ref":"Bonfire.Epics.html#maybe_debug/4"},{"type":"function","title":"Bonfire.Epics.run_epic/3","doc":"Runs a series of `Bonfire.Epics.Epic` operations based on configured Acts for this module.","ref":"Bonfire.Epics.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Epics.run_epic/3","doc":"- `config_key`: The config key from which to load the Epic definition, such as a module name.\n- `type`: The type of epic operation to run.\n- `options`: Options for the epic operation, including `:on` for the key in the epic assigns to return on success (default to `:result`).","ref":"Bonfire.Epics.html#run_epic/3-parameters"},{"type":"function","title":"Returns - Bonfire.Epics.run_epic/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Epics.html#run_epic/3-returns"},{"type":"function","title":"Examples - Bonfire.Epics.run_epic/3","doc":"# runs an Epic defined in config at `config :bonfire_posts, Bonfire.Posts, epics: [publish: [...]]`\n iex> Bonfire.Epics.run_epic(Bonfire.Posts, :publish, [on: :post])\n {:ok, %{}}","ref":"Bonfire.Epics.html#run_epic/3-examples"},{"type":"macro","title":"Bonfire.Epics.smart/4","doc":"Like `debug`, but will omit fully outputting the inspectable thing\nand still print the message if only `:debug` is set","ref":"Bonfire.Epics.html#smart/4"},{"type":"behaviour","title":"Bonfire.Epics.Act","doc":"Represents an individual Act within an Epic.\n\nAn Act is a struct containing a module to be executed, options, and metadata.\n\nThis module provides functionality to create new Acts and define their behavior. See `Bonfire.Epics` docs for an example Act.","ref":"Bonfire.Epics.Act.html"},{"type":"macro","title":"Bonfire.Epics.Act.debug/3","doc":"","ref":"Bonfire.Epics.Act.html#debug/3"},{"type":"function","title":"Bonfire.Epics.Act.new/1","doc":"Creates a new Act for the given module.","ref":"Bonfire.Epics.Act.html#new/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/1","doc":"- `module`: The module to be executed.","ref":"Bonfire.Epics.Act.html#new/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/1","doc":"iex> Bonfire.Epics.Act.new(MyActModule)\n %Bonfire.Epics.Act{module: MyActModule, options: [], meta: nil}","ref":"Bonfire.Epics.Act.html#new/1-examples"},{"type":"function","title":"Bonfire.Epics.Act.new/2","doc":"Creates a new Act for the given module, with options.","ref":"Bonfire.Epics.Act.html#new/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/2","doc":"- `module`: The module to be executed.\n- `options`: A keyword list of options for the Act.","ref":"Bonfire.Epics.Act.html#new/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/2","doc":"iex> Bonfire.Epics.Act.new(MyActModule, [option1: :value1])\n %Bonfire.Epics.Act{module: MyActModule, options: [option1: :value1], meta: nil}","ref":"Bonfire.Epics.Act.html#new/2-examples"},{"type":"function","title":"Bonfire.Epics.Act.new/3","doc":"Creates a new Act for the given module, with options and metadata.","ref":"Bonfire.Epics.Act.html#new/3"},{"type":"function","title":"Parameters - Bonfire.Epics.Act.new/3","doc":"- `module`: The module to be executed.\n- `options`: A keyword list of options for the Act.\n- `meta`: Any additional metadata for the Act.","ref":"Bonfire.Epics.Act.html#new/3-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Act.new/3","doc":"iex> Bonfire.Epics.Act.new(MyActModule, [option1: :value1], %{extra: \"data\"})\n %Bonfire.Epics.Act{module: MyActModule, options: [option1: :value1], meta: %{extra: \"data\"}}","ref":"Bonfire.Epics.Act.html#new/3-examples"},{"type":"callback","title":"Bonfire.Epics.Act.run/2","doc":"Callback for running an Act.\n\nThis function should be implemented by modules that define Acts.","ref":"Bonfire.Epics.Act.html#c:run/2"},{"type":"callback","title":"Parameters - Bonfire.Epics.Act.run/2","doc":"- `epic`: The current Epic struct.\n- `act`: The current Act struct.","ref":"Bonfire.Epics.Act.html#c:run/2-parameters"},{"type":"callback","title":"Returns - Bonfire.Epics.Act.run/2","doc":"The return value can be one of the following:\n- `Epic.t()`\n- `Act.t()`\n- `{:ok, Epic.t()}`\n- `{:ok, Act.t()}`\n- `{:ok, Epic.t(), Act.t()}`\n- `{:error, any}`","ref":"Bonfire.Epics.Act.html#c:run/2-returns"},{"type":"type","title":"Bonfire.Epics.Act.ret/0","doc":"","ref":"Bonfire.Epics.Act.html#t:ret/0"},{"type":"type","title":"Bonfire.Epics.Act.t/0","doc":"Represents an Act struct.\n\n- `:module` - The module to be executed.\n- `:options` - A keyword list of options for the Act.\n- `:meta` - Any additional metadata for the Act.","ref":"Bonfire.Epics.Act.html#t:t/0"},{"type":"module","title":"Bonfire.Epics.Debug","doc":"","ref":"Bonfire.Epics.Debug.html"},{"type":"function","title":"Bonfire.Epics.Debug.do_maybe_debug/4","doc":"","ref":"Bonfire.Epics.Debug.html#do_maybe_debug/4"},{"type":"function","title":"Bonfire.Epics.Debug.opts/2","doc":"","ref":"Bonfire.Epics.Debug.html#opts/2"},{"type":"module","title":"Bonfire.Epics.Epic","doc":"Represents and manages an Epic, which is a sequence of Acts to be executed.\n\nAn Epic is a struct containing lists of previous and next steps, errors, and assigns.\n\nThis module provides functionality to create, modify, and run Epics, as well as handle errors\nand debugging.","ref":"Bonfire.Epics.Epic.html"},{"type":"function","title":"Bonfire.Epics.Epic.add_error/2","doc":"Adds an error to the Epic.","ref":"Bonfire.Epics.Epic.html#add_error/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.add_error/2","doc":"- `epic`: The Epic struct.\n- `error`: The Error struct to add.","ref":"Bonfire.Epics.Epic.html#add_error/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.add_error/2","doc":"iex> epic = %Bonfire.Epics.Epic{}\n iex> error = %Bonfire.Epics.Error{error: \"Something went wrong\"}\n iex> Bonfire.Epics.Epic.add_error(epic, error)\n %Bonfire.Epics.Epic{errors: [%Bonfire.Epics.Error{error: \"Something went wrong\"}]}","ref":"Bonfire.Epics.Epic.html#add_error/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.add_error/5","doc":"","ref":"Bonfire.Epics.Epic.html#add_error/5"},{"type":"function","title":"Bonfire.Epics.Epic.append/2","doc":"Appends Act(s) to the end of the Epic's next steps.","ref":"Bonfire.Epics.Epic.html#append/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.append/2","doc":"- `self`: The Epic struct.\n- `acts`: A list of Acts or a single Act to append.","ref":"Bonfire.Epics.Epic.html#append/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.append/2","doc":"iex> epic = %Bonfire.Epics.Epic{next: [Act1]}\n iex> Bonfire.Epics.Epic.append(epic, [Act2])\n %Bonfire.Epics.Epic{next: [Act1, Act2]}","ref":"Bonfire.Epics.Epic.html#append/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.assign/3","doc":"Assigns a value to the Epic's assigns.","ref":"Bonfire.Epics.Epic.html#assign/3"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.assign/3","doc":"- `self`: The Epic struct.\n- `name`: The atom key for the assign.\n- `value`: The value to assign.","ref":"Bonfire.Epics.Epic.html#assign/3-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.assign/3","doc":"iex> epic = %Bonfire.Epics.Epic{}\n iex> Bonfire.Epics.Epic.assign(epic, :foo, \"bar\")\n %Bonfire.Epics.Epic{assigns: %{foo: \"bar\"}}","ref":"Bonfire.Epics.Epic.html#assign/3-examples"},{"type":"macro","title":"Bonfire.Epics.Epic.debug/3","doc":"","ref":"Bonfire.Epics.Epic.html#debug/3"},{"type":"function","title":"Bonfire.Epics.Epic.from_config!/2","doc":"Loads an epic from the app's config.","ref":"Bonfire.Epics.Epic.html#from_config!/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.from_config!/2","doc":"- `config_key`: The config key to load, such as a module atom (in which case it will load it from that module's app config).\n- `name`: The name atom of the epic in the config.","ref":"Bonfire.Epics.Epic.html#from_config!/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.from_config!/2","doc":"iex> Bonfire.Epics.Epic.from_config!(MyApp.Module, :my_epic)\n %Bonfire.Epics.Epic{...}\n\n iex> Bonfire.Epics.Epic.from_config!(:my_key, :my_other_epic)\n %Bonfire.Epics.Epic{...}","ref":"Bonfire.Epics.Epic.html#from_config!/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.from_spec!/1","doc":"Creates an `Epic` from a specification of steps.","ref":"Bonfire.Epics.Epic.html#from_spec!/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.from_spec!/1","doc":"- `acts`: A list of act specifications.","ref":"Bonfire.Epics.Epic.html#from_spec!/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.from_spec!/1","doc":"iex> Bonfire.Epics.Epic.from_spec!([MyAct, {OtherAct, [option: :value]}])\n %Bonfire.Epics.Epic{...}","ref":"Bonfire.Epics.Epic.html#from_spec!/1-examples"},{"type":"macro","title":"Bonfire.Epics.Epic.maybe_debug/3","doc":"","ref":"Bonfire.Epics.Epic.html#maybe_debug/3"},{"type":"function","title":"Bonfire.Epics.Epic.new/1","doc":"Creates a new Epic with the given list of next steps.","ref":"Bonfire.Epics.Epic.html#new/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.new/1","doc":"- `next`: A list of Acts to be executed.","ref":"Bonfire.Epics.Epic.html#new/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.new/1","doc":"iex> Bonfire.Epics.Epic.new([MyAct, OtherAct])\n %Bonfire.Epics.Epic{next: [MyAct, OtherAct]}","ref":"Bonfire.Epics.Epic.html#new/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.prepend/2","doc":"Prepends Act(s) to the beginning of the Epic's next steps.","ref":"Bonfire.Epics.Epic.html#prepend/2"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.prepend/2","doc":"- `self`: The Epic struct.\n- `acts`: A list of Acts or a single Act to prepend.","ref":"Bonfire.Epics.Epic.html#prepend/2-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.prepend/2","doc":"iex> epic = %Bonfire.Epics.Epic{next: [Act2]}\n iex> Bonfire.Epics.Epic.prepend(epic, [Act1])\n %Bonfire.Epics.Epic{next: [Act1, Act2]}","ref":"Bonfire.Epics.Epic.html#prepend/2-examples"},{"type":"function","title":"Bonfire.Epics.Epic.render_errors/1","doc":"Renders all errors in the Epic as a string.","ref":"Bonfire.Epics.Epic.html#render_errors/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.render_errors/1","doc":"- `epic`: The Epic struct containing errors.","ref":"Bonfire.Epics.Epic.html#render_errors/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.render_errors/1","doc":"iex> epic = %Bonfire.Epics.Epic{errors: [%Bonfire.Epics.Error{error: \"Error 1\"}, %Bonfire.Epics.Error{error: \"Error 2\"}]}\n iex> Bonfire.Epics.Epic.render_errors(epic)\n \"Error 1\\nError 2\"","ref":"Bonfire.Epics.Epic.html#render_errors/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.run/1","doc":"Runs the Epic, executing each Act in sequence (with some Acts optionally running in parallel).","ref":"Bonfire.Epics.Epic.html#run/1"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.run/1","doc":"- `epic`: The Epic struct to run.","ref":"Bonfire.Epics.Epic.html#run/1-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.run/1","doc":"iex> epic = Bonfire.Epics.Epic.new([MyAct, OtherAct])\n iex> Bonfire.Epics.Epic.run(epic)\n %Bonfire.Epics.Epic{prev: [OtherAct, MyAct], next: [], ...}","ref":"Bonfire.Epics.Epic.html#run/1-examples"},{"type":"function","title":"Bonfire.Epics.Epic.update/4","doc":"Updates an assign in the Epic using a function.","ref":"Bonfire.Epics.Epic.html#update/4"},{"type":"function","title":"Parameters - Bonfire.Epics.Epic.update/4","doc":"- `self`: The Epic struct.\n- `name`: The atom key for the assign.\n- `default`: The default value if the assign doesn't exist.\n- `fun`: The function to apply to the current value.","ref":"Bonfire.Epics.Epic.html#update/4-parameters"},{"type":"function","title":"Examples - Bonfire.Epics.Epic.update/4","doc":"iex> epic = %Bonfire.Epics.Epic{assigns: %{count: 1}}\n iex> Bonfire.Epics.Epic.update(epic, :count, 0, &(&1 + 1))\n %Bonfire.Epics.Epic{assigns: %{count: 2}}","ref":"Bonfire.Epics.Epic.html#update/4-examples"},{"type":"type","title":"Bonfire.Epics.Epic.t/0","doc":"Represents an Epic struct.\n\n- `:prev` - List of Acts that have already been run.\n- `:next` - List of remaining Acts to be run (may be modified during run).\n- `:errors` - List of errors (accrued during run).\n- `:assigns` - Map of assigned values (may be modified during run).","ref":"Bonfire.Epics.Epic.html#t:t/0"},{"type":"exception","title":"Bonfire.Epics.Error","doc":"","ref":"Bonfire.Epics.Error.html"},{"type":"function","title":"Bonfire.Epics.Error.message/1","doc":"","ref":"Bonfire.Epics.Error.html#message/1"},{"type":"module","title":"Bonfire.Epics.Test","doc":"","ref":"Bonfire.Epics.Test.html"},{"type":"macro","title":"Bonfire.Epics.Test.assert_epic_ok/1","doc":"","ref":"Bonfire.Epics.Test.html#assert_epic_ok/1"},{"type":"function","title":"Bonfire.Epics.Test.debug_error/1","doc":"","ref":"Bonfire.Epics.Test.html#debug_error/1"},{"type":"module","title":"Bonfire.Files","doc":"File management extension for Bonfire. \n\nBonfire Files wraps the `Entrepot` a file management library, \nadding support for media type checking, image resizing, and the like, \nalong with creating a [pointable][1] table for storage of file data.\n\n[1]: https://github.com/bonfire-networks/needle","ref":"Bonfire.Files.html"},{"type":"module","title":"Configuration - Bonfire.Files","doc":"","ref":"Bonfire.Files.html#module-configuration"},{"type":"module","title":"TODO's - Bonfire.Files","doc":"- Generate docs\n- More tests\n\n\nThis module contains general functions for handling files, and also an Ecto schema which is a multimixin for storing one or more media attached to a Pointable object.\n\nAn uploader definition must be provided for each upload, or will be automatically chosen based on the file type.\n\nA few definitions exist as defaults inside of this namespace, but you can also define\nyour own - a `Bonfire.Files.Definition` is an extension of `Waffle.Definition`,\nhowever the `allowed_media_types/0` and `max_file_size/0` callback are added,\nwith which you need to define what media types are accepted for these types of uploads.\n(You can also return `:all` to accept all media types).\n\nTo use the uploader:\n\n iex> {:ok, media} = Bonfire.Files.upload(MyUploader, creator_or_context, %{path: \"./150.png\"})\n iex> media.media_type\n \"image/png\"\n iex> Bonfire.Files.remote_url(MyUploader, media)\n \"/uploads/my/01F3AY6JV30G06BY4DR9BTW5EH\"","ref":"Bonfire.Files.html#module-todo-s"},{"type":"function","title":"Bonfire.Files.ap_publish_activity/1","doc":"","ref":"Bonfire.Files.html#ap_publish_activity/1"},{"type":"function","title":"Bonfire.Files.ap_receive_attachments/2","doc":"","ref":"Bonfire.Files.html#ap_receive_attachments/2"},{"type":"function","title":"Bonfire.Files.data_url/2","doc":"","ref":"Bonfire.Files.html#data_url/2"},{"type":"function","title":"Bonfire.Files.delete/2","doc":"","ref":"Bonfire.Files.html#delete/2"},{"type":"function","title":"Bonfire.Files.delete_files/3","doc":"","ref":"Bonfire.Files.html#delete_files/3"},{"type":"function","title":"Bonfire.Files.extract_metadata/1","doc":"","ref":"Bonfire.Files.html#extract_metadata/1"},{"type":"function","title":"Bonfire.Files.file_extension/1","doc":"","ref":"Bonfire.Files.html#file_extension/1"},{"type":"function","title":"Bonfire.Files.file_extension_only/1","doc":"","ref":"Bonfire.Files.html#file_extension_only/1"},{"type":"function","title":"Bonfire.Files.full_url/3","doc":"","ref":"Bonfire.Files.html#full_url/3"},{"type":"function","title":"Bonfire.Files.get/3","doc":"","ref":"Bonfire.Files.html#get/3"},{"type":"function","title":"Bonfire.Files.local_path/3","doc":"","ref":"Bonfire.Files.html#local_path/3"},{"type":"function","title":"Bonfire.Files.normalise_size/2","doc":"","ref":"Bonfire.Files.html#normalise_size/2"},{"type":"function","title":"Bonfire.Files.put/3","doc":"","ref":"Bonfire.Files.html#put/3"},{"type":"function","title":"Bonfire.Files.remote_url/3","doc":"Return the URL that a local file has.","ref":"Bonfire.Files.html#remote_url/3"},{"type":"function","title":"Bonfire.Files.upload/5","doc":"Attempt to store a file, returning an upload, for any parent item that\nparticipates in the meta abstraction, providing the user/context of\nthe upload.","ref":"Bonfire.Files.html#upload/5"},{"type":"function","title":"Bonfire.Files.validate/3","doc":"","ref":"Bonfire.Files.html#validate/3"},{"type":"module","title":"Bonfire.Files.Acts.AttachMedia","doc":"Saves uploaded files as attachments to the post.\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.\n * `:uploads` - epic options key to find the uploaded media objects at, default: `:uploaded_media`.","ref":"Bonfire.Files.Acts.AttachMedia.html"},{"type":"function","title":"Bonfire.Files.Acts.AttachMedia.cast/2","doc":"","ref":"Bonfire.Files.Acts.AttachMedia.html#cast/2"},{"type":"function","title":"Bonfire.Files.Acts.AttachMedia.run/2","doc":"","ref":"Bonfire.Files.Acts.AttachMedia.html#run/2"},{"type":"module","title":"Bonfire.Files.Acts.Delete","doc":"An act that deletes media","ref":"Bonfire.Files.Acts.Delete.html"},{"type":"module","title":"Bonfire.Files.Acts.URLPreviews","doc":"Fetch and save metadata of URLs\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.\n * `:uploads` - epic options key to find the uploaded media objects at, default: `:urls`.","ref":"Bonfire.Files.Acts.URLPreviews.html"},{"type":"function","title":"Bonfire.Files.Acts.URLPreviews.maybe_fetch_and_save/3","doc":"","ref":"Bonfire.Files.Acts.URLPreviews.html#maybe_fetch_and_save/3"},{"type":"function","title":"Bonfire.Files.Acts.URLPreviews.run/2","doc":"","ref":"Bonfire.Files.Acts.URLPreviews.html#run/2"},{"type":"module","title":"Bonfire.Files.BannerUploader","doc":"Uploader for larger images, for example, a profile page banner.\n\nDoes not do any type of image resizing/thumbnailing.","ref":"Bonfire.Files.BannerUploader.html"},{"type":"function","title":"Bonfire.Files.BannerUploader.acl/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.asset_host/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.async/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.attach/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.blurhash/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.blurred/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.bucket/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.bucket/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.default_url/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.default_url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.delete/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.filename/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.max_height/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#max_height/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.max_width/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.prepare/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.remote_url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.BannerUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.BannerUploader.store/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.transform/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.upload/4","doc":"","ref":"Bonfire.Files.BannerUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.url/3","doc":"","ref":"Bonfire.Files.BannerUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.BannerUploader.urls/2","doc":"","ref":"Bonfire.Files.BannerUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.BannerUploader.validate/1","doc":"","ref":"Bonfire.Files.BannerUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.Blurred","doc":"","ref":"Bonfire.Files.Blurred.html"},{"type":"function","title":"Bonfire.Files.Blurred.blurhash/2","doc":"","ref":"Bonfire.Files.Blurred.html#blurhash/2"},{"type":"function","title":"Bonfire.Files.Blurred.blurhash_cached/1","doc":"","ref":"Bonfire.Files.Blurred.html#blurhash_cached/1"},{"type":"function","title":"Bonfire.Files.Blurred.blurred/2","doc":"Create a blurred JPEG (deprecated in favour of blurhash)","ref":"Bonfire.Files.Blurred.html#blurred/2"},{"type":"function","title":"Bonfire.Files.Blurred.make_blurhash/1","doc":"","ref":"Bonfire.Files.Blurred.html#make_blurhash/1"},{"type":"module","title":"Bonfire.Files.CapsuleIntegration.Attacher","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.attach/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#attach/3"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.storages/2","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#storages/2"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.store/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#store/3"},{"type":"function","title":"Bonfire.Files.CapsuleIntegration.Attacher.upload/3","doc":"","ref":"Bonfire.Files.CapsuleIntegration.Attacher.html#upload/3"},{"type":"module","title":"Bonfire.Files.DOI","doc":"","ref":"Bonfire.Files.DOI.html"},{"type":"function","title":"Bonfire.Files.DOI.fetch/2","doc":"","ref":"Bonfire.Files.DOI.html#fetch/2"},{"type":"function","title":"Bonfire.Files.DOI.fetch_crossref/1","doc":"","ref":"Bonfire.Files.DOI.html#fetch_crossref/1"},{"type":"function","title":"Bonfire.Files.DOI.is_doi?/1","doc":"","ref":"Bonfire.Files.DOI.html#is_doi?/1"},{"type":"function","title":"Bonfire.Files.DOI.is_pub_id_or_uri_match?/1","doc":"","ref":"Bonfire.Files.DOI.html#is_pub_id_or_uri_match?/1"},{"type":"function","title":"Bonfire.Files.DOI.maybe_fetch/1","doc":"","ref":"Bonfire.Files.DOI.html#maybe_fetch/1"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_and_uri_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_and_uri_matchers/0"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_matcher/1","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_matcher/1"},{"type":"function","title":"Bonfire.Files.DOI.pub_id_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_id_matchers/0"},{"type":"function","title":"Bonfire.Files.DOI.pub_uri_matchers/0","doc":"","ref":"Bonfire.Files.DOI.html#pub_uri_matchers/0"},{"type":"behaviour","title":"Bonfire.Files.Definition","doc":"Extension to Waffle.Definition, adding support for checking against media types\nparsed through magic bytes instead of file extensions, which can be modified by the user.\n\nYou can still use validate/2 and other waffle callbacks.","ref":"Bonfire.Files.Definition.html"},{"type":"callback","title":"Bonfire.Files.Definition.allowed_media_types/0","doc":"","ref":"Bonfire.Files.Definition.html#c:allowed_media_types/0"},{"type":"callback","title":"Bonfire.Files.Definition.max_file_size/0","doc":"","ref":"Bonfire.Files.Definition.html#c:max_file_size/0"},{"type":"module","title":"Bonfire.Files.DocumentUploader","doc":"","ref":"Bonfire.Files.DocumentUploader.html"},{"type":"function","title":"Bonfire.Files.DocumentUploader.acl/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.asset_host/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.async/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.attach/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.blurhash/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.blurred/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.bucket/0","doc":"Definition for any type of document, allows most media types\nthat support documents, archives, video and audio.","ref":"Bonfire.Files.DocumentUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.bucket/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.default_url/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.default_url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.delete/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.filename/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.prepare/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.remote_url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.DocumentUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.DocumentUploader.store/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.transform/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.upload/4","doc":"","ref":"Bonfire.Files.DocumentUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.url/3","doc":"","ref":"Bonfire.Files.DocumentUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.DocumentUploader.urls/2","doc":"","ref":"Bonfire.Files.DocumentUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.DocumentUploader.validate/1","doc":"","ref":"Bonfire.Files.DocumentUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.EmojiUploader","doc":"","ref":"Bonfire.Files.EmojiUploader.html"},{"type":"function","title":"Bonfire.Files.EmojiUploader.acl/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.add_emoji/4","doc":"","ref":"Bonfire.Files.EmojiUploader.html#add_emoji/4"},{"type":"function","title":"Bonfire.Files.EmojiUploader.asset_host/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.async/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.attach/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.blurhash/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.blurred/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.EmojiUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.bucket/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.default_url/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.default_url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.delete/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.filename/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.list/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#list/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.media_put_setting/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#media_put_setting/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare_meta/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare_meta/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.prepare_setting/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#prepare_setting/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.put_setting/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#put_setting/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.remote_url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.EmojiUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.EmojiUploader.store/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.transform/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.upload/4","doc":"","ref":"Bonfire.Files.EmojiUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.url/3","doc":"","ref":"Bonfire.Files.EmojiUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.EmojiUploader.urls/2","doc":"","ref":"Bonfire.Files.EmojiUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.EmojiUploader.validate/1","doc":"","ref":"Bonfire.Files.EmojiUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.FaviconStore","doc":"","ref":"Bonfire.Files.FaviconStore.html"},{"type":"function","title":"Bonfire.Files.FaviconStore.acl/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#acl/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.asset_host/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.async/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#async/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.attach/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#attach/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.blurhash/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.blurred/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#blurred/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.bucket/0","doc":"Definition for storing media types for a URL","ref":"Bonfire.Files.FaviconStore.html#bucket/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.bucket/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#bucket/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.cached_or_async_fetch_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#cached_or_async_fetch_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.cached_or_fetch/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#cached_or_fetch/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.default_url/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#default_url/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.default_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#default_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.delete/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#delete/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.favicon_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#favicon_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.filename/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#filename/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.prefix_dir/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.prepare/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#prepare/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.remote_file_headers/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.remote_url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.s3_object_headers/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.storage_dir/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.FaviconStore.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.FaviconStore.store/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#store/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.transform/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#transform/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.upload/4","doc":"","ref":"Bonfire.Files.FaviconStore.html#upload/4"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/1"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.url/3","doc":"","ref":"Bonfire.Files.FaviconStore.html#url/3"},{"type":"function","title":"Bonfire.Files.FaviconStore.urls/2","doc":"","ref":"Bonfire.Files.FaviconStore.html#urls/2"},{"type":"function","title":"Bonfire.Files.FaviconStore.validate/1","doc":"","ref":"Bonfire.Files.FaviconStore.html#validate/1"},{"type":"module","title":"Bonfire.Files.FileDenied","doc":"","ref":"Bonfire.Files.FileDenied.html"},{"type":"function","title":"Bonfire.Files.FileDenied.new/1","doc":"","ref":"Bonfire.Files.FileDenied.html#new/1"},{"type":"type","title":"Bonfire.Files.FileDenied.t/0","doc":"","ref":"Bonfire.Files.FileDenied.html#t:t/0"},{"type":"module","title":"Bonfire.Files.IconUploader","doc":"","ref":"Bonfire.Files.IconUploader.html"},{"type":"function","title":"Bonfire.Files.IconUploader.acl/2","doc":"","ref":"Bonfire.Files.IconUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.IconUploader.asset_host/0","doc":"","ref":"Bonfire.Files.IconUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.IconUploader.async/0","doc":"","ref":"Bonfire.Files.IconUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.IconUploader.attach/2","doc":"","ref":"Bonfire.Files.IconUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.IconUploader.blurhash/1","doc":"","ref":"Bonfire.Files.IconUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.IconUploader.blurred/1","doc":"","ref":"Bonfire.Files.IconUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.IconUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.IconUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.IconUploader.bucket/1","doc":"","ref":"Bonfire.Files.IconUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.IconUploader.default_url/1","doc":"","ref":"Bonfire.Files.IconUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.IconUploader.default_url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.delete/1","doc":"","ref":"Bonfire.Files.IconUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.IconUploader.filename/2","doc":"","ref":"Bonfire.Files.IconUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.IconUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.IconUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.IconUploader.prepare/1","doc":"","ref":"Bonfire.Files.IconUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.IconUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.IconUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.IconUploader.remote_url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.IconUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.IconUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.IconUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.IconUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.IconUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.IconUploader.store/1","doc":"","ref":"Bonfire.Files.IconUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.IconUploader.transform/2","doc":"","ref":"Bonfire.Files.IconUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.IconUploader.upload/4","doc":"","ref":"Bonfire.Files.IconUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.IconUploader.url/1","doc":"","ref":"Bonfire.Files.IconUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.IconUploader.url/2","doc":"","ref":"Bonfire.Files.IconUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.IconUploader.url/3","doc":"","ref":"Bonfire.Files.IconUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.IconUploader.urls/2","doc":"","ref":"Bonfire.Files.IconUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.IconUploader.validate/1","doc":"","ref":"Bonfire.Files.IconUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.ImageUploader","doc":"Uploader for larger images, for example, a profile page banner.\n\nDoes not do any type of image resizing/thumbnailing.","ref":"Bonfire.Files.ImageUploader.html"},{"type":"function","title":"Bonfire.Files.ImageUploader.acl/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.asset_host/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.async/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.attach/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.blurhash/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.blurred/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.bucket/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.bucket/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.default_url/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.default_url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.delete/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.filename/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.max_width/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.prepare/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.remote_url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.ImageUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.ImageUploader.store/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.transform/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.upload/4","doc":"","ref":"Bonfire.Files.ImageUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.url/3","doc":"","ref":"Bonfire.Files.ImageUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.ImageUploader.urls/2","doc":"","ref":"Bonfire.Files.ImageUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.ImageUploader.validate/1","doc":"","ref":"Bonfire.Files.ImageUploader.html#validate/1"},{"type":"module","title":"Bonfire.Files.LiveHandler","doc":"","ref":"Bonfire.Files.LiveHandler.html"},{"type":"function","title":"Bonfire.Files.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Files.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Files.LiveHandler.handle_progress/3","doc":"","ref":"Bonfire.Files.LiveHandler.html#handle_progress/3"},{"type":"function","title":"Bonfire.Files.LiveHandler.set_fallback/5","doc":"","ref":"Bonfire.Files.LiveHandler.html#set_fallback/5"},{"type":"macro","title":"Bonfire.Files.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Files.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Files.Media","doc":"","ref":"Bonfire.Files.Media.html"},{"type":"function","title":"Bonfire.Files.Media.ap_publish_activity/3","doc":"","ref":"Bonfire.Files.Media.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Files.Media.ap_receive_activity/3","doc":"","ref":"Bonfire.Files.Media.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Files.Media.context_module/0","doc":"","ref":"Bonfire.Files.Media.html#context_module/0"},{"type":"function","title":"Bonfire.Files.Media.delete/2","doc":"","ref":"Bonfire.Files.Media.html#delete/2"},{"type":"function","title":"Bonfire.Files.Media.description/1","doc":"","ref":"Bonfire.Files.Media.html#description/1"},{"type":"function","title":"Bonfire.Files.Media.federation_module/0","doc":"","ref":"Bonfire.Files.Media.html#federation_module/0"},{"type":"function","title":"Bonfire.Files.Media.get/3","doc":"","ref":"Bonfire.Files.Media.html#get/3"},{"type":"function","title":"Bonfire.Files.Media.get_by_path/1","doc":"","ref":"Bonfire.Files.Media.html#get_by_path/1"},{"type":"function","title":"Bonfire.Files.Media.hard_delete/2","doc":"Delete an upload, removing any associated files.","ref":"Bonfire.Files.Media.html#hard_delete/2"},{"type":"function","title":"Bonfire.Files.Media.insert/4","doc":"","ref":"Bonfire.Files.Media.html#insert/4"},{"type":"function","title":"Bonfire.Files.Media.many/2","doc":"","ref":"Bonfire.Files.Media.html#many/2"},{"type":"function","title":"Bonfire.Files.Media.media_label/1","doc":"","ref":"Bonfire.Files.Media.html#media_label/1"},{"type":"function","title":"Bonfire.Files.Media.one/2","doc":"","ref":"Bonfire.Files.Media.html#one/2"},{"type":"function","title":"Bonfire.Files.Media.put/3","doc":"","ref":"Bonfire.Files.Media.html#put/3"},{"type":"function","title":"Bonfire.Files.Media.query_module/0","doc":"","ref":"Bonfire.Files.Media.html#query_module/0"},{"type":"function","title":"Bonfire.Files.Media.schema_module/0","doc":"","ref":"Bonfire.Files.Media.html#schema_module/0"},{"type":"function","title":"Bonfire.Files.Media.soft_delete/1","doc":"Delete an upload, removing it from indexing, but the files remain available.","ref":"Bonfire.Files.Media.html#soft_delete/1"},{"type":"function","title":"Bonfire.Files.Media.unwrap/1","doc":"","ref":"Bonfire.Files.Media.html#unwrap/1"},{"type":"function","title":"Bonfire.Files.Media.update/3","doc":"","ref":"Bonfire.Files.Media.html#update/3"},{"type":"function","title":"Bonfire.Files.Media.update_by/2","doc":"","ref":"Bonfire.Files.Media.html#update_by/2"},{"type":"type","title":"Bonfire.Files.Media.t/0","doc":"","ref":"Bonfire.Files.Media.html#t:t/0"},{"type":"module","title":"Bonfire.Files.Media.Queries","doc":"","ref":"Bonfire.Files.Media.Queries.html"},{"type":"function","title":"Bonfire.Files.Media.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Files.Media.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Files.Media.Queries.query/1","doc":"","ref":"Bonfire.Files.Media.Queries.html#query/1"},{"type":"function","title":"Bonfire.Files.Media.Queries.query/2","doc":"","ref":"Bonfire.Files.Media.Queries.html#query/2"},{"type":"module","title":"Bonfire.Files.MediaEdit","doc":"","ref":"Bonfire.Files.MediaEdit.html"},{"type":"function","title":"Bonfire.Files.MediaEdit.banner/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#banner/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.blur/2","doc":"","ref":"Bonfire.Files.MediaEdit.html#blur/2"},{"type":"function","title":"Bonfire.Files.MediaEdit.dominant_color/3","doc":"Returns the dominant color of an image (given as path, binary, or stream) as HEX value.\n\n`bins` is an integer number of color frequency bins the image is divided into. The default is 10.","ref":"Bonfire.Files.MediaEdit.html#dominant_color/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.frame_to_scrub/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#frame_to_scrub/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.image/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#image/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.image_resize_thumbnail/4","doc":"","ref":"Bonfire.Files.MediaEdit.html#image_resize_thumbnail/4"},{"type":"function","title":"Bonfire.Files.MediaEdit.image_save_temp_file/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#image_save_temp_file/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail/2","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail/2"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail_pdf/1","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail_pdf/1"},{"type":"function","title":"Bonfire.Files.MediaEdit.thumbnail_video/3","doc":"","ref":"Bonfire.Files.MediaEdit.html#thumbnail_video/3"},{"type":"function","title":"Bonfire.Files.MediaEdit.video_convert/1","doc":"Converts video into a browser-supported format. NOTE: in dev mode on OSX, you can install ffmpeg with maximal features using https://gist.github.com/Piasy/b5dfd5c048eb69d1b91719988c0325d8?permalink_comment_id=3812563#gistcomment-3812563","ref":"Bonfire.Files.MediaEdit.html#video_convert/1"},{"type":"function","title":"Bonfire.Files.MediaEdit.video_image_thumbnail/4","doc":"","ref":"Bonfire.Files.MediaEdit.html#video_image_thumbnail/4"},{"type":"module","title":"Bonfire.Files.MimeTypes","doc":"","ref":"Bonfire.Files.MimeTypes.html"},{"type":"function","title":"Bonfire.Files.MimeTypes.extra_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#extra_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.image_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#image_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.supported_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#supported_media/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.unique_extension_for_mime/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#unique_extension_for_mime/0"},{"type":"function","title":"Bonfire.Files.MimeTypes.video_media/0","doc":"","ref":"Bonfire.Files.MimeTypes.html#video_media/0"},{"type":"module","title":"Bonfire.Files.Prepare","doc":"","ref":"Bonfire.Files.Prepare.html"},{"type":"function","title":"Bonfire.Files.Prepare.prepare/2","doc":"","ref":"Bonfire.Files.Prepare.html#prepare/2"},{"type":"module","title":"Bonfire.Files.Queues.VideoTranscode","doc":"WIP https://github.com/bonfire-networks/bonfire-app/issues/920","ref":"Bonfire.Files.Queues.VideoTranscode.html"},{"type":"function","title":"Bonfire.Files.Queues.VideoTranscode.transcode/1","doc":"","ref":"Bonfire.Files.Queues.VideoTranscode.html#transcode/1"},{"type":"module","title":"Bonfire.Files.ResponsiveImage","doc":"Resizes images at compile time (when possible) or runtime:\n\n```\nuse Bonfire.Files.ResponsiveImage\n\n~H( )\nor\n~H( )\n\nor for paths only known at runtime:\n~H( )\nor\n~H( )\n```","ref":"Bonfire.Files.ResponsiveImage.html"},{"type":"macro","title":"Bonfire.Files.ResponsiveImage.compile_src/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#compile_src/2"},{"type":"macro","title":"Bonfire.Files.ResponsiveImage.compile_srcset/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#compile_srcset/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize/1","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize/1"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.resize_timed/1","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#resize_timed/1"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.src/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#src/2"},{"type":"function","title":"Bonfire.Files.ResponsiveImage.srcset/2","doc":"","ref":"Bonfire.Files.ResponsiveImage.html#srcset/2"},{"type":"module","title":"Bonfire.Files.Routes","doc":"","ref":"Bonfire.Files.Routes.html"},{"type":"module","title":"Bonfire.Files.RuntimeConfig","doc":"","ref":"Bonfire.Files.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Files.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Files.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Files.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Files.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Files.Simulation","doc":"","ref":"Bonfire.Files.Simulation.html"},{"type":"function","title":"Bonfire.Files.Simulation.cleanup/1","doc":"","ref":"Bonfire.Files.Simulation.html#cleanup/1"},{"type":"function","title":"Bonfire.Files.Simulation.fake_upload/2","doc":"","ref":"Bonfire.Files.Simulation.html#fake_upload/2"},{"type":"function","title":"Bonfire.Files.Simulation.geometry/1","doc":"","ref":"Bonfire.Files.Simulation.html#geometry/1"},{"type":"function","title":"Bonfire.Files.Simulation.icon_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#icon_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.image_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#image_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.pdf_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#pdf_file/0"},{"type":"function","title":"Bonfire.Files.Simulation.text_file/0","doc":"","ref":"Bonfire.Files.Simulation.html#text_file/0"},{"type":"module","title":"Bonfire.Files.Versions","doc":"","ref":"Bonfire.Files.Versions.html"},{"type":"module","title":"Bonfire.Files.VideoUploader","doc":"","ref":"Bonfire.Files.VideoUploader.html"},{"type":"function","title":"Bonfire.Files.VideoUploader.acl/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#acl/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.asset_host/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#asset_host/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.async/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#async/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.attach/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#attach/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.blurhash/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#blurhash/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.blurred/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#blurred/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.bucket/0","doc":"Uploader for smaller image icons, usually used as avatars.\n\nTODO: Support resizing.","ref":"Bonfire.Files.VideoUploader.html#bucket/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.bucket/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#bucket/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.default_url/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#default_url/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.default_url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#default_url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.delete/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#delete/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.filename/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#filename/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.max_height/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#max_height/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.max_width/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#max_width/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.prefix_dir/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#prefix_dir/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.prepare/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#prepare/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.remote_file_headers/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#remote_file_headers/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.remote_url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#remote_url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.s3_object_headers/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#s3_object_headers/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.storage_dir/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#storage_dir/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.storage_dir_prefix/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#storage_dir_prefix/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.store/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#store/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.transform/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#transform/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.transform_timeout/0","doc":"","ref":"Bonfire.Files.VideoUploader.html#transform_timeout/0"},{"type":"function","title":"Bonfire.Files.VideoUploader.upload/4","doc":"","ref":"Bonfire.Files.VideoUploader.html#upload/4"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/1"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.url/3","doc":"","ref":"Bonfire.Files.VideoUploader.html#url/3"},{"type":"function","title":"Bonfire.Files.VideoUploader.urls/2","doc":"","ref":"Bonfire.Files.VideoUploader.html#urls/2"},{"type":"function","title":"Bonfire.Files.VideoUploader.validate/1","doc":"","ref":"Bonfire.Files.VideoUploader.html#validate/1"},{"type":"module","title":"Bonfire.Mailer","doc":"Email delivery is a crucial component of many web applications, including your Bonfire instance. It's used for various purposes such as:\n\n- Sending signup confirmation emails\n- Delivering password reset links\n- Notifying users of new messages or activities\n- Sending alerts to administrators or moderators\n\nTo set up email delivery for your Bonfire instance, you'll need to choose an email delivery method and configure it properly. This guide will help you through that process.","ref":"Bonfire.Mailer.html"},{"type":"module","title":"Before You Begin - Bonfire.Mailer","doc":"1. **Choose Email Delivery Method and/or Provider**: You may choose to sign up with one of the email service providers listed in this guide. Each provider has its own pricing, features, and delivery rates.\n\n2. **Domain Configuration**: To ensure reliable email delivery and avoid spam filters, you should configure your [email-related DNS settings](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance's domain name. This typically involves setting up:\n - MX (Mail Exchanger) records\n - SPF (Sender Policy Framework) records\n - DKIM (DomainKeys Identified Mail) records\n - DMARC (Domain-based Message Authentication, Reporting, and Conformance) records\n\nYour chosen email provider should provide instructions on how to set these up for your domain.\n\n3. **Environment Variables**: Bonfire uses environment variables for configuration. You'll need to set these variables in your deployment environment or in a `.env` file if you're running Bonfire locally or using Co-op Cloud.\n\nFor all email delivery methods, you'll need to set the following environment variables:\n\n- `MAIL_BACKEND` environment variable to choose your email delivery method or provider. \n- `MAIL_DOMAIN` or `HOSTNAME`: Your domain name\n- `MAIL_FROM`: The email address from which emails will be sent (this should match the domain name you set up with SPF/DKIM/DMARC, which will usually be your instance's domain)","ref":"Bonfire.Mailer.html#module-before-you-begin"},{"type":"module","title":"Choosing an Email Delivery Method - Bonfire.Mailer","doc":"","ref":"Bonfire.Mailer.html#module-choosing-an-email-delivery-method"},{"type":"module","title":"1. Default Behaviour: Direct SMTP Delivery - Bonfire.Mailer","doc":"If no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers. Here's what you need to know about this default behaviour:\n\n- **What it means**: Your server will try to connect directly to the recipient's email server (e.g. a provider such as Gmail or an organisation's own mail server) to deliver the email.\n\n- **Pros**: It requires no additional configuration and can work for basic setups.\n\n- **Cons**: This method is often unreliable and prone to several issues:\n 1. **Spam Filters**: Emails sent this way are more likely to be marked as spam or rejected entirely.\n 2. **Deliverability**: Many recipient servers may flat-out reject IP addresses not properly set up for email sending.\n 3. **DNS Configuration**: Without proper DNS records (SPF, DKIM, DMARK, etc.), your emails are more likely to be treated as suspicious.\n 4. **IP Reputation**: If your server's IP address isn't established as a legitimate email sender, deliverability will suffer.\n\n- **Important**: While this default method can work for testing or in very small-scale scenarios, it is strongly recommended to configure a proper email delivery service for any production use of Bonfire. If you want to try this method anyway, make sure to configure [SPF, DKIM, DMARK, etc.](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance domain name and IP address.","ref":"Bonfire.Mailer.html#module-1-default-behaviour-direct-smtp-delivery"},{"type":"module","title":"2. Managed Email Service Providers - Bonfire.Mailer","doc":"These providers offer comprehensive email delivery services, usually featuring analytics, bounce handling, high deliverability rates, etc.\n\n> Note: the information about free tiers and pricing are only meant to serve as a rough indication of the options available and may be outdated or inaccurate (we'd welcome PRs with any updates of course). Please check with each provider's website for more details.\n\n\n#### Brevo (formerly Sendinblue)\n- Website: [brevo.com](https://www.brevo.com/)\n- Free Tier: 300 emails per day, then $15+/month or pay-as-you-go ($59 per 10,000 emails) \n```\nMAIL_BACKEND=brevo\nMAIL_KEY=your_brevo_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailjet\n- Website: [mailjet.com](https://www.mailjet.com/)\n- Free Tier: 200 emails per day, then $17+/month\n```\nMAIL_BACKEND=mailjet\nMAIL_KEY=your_mailjet_api_key\nMAIL_PRIVATE_KEY=your_mailjet_secret_key\nMAIL_FROM=email@instance.domain\n```\n\n#### SMTP2GO\n- Website: [smtp2go.com](https://www.smtp2go.com/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $10+/month\n```\nMAIL_BACKEND=SMTP2GO\nMAIL_KEY=your_smtp2go_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailtrap \n- Website: [mailtrap.io](https://mailtrap.io/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $15+/month\n```\nMAIL_BACKEND=mailtrap\nMAIL_KEY=your_mailtrap_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailgun\n- Website: [www.mailgun.com](https://www.mailgun.com/)\n- Free Tier: 100 emails per day, then $15+/month\n```\nMAIL_BACKEND=mailgun\nMAIL_KEY=your_mailgun_api_key\nMAIL_BASE_URI=https://api.eu.mailgun.net/v3\nMAIL_FROM=email@instance.domain\n```\nNote: The `MAIL_BASE_URI` depends on your Mailgun registration region. The default is set to EU, adjust if necessary.\n\n#### Twilio SendGrid \n- Website: [sendgrid.com](https://sendgrid.com/)\n- Free Tier: 100 emails per day, then $20+/month\n```\nMAIL_BACKEND=sendgrid\nMAIL_KEY=your_sendgrid_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Postmark\n- Website: [postmarkapp.com](https://postmarkapp.com/)\n- Free Tier: 100 emails per month, then $15+/month\n```\nMAIL_BACKEND=postmark\nMAIL_KEY=your_postmark_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Zoho ZeptoMail\n- Website: [zoho.com](https://www.zoho.com/zeptomail/)\n- First 10,000 emails are free, then €2,50 per 10,000 emails\n```\nMAIL_BACKEND=zepto\nMAIL_KEY=your_zeptomail_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Scaleway\n- Website: [scaleway.com](https://www.scaleway.com/en/transactional-email-tem/)\n- No free tier, pay-as-you-go pricing (€2.50 per 10,000 emails)\n```\nMAIL_BACKEND=scaleway\nMAIL_KEY=your_scaleway_api_key\nMAIL_PROJECT_ID=your_scaleway_project_id\nMAIL_PRIVATE_KEY=your_scaleway_secret_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Gmail\n- Website: [gmail.com](https://developers.google.com/gmail/api)\n- Free Tier: 500 emails per day\n```\nMAIL_BACKEND=gmail\nMAIL_KEY=your_gmail_api_key \nMAIL_FROM=email@instance.domain\n# ^ OAuth2 access token with `gmail.compose` scope\n```\nNote: Using Gmail for sending application email is generally not recommended for production use.\n\n#### MailPace\n- Website: [mailpace.com](https://mailpace.com/)\n- No free tier, starts at £2.50 per month for up to 1,000 emails\n```\nMAIL_BACKEND=mailpace\nMAIL_KEY=your_mailpace_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mandrill (Mailchimp Transactional)\n- Website: [mailchimp.com](https://mailchimp.com/features/transactional-email/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=mandrill\nMAIL_KEY=your_mandrill_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Bird / SparkPost\n- Website: [bird.com](https://bird.com/api/email)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=sparkpost\nMAIL_KEY=your_sparkpost_api_key\nMAIL_BASE_URI=https://api.eu.sparkpost.com\nMAIL_FROM=email@instance.domain\n```\nNote: The `MAIL_BASE_URI` depends on your SparkPost registration region. The default is set to EU, adjust if necessary.\n\n#### Sendcloud (China)\n- Website: [sendcloud.net](https://www.sendcloud.net/)\n- Free Tier: 10 emails per day\n```\nMAIL_BACKEND=sendcloud\nMAIL_KEY=your_sendcloud_api_key\nMAIL_USER=your_sendcloud_api_user\nMAIL_FROM=email@instance.domain\n```\n\n#### SocketLabs\n- Website: [socketlabs.com](https://www.socketlabs.com/)\n- No free tier\n```\nMAIL_BACKEND=socketlabs\nMAIL_KEY=your_socketlabs_api_key\nMAIL_SERVER=your_socketlabs_server_id\nMAIL_PRIVATE_KEY=your_socketlabs_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Campaign Monitor\n- Website: [campaignmonitor.com](https://www.campaignmonitor.com/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=campaign_monitor\nMAIL_KEY=your_campaign_monitor_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Amazon AWS SES\n- Website: [aws.amazon.com](https://aws.amazon.com/ses/)\n- Free Tier: 3,000 message / month (only for the first 12 months, and extra AWS charges may still apply)\n\nAmazon SES can be configured in two ways:\n\n1. Using existing AWS credentials (if already configured for S3 file storage, you can simplify configuration and use the same AWS credentials for both file storage and email delivery):\n```\nMAIL_BACKEND=aws\nMAIL_FROM=email@instance.domain\n```\nNote: This method will automatically use the credentials set by `UPLOADS_S3_ACCESS_KEY_ID` and `UPLOADS_S3_SECRET_ACCESS_KEY`. No additional configuration is needed if these are already set up for a Bonfire extension (such as `Bonfire.Files`) which uses S3 file storage.\n\n2. Using dedicated credentials, if you don't use AWS for S3 file storage or you want to use different AWS accounts for file storage and email delivery:\n```\nMAIL_BACKEND=aws\nMAIL_KEY=your_aws_access_key_id\nMAIL_PRIVATE_KEY=your_aws_secret_access_key\nMAIL_REGION=your_aws_region\nMAIL_FROM=email@instance.domain\n```\n\nNote: \n- If not specified, `MAIL_REGION` defaults to \"eu-west-1\".","ref":"Bonfire.Mailer.html#module-2-managed-email-service-providers"},{"type":"module","title":"3. Direct Email Sending Methods - Bonfire.Mailer","doc":"These methods involve sending emails directly or through your own mail server. They require more setup and maintenance but offer more control.\n\n#### Default: Direct SMTP Delivery\n- When no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers.\n- No additional configuration is needed as this is the default behaviour, but it's not recommended for production use due to deliverability issues ([see above](#module-default-behaviour-direct-smtp-delivery)).\n\n#### SMTP\nSMTP (Simple Mail Transfer Protocol) is the standard method for sending emails across the internet. It's like the postal service for digital messages, ensuring your emails reach their destination regardless of the systems involved. While many opt for using a dedicated email delivery provider (see above), if you already run your own email server or use a provider that's not listed above which provides you with SMTP credentials, you can configure Bonfire to use that:\n\n```\nMAIL_BACKEND=smtp\nMAIL_SERVER=your_smtp_server\nMAIL_PORT=587\nMAIL_USER=your_smtp_username\nMAIL_PASSWORD=your_smtp_password\nMAIL_FROM=email@instance.domain\n```\n\nNotes: \n- `MAIL_PORT` defaults to 587 if not specified.\n\n#### Sendmail\n- Built into many Unix-like operating systems\n```\nMAIL_BACKEND=sendmail\nMAIL_SERVER=/path/to/sendmail\n# MAIL_ARGS=\nMAIL_QMAIL=true_or_false\nMAIL_FROM=email@instance.domain\n```\n\nNotes: \n- `MAIL_SERVER` defaults to `/usr/bin/sendmail` if not specified.\n- `MAIL_ARGS` defaults to `-N delay,failure,success` if not specified.\n- While sendmail can send mail directly (similar to the default behaviour), it can be set up to hand off emails to a local or remote SMTP server for delivery.\n- Using sendmail usually provides more control and logging capabilities compared to the default direct SMTP delivery.\n\n#### Postal\n- Self-hosted email delivery platform\n- Website: [postalserver.io](https://docs.postalserver.io)\n```\nMAIL_BACKEND=postal\nMAIL_KEY=your_postal_api_key\nMAIL_BASE_URI=https://your_postal_server_api.uri/\nMAIL_FROM=email@instance.domain\n```","ref":"Bonfire.Mailer.html#module-3-direct-email-sending-methods"},{"type":"module","title":"Copyright and License - Bonfire.Mailer","doc":"Copyright (c) 2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Mailer.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Mailer.app_name/0","doc":"","ref":"Bonfire.Mailer.html#app_name/0"},{"type":"function","title":"Bonfire.Mailer.deliver_async/1","doc":"","ref":"Bonfire.Mailer.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.from/2","doc":"","ref":"Bonfire.Mailer.html#from/2"},{"type":"function","title":"Bonfire.Mailer.handle_error/2","doc":"","ref":"Bonfire.Mailer.html#handle_error/2"},{"type":"function","title":"Bonfire.Mailer.html_body/2","doc":"","ref":"Bonfire.Mailer.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.new/1","doc":"","ref":"Bonfire.Mailer.html#new/1"},{"type":"function","title":"Bonfire.Mailer.send/4","doc":"","ref":"Bonfire.Mailer.html#send/4"},{"type":"function","title":"Bonfire.Mailer.send_app_feedback/3","doc":"","ref":"Bonfire.Mailer.html#send_app_feedback/3"},{"type":"function","title":"Bonfire.Mailer.send_async/3","doc":"","ref":"Bonfire.Mailer.html#send_async/3"},{"type":"function","title":"Bonfire.Mailer.send_now/3","doc":"","ref":"Bonfire.Mailer.html#send_now/3"},{"type":"function","title":"Bonfire.Mailer.start/2","doc":"","ref":"Bonfire.Mailer.html#start/2"},{"type":"function","title":"Bonfire.Mailer.subject/2","doc":"","ref":"Bonfire.Mailer.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.text_body/2","doc":"","ref":"Bonfire.Mailer.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.to/2","doc":"","ref":"Bonfire.Mailer.html#to/2"},{"type":"module","title":"Bonfire.Mailer.Bamboo","doc":"","ref":"Bonfire.Mailer.Bamboo.html"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_later/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_later/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_later!/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_later!/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_now/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_now/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.deliver_now!/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#deliver_now!/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.from/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#from/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.html_body/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.new/1","doc":"","ref":"Bonfire.Mailer.Bamboo.html#new/1"},{"type":"function","title":"Bonfire.Mailer.Bamboo.subject/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.text_body/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.Bamboo.to/2","doc":"","ref":"Bonfire.Mailer.Bamboo.html#to/2"},{"type":"behaviour","title":"Bonfire.Mailer.Behaviour","doc":"","ref":"Bonfire.Mailer.Behaviour.html"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:deliver_async/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:deliver_inline/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.from/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:from/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.html_body/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:html_body/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.new/0","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:new/0"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.new/1","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:new/1"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.subject/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:subject/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.text_body/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:text_body/2"},{"type":"callback","title":"Bonfire.Mailer.Behaviour.to/2","doc":"","ref":"Bonfire.Mailer.Behaviour.html#c:to/2"},{"type":"type","title":"Bonfire.Mailer.Behaviour.email/0","doc":"","ref":"Bonfire.Mailer.Behaviour.html#t:email/0"},{"type":"module","title":"Bonfire.Mailer.Checker","doc":"Functions for checking the validity of email addresses and domains","ref":"Bonfire.Mailer.Checker.html"},{"type":"function","title":"Bonfire.Mailer.Checker.validate_domain/1","doc":"Checks whether an email domain name is valid, returns a reason if not.\n\nThis function first checks if the domain matches a valid domain format using a regex.\nIf the format is valid, it then performs the same checks as `validate_email/1` on a test email address.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1"},{"type":"function","title":"Parameters - Bonfire.Mailer.Checker.validate_domain/1","doc":"- domain: The domain to validate as a binary string.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-parameters"},{"type":"function","title":"Returns - Bonfire.Mailer.Checker.validate_domain/1","doc":"- `:ok` if the domain is valid.\n - `{:error, :format}` if the domain format is invalid.\n - `{:error, :mx}` if the domain has no valid MX records.","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-returns"},{"type":"function","title":"Examples - Bonfire.Mailer.Checker.validate_domain/1","doc":"iex> Bonfire.Mailer.Checker.validate_domain(\"example.com\")\n :ok\n\n iex> Bonfire.Mailer.Checker.validate_domain(\"invalid-domain\")\n {:error, :format}\n\n iex> Bonfire.Mailer.Checker.validate_domain(\"nonexistent-domain.com\")\n {:error, :mx}","ref":"Bonfire.Mailer.Checker.html#validate_domain/1-examples"},{"type":"function","title":"Bonfire.Mailer.Checker.validate_email/1","doc":"Checks whether an email address is valid, returns a reason if not.\n\nThis function can perform two types of checks:\n1. Format check: Ensures the email address has a valid format.\n2. MX record check: Verifies the existence of MX records for the email domain.\n\nThe checks are enabled by default but can be disabled with `check_format: false` and `check_mx: false` on the `:bonfire_mailer` configuration.","ref":"Bonfire.Mailer.Checker.html#validate_email/1"},{"type":"function","title":"Parameters - Bonfire.Mailer.Checker.validate_email/1","doc":"- email: The email address to validate as a binary string.","ref":"Bonfire.Mailer.Checker.html#validate_email/1-parameters"},{"type":"function","title":"Returns - Bonfire.Mailer.Checker.validate_email/1","doc":"- `:ok` if the email is valid.\n - `{:error, :format}` if the email format is invalid.\n - `{:error, :mx}` if the email domain has no valid MX records.","ref":"Bonfire.Mailer.Checker.html#validate_email/1-returns"},{"type":"function","title":"Examples - Bonfire.Mailer.Checker.validate_email/1","doc":"iex> Bonfire.Mailer.Checker.validate_email(\"user@example.com\")\n :ok\n\n iex> Bonfire.Mailer.Checker.validate_email(\"invalid-email\")\n {:error, :format}\n\n iex> Bonfire.Mailer.Checker.validate_email(\"user@nonexistent-domain.com\")\n {:error, :mx}","ref":"Bonfire.Mailer.Checker.html#validate_email/1-examples"},{"type":"type","title":"Bonfire.Mailer.Checker.error_reason/0","doc":"","ref":"Bonfire.Mailer.Checker.html#t:error_reason/0"},{"type":"module","title":"Bonfire.Mailer.Render","doc":"","ref":"Bonfire.Mailer.Render.html"},{"type":"function","title":"Bonfire.Mailer.Render.default_layout/0","doc":"","ref":"Bonfire.Mailer.Render.html#default_layout/0"},{"type":"function","title":"Bonfire.Mailer.Render.maybe_with_layout/4","doc":"","ref":"Bonfire.Mailer.Render.html#maybe_with_layout/4"},{"type":"function","title":"Bonfire.Mailer.Render.new_templated/3","doc":"","ref":"Bonfire.Mailer.Render.html#new_templated/3"},{"type":"function","title":"Bonfire.Mailer.Render.render_templated/6","doc":"","ref":"Bonfire.Mailer.Render.html#render_templated/6"},{"type":"function","title":"Bonfire.Mailer.Render.render_to_string/3","doc":"","ref":"Bonfire.Mailer.Render.html#render_to_string/3"},{"type":"function","title":"Bonfire.Mailer.Render.render_to_string/4","doc":"","ref":"Bonfire.Mailer.Render.html#render_to_string/4"},{"type":"function","title":"Bonfire.Mailer.Render.templated/4","doc":"","ref":"Bonfire.Mailer.Render.html#templated/4"},{"type":"module","title":"Bonfire.Mailer.RuntimeConfig","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.bamboo_service/2","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#bamboo_service/2"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#config_module/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.mail_blackhole/1","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#mail_blackhole/1"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.mailer/0","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#mailer/0"},{"type":"function","title":"Bonfire.Mailer.RuntimeConfig.swoosh_service/2","doc":"","ref":"Bonfire.Mailer.RuntimeConfig.html#swoosh_service/2"},{"type":"module","title":"Bonfire.Mailer.Swoosh","doc":"","ref":"Bonfire.Mailer.Swoosh.html"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver/2","doc":"Delivers an email.\n\nIf the email is delivered it returns an `{:ok, result}` tuple. If it fails,\nreturns an `{:error, error}` tuple.","ref":"Bonfire.Mailer.Swoosh.html#deliver/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver!/2","doc":"Delivers an email, raises on error.\n\nIf the email is delivered, it returns the result. If it fails, it raises\na `DeliveryError`.","ref":"Bonfire.Mailer.Swoosh.html#deliver!/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_async/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#deliver_async/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_inline/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#deliver_inline/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.deliver_many/2","doc":"Delivers a list of emails.\n\nIt accepts a list of `%Swoosh.Email{}` as its first parameter.","ref":"Bonfire.Mailer.Swoosh.html#deliver_many/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.from/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#from/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.html_body/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#html_body/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.new/1","doc":"","ref":"Bonfire.Mailer.Swoosh.html#new/1"},{"type":"function","title":"Bonfire.Mailer.Swoosh.subject/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#subject/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.text_body/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#text_body/2"},{"type":"function","title":"Bonfire.Mailer.Swoosh.to/2","doc":"","ref":"Bonfire.Mailer.Swoosh.html#to/2"},{"type":"module","title":"Bonfire.Web.Endpoint","doc":"","ref":"Bonfire.Web.Endpoint.html"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast/3","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast/3"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast!/3","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast!/3"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast_from/4","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast_from/4"},{"type":"function","title":"Bonfire.Web.Endpoint.broadcast_from!/4","doc":"","ref":"Bonfire.Web.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"Bonfire.Web.Endpoint.call/2","doc":"","ref":"Bonfire.Web.Endpoint.html#call/2"},{"type":"function","title":"Bonfire.Web.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"Bonfire.Web.Endpoint.html#child_spec/1"},{"type":"function","title":"Bonfire.Web.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"Bonfire.Web.Endpoint.html#config/2"},{"type":"function","title":"Bonfire.Web.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"Bonfire.Web.Endpoint.html#config_change/2"},{"type":"function","title":"Bonfire.Web.Endpoint.generate_reverse_router!/1","doc":"(re)generates the reverse router (useful so it can be re-generated when extensions are enabled/disabled)","ref":"Bonfire.Web.Endpoint.html#generate_reverse_router!/1"},{"type":"function","title":"Bonfire.Web.Endpoint.halt_live_reload/2","doc":"","ref":"Bonfire.Web.Endpoint.html#halt_live_reload/2"},{"type":"function","title":"Bonfire.Web.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"Bonfire.Web.Endpoint.html#host/0"},{"type":"function","title":"Bonfire.Web.Endpoint.include_assets/1","doc":"","ref":"Bonfire.Web.Endpoint.html#include_assets/1"},{"type":"function","title":"Bonfire.Web.Endpoint.include_assets/2","doc":"","ref":"Bonfire.Web.Endpoint.html#include_assets/2"},{"type":"function","title":"Bonfire.Web.Endpoint.init/1","doc":"","ref":"Bonfire.Web.Endpoint.html#init/1"},{"type":"function","title":"Bonfire.Web.Endpoint.local_broadcast/3","doc":"","ref":"Bonfire.Web.Endpoint.html#local_broadcast/3"},{"type":"function","title":"Bonfire.Web.Endpoint.local_broadcast_from/4","doc":"","ref":"Bonfire.Web.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"Bonfire.Web.Endpoint.log_ip/2","doc":"","ref":"Bonfire.Web.Endpoint.html#log_ip/2"},{"type":"function","title":"Bonfire.Web.Endpoint.node_name/0","doc":"","ref":"Bonfire.Web.Endpoint.html#node_name/0"},{"type":"function","title":"Bonfire.Web.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"Bonfire.Web.Endpoint.html#path/1"},{"type":"function","title":"Bonfire.Web.Endpoint.publish_mutation/3","doc":"","ref":"Bonfire.Web.Endpoint.html#publish_mutation/3"},{"type":"function","title":"Bonfire.Web.Endpoint.publish_subscription/2","doc":"","ref":"Bonfire.Web.Endpoint.html#publish_subscription/2"},{"type":"function","title":"Bonfire.Web.Endpoint.reload!/1","doc":"","ref":"Bonfire.Web.Endpoint.html#reload!/1"},{"type":"function","title":"Bonfire.Web.Endpoint.script_name/0","doc":"Generates the script name.","ref":"Bonfire.Web.Endpoint.html#script_name/0"},{"type":"function","title":"Bonfire.Web.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"Bonfire.Web.Endpoint.html#server_info/1"},{"type":"function","title":"Bonfire.Web.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"Bonfire.Web.Endpoint.html#start_link/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_integrity/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_lookup/1"},{"type":"function","title":"Bonfire.Web.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"Bonfire.Web.Endpoint.html#static_path/1"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#static_url/0"},{"type":"function","title":"Bonfire.Web.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":"Bonfire.Web.Endpoint.html#struct_url/0"},{"type":"function","title":"Bonfire.Web.Endpoint.subscribe/2","doc":"","ref":"Bonfire.Web.Endpoint.html#subscribe/2"},{"type":"function","title":"Bonfire.Web.Endpoint.unsubscribe/1","doc":"","ref":"Bonfire.Web.Endpoint.html#unsubscribe/1"},{"type":"function","title":"Bonfire.Web.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"Bonfire.Web.Endpoint.html#url/0"},{"type":"module","title":"Bonfire.Web.FakeRemoteEndpoint","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast!/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast!/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast_from/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast_from/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.broadcast_from!/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#broadcast_from!/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.call/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#call/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#child_spec/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#config/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#config_change/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#host/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.init/1","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#init/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.local_broadcast/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#local_broadcast/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.local_broadcast_from/4","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#local_broadcast_from/4"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.log_ip/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#log_ip/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.node_name/0","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#node_name/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#path/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.publish_mutation/3","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#publish_mutation/3"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.publish_subscription/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#publish_subscription/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.script_name/0","doc":"Generates the script name.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#script_name/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"Bonfire.Web.FakeRemoteEndpoint.html#server_info/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#start_link/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_integrity/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_lookup/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#static_path/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#static_url/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.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":"Bonfire.Web.FakeRemoteEndpoint.html#struct_url/0"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.subscribe/2","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#subscribe/2"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.unsubscribe/1","doc":"","ref":"Bonfire.Web.FakeRemoteEndpoint.html#unsubscribe/1"},{"type":"function","title":"Bonfire.Web.FakeRemoteEndpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"Bonfire.Web.FakeRemoteEndpoint.html#url/0"},{"type":"module","title":"Bonfire.Web.Router","doc":"","ref":"Bonfire.Web.Router.html"},{"type":"function","title":"Bonfire.Web.Router.account_required/2","doc":"","ref":"Bonfire.Web.Router.html#account_required/2"},{"type":"function","title":"Bonfire.Web.Router.activity_json/2","doc":"","ref":"Bonfire.Web.Router.html#activity_json/2"},{"type":"function","title":"Bonfire.Web.Router.activity_json_or_html/2","doc":"","ref":"Bonfire.Web.Router.html#activity_json_or_html/2"},{"type":"function","title":"Bonfire.Web.Router.admin_required/2","doc":"","ref":"Bonfire.Web.Router.html#admin_required/2"},{"type":"function","title":"Bonfire.Web.Router.basic/2","doc":"","ref":"Bonfire.Web.Router.html#basic/2"},{"type":"function","title":"Bonfire.Web.Router.basic_html/2","doc":"","ref":"Bonfire.Web.Router.html#basic_html/2"},{"type":"function","title":"Bonfire.Web.Router.basic_json/2","doc":"","ref":"Bonfire.Web.Router.html#basic_json/2"},{"type":"function","title":"Bonfire.Web.Router.browser/2","doc":"","ref":"Bonfire.Web.Router.html#browser/2"},{"type":"function","title":"Bonfire.Web.Router.browser_unsafe/2","doc":"","ref":"Bonfire.Web.Router.html#browser_unsafe/2"},{"type":"function","title":"Bonfire.Web.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"Bonfire.Web.Router.html#call/2"},{"type":"function","title":"Bonfire.Web.Router.early_hints_authed/2","doc":"","ref":"Bonfire.Web.Router.html#early_hints_authed/2"},{"type":"function","title":"Bonfire.Web.Router.guest_only/2","doc":"","ref":"Bonfire.Web.Router.html#guest_only/2"},{"type":"function","title":"Bonfire.Web.Router.html_only/2","doc":"","ref":"Bonfire.Web.Router.html#html_only/2"},{"type":"function","title":"Bonfire.Web.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"Bonfire.Web.Router.html#init/1"},{"type":"function","title":"Bonfire.Web.Router.load_current_auth/2","doc":"","ref":"Bonfire.Web.Router.html#load_current_auth/2"},{"type":"function","title":"Bonfire.Web.Router.require_authenticated_user/2","doc":"","ref":"Bonfire.Web.Router.html#require_authenticated_user/2"},{"type":"function","title":"Bonfire.Web.Router.signed_activity_pub_fetch/2","doc":"","ref":"Bonfire.Web.Router.html#signed_activity_pub_fetch/2"},{"type":"function","title":"Bonfire.Web.Router.signed_activity_pub_incoming/2","doc":"","ref":"Bonfire.Web.Router.html#signed_activity_pub_incoming/2"},{"type":"function","title":"Bonfire.Web.Router.static_generator/2","doc":"","ref":"Bonfire.Web.Router.html#static_generator/2"},{"type":"function","title":"Bonfire.Web.Router.throttle_plug_attacks/2","doc":"","ref":"Bonfire.Web.Router.html#throttle_plug_attacks/2"},{"type":"function","title":"Bonfire.Web.Router.user_required/2","doc":"","ref":"Bonfire.Web.Router.html#user_required/2"},{"type":"function","title":"Bonfire.Web.Router.webfinger/2","doc":"","ref":"Bonfire.Web.Router.html#webfinger/2"},{"type":"function","title":"Bonfire.Web.Router.well_known_nodeinfo/2","doc":"","ref":"Bonfire.Web.Router.html#well_known_nodeinfo/2"},{"type":"module","title":"Bonfire.Web.Router.CORS","doc":"","ref":"Bonfire.Web.Router.CORS.html"},{"type":"function","title":"Bonfire.Web.Router.CORS.call/2","doc":"","ref":"Bonfire.Web.Router.CORS.html#call/2"},{"type":"function","title":"Bonfire.Web.Router.CORS.init/1","doc":"","ref":"Bonfire.Web.Router.CORS.html#init/1"},{"type":"function","title":"Bonfire.Web.Router.CORS.local_origin?/3","doc":"","ref":"Bonfire.Web.Router.CORS.html#local_origin?/3"},{"type":"module","title":"Bonfire.Web.Router.Reverse","doc":"","ref":"Bonfire.Web.Router.Reverse.html"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/2","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/2"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/3","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/3"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/4","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/4"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/5","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/5"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/6","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/6"},{"type":"function","title":"Bonfire.Web.Router.Reverse.path/7","doc":"","ref":"Bonfire.Web.Router.Reverse.html#path/7"},{"type":"module","title":"Bonfire.Web.Router.Routes","doc":"","ref":"Bonfire.Web.Router.Routes.html"},{"type":"module","title":"Bonfire.Web.ViewInventoryLive.GraphQL","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Web.ViewInventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.Web.ViewInventoryLive.GraphQL.html#process/2"},{"type":"module","title":"ValueFlows","doc":"`ValueFlows` is a [Bonfire](https://bonfire.cafe/) extension that implements [ValueFlows](https://valueflo.ws/) for federated networks to conduct economic activities.\n\nImplemented so far:\n\n- Intent\n- Proposal\n- Economic Event\n- Types of Action\n- Resource Specification\n- Economic Resource\n- Process Specification\n- Process\n- Claim (WIP)\n- Value Calculations (WIP)\n\nAs well as an optional GraphQL API for all of the above...","ref":"ValueFlows.html"},{"type":"module","title":"Handy commands - ValueFlows","doc":"","ref":"ValueFlows.html#module-handy-commands"},{"type":"module","title":"Copyright and License - ValueFlows","doc":"Copyright (c) 2021 ValueFlows, CommonsPub, Reflow & Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"ValueFlows.html#module-copyright-and-license"},{"type":"module","title":"ValueFlows.Agent.Agents","doc":"","ref":"ValueFlows.Agent.Agents.html"},{"type":"function","title":"ValueFlows.Agent.Agents.add_type/1","doc":"","ref":"ValueFlows.Agent.Agents.html#add_type/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agent/2","doc":"","ref":"ValueFlows.Agent.Agents.html#agent/2"},{"type":"function","title":"ValueFlows.Agent.Agents.agent_location/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agent_location/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agent_to_character/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agent_to_character/1"},{"type":"function","title":"ValueFlows.Agent.Agents.agents/1","doc":"","ref":"ValueFlows.Agent.Agents.html#agents/1"},{"type":"function","title":"ValueFlows.Agent.Agents.character_to_agent/1","doc":"","ref":"ValueFlows.Agent.Agents.html#character_to_agent/1"},{"type":"module","title":"ValueFlows.Agent.Organizations","doc":"","ref":"ValueFlows.Agent.Organizations.html"},{"type":"function","title":"ValueFlows.Agent.Organizations.organization/2","doc":"","ref":"ValueFlows.Agent.Organizations.html#organization/2"},{"type":"function","title":"ValueFlows.Agent.Organizations.organizations/1","doc":"","ref":"ValueFlows.Agent.Organizations.html#organizations/1"},{"type":"module","title":"ValueFlows.Agent.People","doc":"","ref":"ValueFlows.Agent.People.html"},{"type":"function","title":"ValueFlows.Agent.People.people/1","doc":"","ref":"ValueFlows.Agent.People.html#people/1"},{"type":"function","title":"ValueFlows.Agent.People.person/2","doc":"","ref":"ValueFlows.Agent.People.html#person/2"},{"type":"module","title":"ValueFlows.Agreement","doc":"","ref":"ValueFlows.Agreement.html"},{"type":"module","title":"ValueFlows.AllMigrations","doc":"Catch-all migrations intended to be used to initialise new Bonfire apps.\nAdd any new up/down ecto migrations in VF modules to the bottom of these two functions.","ref":"ValueFlows.AllMigrations.html"},{"type":"function","title":"ValueFlows.AllMigrations.down/0","doc":"","ref":"ValueFlows.AllMigrations.html#down/0"},{"type":"function","title":"ValueFlows.AllMigrations.up/0","doc":"","ref":"ValueFlows.AllMigrations.html#up/0"},{"type":"module","title":"ValueFlows.Claim","doc":"","ref":"ValueFlows.Claim.html"},{"type":"function","title":"ValueFlows.Claim.create_changeset/2","doc":"","ref":"ValueFlows.Claim.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Claim.create_changeset/4","doc":"","ref":"ValueFlows.Claim.html#create_changeset/4"},{"type":"function","title":"ValueFlows.Claim.delete/2","doc":"","ref":"ValueFlows.Claim.html#delete/2"},{"type":"function","title":"ValueFlows.Claim.get/3","doc":"","ref":"ValueFlows.Claim.html#get/3"},{"type":"function","title":"ValueFlows.Claim.measure_fields/0","doc":"","ref":"ValueFlows.Claim.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Claim.put/3","doc":"","ref":"ValueFlows.Claim.html#put/3"},{"type":"function","title":"ValueFlows.Claim.update_changeset/2","doc":"","ref":"ValueFlows.Claim.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Claim.validate_required/1","doc":"","ref":"ValueFlows.Claim.html#validate_required/1"},{"type":"type","title":"ValueFlows.Claim.t/0","doc":"","ref":"ValueFlows.Claim.html#t:t/0"},{"type":"module","title":"ValueFlows.Claim.Claims","doc":"","ref":"ValueFlows.Claim.Claims.html"},{"type":"function","title":"ValueFlows.Claim.Claims.ap_publish_activity/3","doc":"","ref":"ValueFlows.Claim.Claims.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Claim.Claims.ap_receive_activity/3","doc":"","ref":"ValueFlows.Claim.Claims.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Claim.Claims.create/2","doc":"","ref":"ValueFlows.Claim.Claims.html#create/2"},{"type":"function","title":"ValueFlows.Claim.Claims.create/4","doc":"","ref":"ValueFlows.Claim.Claims.html#create/4"},{"type":"function","title":"ValueFlows.Claim.Claims.federation_module/0","doc":"","ref":"ValueFlows.Claim.Claims.html#federation_module/0"},{"type":"function","title":"ValueFlows.Claim.Claims.many/1","doc":"","ref":"ValueFlows.Claim.Claims.html#many/1"},{"type":"function","title":"ValueFlows.Claim.Claims.one/1","doc":"","ref":"ValueFlows.Claim.Claims.html#one/1"},{"type":"function","title":"ValueFlows.Claim.Claims.preload_all/1","doc":"","ref":"ValueFlows.Claim.Claims.html#preload_all/1"},{"type":"function","title":"ValueFlows.Claim.Claims.soft_delete/1","doc":"","ref":"ValueFlows.Claim.Claims.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Claim.Claims.update/2","doc":"","ref":"ValueFlows.Claim.Claims.html#update/2"},{"type":"module","title":"ValueFlows.Claim.GraphQL","doc":"","ref":"ValueFlows.Claim.GraphQL.html"},{"type":"function","title":"ValueFlows.Claim.GraphQL.claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.claims/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#claims/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.create_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#create_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.delete_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#delete_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_claim/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_events/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_events/2"},{"type":"function","title":"ValueFlows.Claim.GraphQL.fetch_triggered_by_edge/3","doc":"","ref":"ValueFlows.Claim.GraphQL.html#fetch_triggered_by_edge/3"},{"type":"function","title":"ValueFlows.Claim.GraphQL.update_claim/2","doc":"","ref":"ValueFlows.Claim.GraphQL.html#update_claim/2"},{"type":"module","title":"ValueFlows.Claim.Queries","doc":"","ref":"ValueFlows.Claim.Queries.html"},{"type":"function","title":"ValueFlows.Claim.Queries.filter/2","doc":"","ref":"ValueFlows.Claim.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Claim.Queries.join_to/3","doc":"","ref":"ValueFlows.Claim.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Claim.Queries.queries/5","doc":"","ref":"ValueFlows.Claim.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Claim.Queries.query/1","doc":"","ref":"ValueFlows.Claim.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Claim.Queries.query/2","doc":"","ref":"ValueFlows.Claim.Queries.html#query/2"},{"type":"module","title":"ValueFlows.EconomicEvent","doc":"","ref":"ValueFlows.EconomicEvent.html"},{"type":"function","title":"ValueFlows.EconomicEvent.context_module/0","doc":"","ref":"ValueFlows.EconomicEvent.html#context_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.create_changeset/2","doc":"","ref":"ValueFlows.EconomicEvent.html#create_changeset/2"},{"type":"function","title":"ValueFlows.EconomicEvent.delete/2","doc":"","ref":"ValueFlows.EconomicEvent.html#delete/2"},{"type":"function","title":"ValueFlows.EconomicEvent.follow_filters/0","doc":"","ref":"ValueFlows.EconomicEvent.html#follow_filters/0"},{"type":"function","title":"ValueFlows.EconomicEvent.get/3","doc":"","ref":"ValueFlows.EconomicEvent.html#get/3"},{"type":"function","title":"ValueFlows.EconomicEvent.measure_fields/0","doc":"","ref":"ValueFlows.EconomicEvent.html#measure_fields/0"},{"type":"function","title":"ValueFlows.EconomicEvent.put/3","doc":"","ref":"ValueFlows.EconomicEvent.html#put/3"},{"type":"function","title":"ValueFlows.EconomicEvent.query_module/0","doc":"","ref":"ValueFlows.EconomicEvent.html#query_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.update_changeset/2","doc":"","ref":"ValueFlows.EconomicEvent.html#update_changeset/2"},{"type":"function","title":"ValueFlows.EconomicEvent.validate_changeset/1","doc":"","ref":"ValueFlows.EconomicEvent.html#validate_changeset/1"},{"type":"function","title":"ValueFlows.EconomicEvent.validate_create_changeset/1","doc":"","ref":"ValueFlows.EconomicEvent.html#validate_create_changeset/1"},{"type":"type","title":"ValueFlows.EconomicEvent.t/0","doc":"","ref":"ValueFlows.EconomicEvent.html#t:t/0"},{"type":"module","title":"ValueFlows.EconomicEvent.EconomicEvents","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.ap_publish_activity/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.ap_receive_activity/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.create/3","doc":"Create an event, and possibly linked resources","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#create/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.cursor/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#cursor/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.federation_module/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#federation_module/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.fields/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#fields/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.indexing_object_format/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.inputs_of/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#inputs_of/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#many/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#one/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.outputs_of/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#outputs_of/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.page/5","doc":"Retrieves an Page of events according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#page/5"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.pages/6","doc":"Retrieves an Pages of events according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#pages/6"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.preload_action/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#preload_action/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.preload_all/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#preload_all/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.prepare_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#prepare_attrs/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.prepare_create_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#prepare_create_attrs/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.soft_delete/1","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#soft_delete/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.test_cursor/0","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#test_cursor/0"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.track/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#track/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EconomicEvents.update/3","doc":"","ref":"ValueFlows.EconomicEvent.EconomicEvents.html#update/3"},{"type":"module","title":"ValueFlows.EconomicEvent.EventSideEffects","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.event_side_effects/1","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#event_side_effects/1"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.measurement_effect/3","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#measurement_effect/3"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.quantity_effect/4","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#quantity_effect/4"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.return_updated_event/2","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#return_updated_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.EventSideEffects.return_updated_event/3","doc":"","ref":"ValueFlows.EconomicEvent.EventSideEffects.html#return_updated_event/3"},{"type":"module","title":"ValueFlows.EconomicEvent.GraphQL","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.agent_events/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#agent_events/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.agent_events_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#agent_events_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.all_events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#all_events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.create_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#create_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.delete_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#delete_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.events_filtered/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#events_filtered/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_agent_events_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_agent_events_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_event/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_events/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_events/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_to_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_to_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_trace/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_trace/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_track/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_track/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.fetch_triggered_by_edge/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#fetch_triggered_by_edge/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.list_events/4","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#list_events/4"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.simulate/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.track/3","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#track/3"},{"type":"function","title":"ValueFlows.EconomicEvent.GraphQL.update_event/2","doc":"","ref":"ValueFlows.EconomicEvent.GraphQL.html#update_event/2"},{"type":"module","title":"ValueFlows.EconomicEvent.LiveHandler","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html"},{"type":"function","title":"ValueFlows.EconomicEvent.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#handle_event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.LiveHandler.prepare_attrs/2","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#prepare_attrs/2"},{"type":"macro","title":"ValueFlows.EconomicEvent.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.EconomicEvent.LiveHandler.html#sigil_p/2"},{"type":"module","title":"ValueFlows.EconomicEvent.Queries","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.filter/2","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.join_to/3","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.queries/5","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.query/1","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#query/1"},{"type":"function","title":"ValueFlows.EconomicEvent.Queries.query/2","doc":"","ref":"ValueFlows.EconomicEvent.Queries.html#query/2"},{"type":"module","title":"ValueFlows.EconomicEvent.Trace","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.event/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.process/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#process/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.resource/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#resource/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Trace.trace/3","doc":"","ref":"ValueFlows.EconomicEvent.Trace.html#trace/3"},{"type":"module","title":"ValueFlows.EconomicEvent.Track","doc":"","ref":"ValueFlows.EconomicEvent.Track.html"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.event/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#event/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.process/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#process/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.resource/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#resource/3"},{"type":"function","title":"ValueFlows.EconomicEvent.Track.track/3","doc":"","ref":"ValueFlows.EconomicEvent.Track.html#track/3"},{"type":"module","title":"ValueFlows.EconomicResource","doc":"","ref":"ValueFlows.EconomicResource.html"},{"type":"function","title":"ValueFlows.EconomicResource.context_module/0","doc":"","ref":"ValueFlows.EconomicResource.html#context_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.create_changeset/2","doc":"","ref":"ValueFlows.EconomicResource.html#create_changeset/2"},{"type":"function","title":"ValueFlows.EconomicResource.delete/2","doc":"","ref":"ValueFlows.EconomicResource.html#delete/2"},{"type":"function","title":"ValueFlows.EconomicResource.follow_filters/0","doc":"","ref":"ValueFlows.EconomicResource.html#follow_filters/0"},{"type":"function","title":"ValueFlows.EconomicResource.get/3","doc":"","ref":"ValueFlows.EconomicResource.html#get/3"},{"type":"function","title":"ValueFlows.EconomicResource.measure_fields/0","doc":"","ref":"ValueFlows.EconomicResource.html#measure_fields/0"},{"type":"function","title":"ValueFlows.EconomicResource.put/3","doc":"","ref":"ValueFlows.EconomicResource.html#put/3"},{"type":"function","title":"ValueFlows.EconomicResource.query_module/0","doc":"","ref":"ValueFlows.EconomicResource.html#query_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.update_changeset/2","doc":"","ref":"ValueFlows.EconomicResource.html#update_changeset/2"},{"type":"type","title":"ValueFlows.EconomicResource.t/0","doc":"","ref":"ValueFlows.EconomicResource.html#t:t/0"},{"type":"module","title":"ValueFlows.EconomicResource.EconomicResources","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.ap_publish_activity/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.ap_receive_activity/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.create/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#create/2"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.cursor/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#cursor/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.federation_module/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#federation_module/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.fields/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#fields/2"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.indexing_object_format/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.inputs_of/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#inputs_of/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicResource.EconomicResources.html#many/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.many!/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#many!/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.EconomicResource.EconomicResources.html#one/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.outputs_of/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#outputs_of/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.page/5","doc":"Retrieves an Page of resources according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.EconomicResource.EconomicResources.html#page/5"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.pages/6","doc":"Retrieves an Pages of resources according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.EconomicResource.EconomicResources.html#pages/6"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.preload_all/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#preload_all/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.preload_state/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#preload_state/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.search/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#search/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.soft_delete/1","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#soft_delete/1"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.test_cursor/0","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#test_cursor/0"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.trace/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#trace/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.track/3","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#track/3"},{"type":"function","title":"ValueFlows.EconomicResource.EconomicResources.update/2","doc":"","ref":"ValueFlows.EconomicResource.EconomicResources.html#update/2"},{"type":"module","title":"ValueFlows.EconomicResource.LiveHandler","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html"},{"type":"function","title":"ValueFlows.EconomicResource.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.EconomicResource.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.EconomicResource.LiveHandler.to_tuple/1","doc":"","ref":"ValueFlows.EconomicResource.LiveHandler.html#to_tuple/1"},{"type":"module","title":"ValueFlows.EconomicResource.Queries","doc":"","ref":"ValueFlows.EconomicResource.Queries.html"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.filter/2","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.join_to/3","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.queries/5","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.query/1","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#query/1"},{"type":"function","title":"ValueFlows.EconomicResource.Queries.query/2","doc":"","ref":"ValueFlows.EconomicResource.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.Action","doc":"","ref":"ValueFlows.Knowledge.Action.html"},{"type":"type","title":"ValueFlows.Knowledge.Action.t/0","doc":"","ref":"ValueFlows.Knowledge.Action.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.Action.Actions","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.action/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#action/1"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.action!/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#action!/1"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.actions_list/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#actions_list/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.actions_map/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#actions_map/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.default_actions/0","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#default_actions/0"},{"type":"function","title":"ValueFlows.Knowledge.Action.Actions.id/1","doc":"","ref":"ValueFlows.Knowledge.Action.Actions.html#id/1"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.context_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#context_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.create_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.delete/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#delete/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.follow_filters/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.get/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#get/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.put/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#put/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.query_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#query_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.update_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Knowledge.ProcessSpecification.t/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.all_process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#all_process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.create_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#create_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.creator_process_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#creator_process_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.delete_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#delete_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_creator_process_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_creator_process_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.fetch_process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#fetch_process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.list_process_specs/4","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#list_process_specs/4"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_specs/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.process_specs_filtered/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#process_specs_filtered/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.simulate/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.update_process_spec/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.GraphQL.html#update_process_spec/2"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.ap_publish_activity/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.ap_receive_activity/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.create/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#create/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.cursor/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.federation_module/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#federation_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.fields/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#fields/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.indexing_object_format/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#many/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#one/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.page/5","doc":"Retrieves an Page of process_specs according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#page/5"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.pages/6","doc":"Retrieves an Pages of process_specs according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#pages/6"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.soft_delete/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.test_cursor/0","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.update/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications.html#update/2"},{"type":"module","title":"ValueFlows.Knowledge.ProcessSpecification.Queries","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.filter/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.join_to/3","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.queries/5","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.query/1","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Knowledge.ProcessSpecification.Queries.query/2","doc":"","ref":"ValueFlows.Knowledge.ProcessSpecification.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.context_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#context_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.create_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.create_changeset/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#create_changeset/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.delete/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#delete/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.follow_filters/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.get/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#get/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.put/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#put/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.query_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#query_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.update_changeset/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.update_changeset/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#update_changeset/3"},{"type":"type","title":"ValueFlows.Knowledge.ResourceSpecification.t/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.html#t:t/0"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.all_resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#all_resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.create_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#create_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.creator_resource_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#creator_resource_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.delete_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#delete_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_conforming_resources_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_conforming_resources_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_creator_resource_specs_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_creator_resource_specs_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_default_unit_of_effort_edge/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_default_unit_of_effort_edge/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fetch_resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fetch_resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.fields/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#fields/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.list_resource_specs/4","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#list_resource_specs/4"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.page/5","doc":"Retrieves an Page of resource_specs according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#page/5"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.pages/6","doc":"Retrieves an Pages of resource_specs according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#pages/6"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#resource_spec/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.resource_specs/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#resource_specs/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.simulate/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#simulate/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.update_resource_spec/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.GraphQL.html#update_resource_spec/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.changeset/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#changeset/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.create_in_autocomplete/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#create_in_autocomplete/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.to_tuple/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler.html#to_tuple/1"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.Queries","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.filter/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.join_to/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.queries/5","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.query/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.Queries.query/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.ap_publish_activity/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.ap_receive_activity/3","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.create/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#create/2"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.cursor/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.federation_module/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#federation_module/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.indexing_object_format/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#many/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.many!/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#many!/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.maybe_get/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#maybe_get/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#one/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.prepare_attrs/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#prepare_attrs/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.search/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#search/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.soft_delete/1","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.test_cursor/0","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.update/2","doc":"","ref":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications.html#update/2"},{"type":"module","title":"ValueFlows.Observe.Classifications","doc":"","ref":"ValueFlows.Observe.Classifications.html"},{"type":"function","title":"ValueFlows.Observe.Classifications.create/4","doc":"","ref":"ValueFlows.Observe.Classifications.html#create/4"},{"type":"function","title":"ValueFlows.Observe.Classifications.flatten/1","doc":"","ref":"ValueFlows.Observe.Classifications.html#flatten/1"},{"type":"function","title":"ValueFlows.Observe.Classifications.from_classification/1","doc":"","ref":"ValueFlows.Observe.Classifications.html#from_classification/1"},{"type":"function","title":"ValueFlows.Observe.Classifications.one/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#one/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.preload/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#preload/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.to_classification/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#to_classification/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.to_ecto_struct/2","doc":"","ref":"ValueFlows.Observe.Classifications.html#to_ecto_struct/2"},{"type":"function","title":"ValueFlows.Observe.Classifications.update/4","doc":"","ref":"ValueFlows.Observe.Classifications.html#update/4"},{"type":"module","title":"ValueFlows.Observe.Hydration","doc":"","ref":"ValueFlows.Observe.Hydration.html"},{"type":"function","title":"ValueFlows.Observe.Hydration.hydrate/0","doc":"","ref":"ValueFlows.Observe.Hydration.html#hydrate/0"},{"type":"module","title":"ValueFlows.Observe.Integration","doc":"","ref":"ValueFlows.Observe.Integration.html"},{"type":"module","title":"ValueFlows.Observe.ObservablePhenomenons","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.create/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#create/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.facet/0","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#facet/0"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.one/1","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#one/1"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenons.update/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenons.html#update/3"},{"type":"module","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.choice_of_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#choice_of_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.create_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#create_observable_phenomenon/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.delete_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#delete_observable_phenomenon/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.formula_quantifier_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#formula_quantifier_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.get/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#get/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.observable_phenomenons/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#observable_phenomenons/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.update_observable_phenomenon/2","doc":"","ref":"ValueFlows.Observe.ObservablePhenomenonsGraphQL.html#update_observable_phenomenon/2"},{"type":"module","title":"ValueFlows.Observe.ObservableProperties","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.create/2","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#create/2"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.facet/0","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#facet/0"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.id/0","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#id/0"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.one/1","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#one/1"},{"type":"function","title":"ValueFlows.Observe.ObservableProperties.update/3","doc":"","ref":"ValueFlows.Observe.ObservableProperties.html#update/3"},{"type":"module","title":"ValueFlows.Observe.ObservablePropertiesGraphQL","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.create_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#create_observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.delete_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#delete_observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.observable_properties/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#observable_properties/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#observable_property/2"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.phenomenons_edge/3","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#phenomenons_edge/3"},{"type":"function","title":"ValueFlows.Observe.ObservablePropertiesGraphQL.update_observable_property/2","doc":"","ref":"ValueFlows.Observe.ObservablePropertiesGraphQL.html#update_observable_property/2"},{"type":"module","title":"ValueFlows.Observe.Observation","doc":"","ref":"ValueFlows.Observe.Observation.html"},{"type":"function","title":"ValueFlows.Observe.Observation.context_module/0","doc":"","ref":"ValueFlows.Observe.Observation.html#context_module/0"},{"type":"function","title":"ValueFlows.Observe.Observation.create_changeset/2","doc":"","ref":"ValueFlows.Observe.Observation.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Observe.Observation.create_changeset_validate/1","doc":"","ref":"ValueFlows.Observe.Observation.html#create_changeset_validate/1"},{"type":"function","title":"ValueFlows.Observe.Observation.delete/2","doc":"","ref":"ValueFlows.Observe.Observation.html#delete/2"},{"type":"function","title":"ValueFlows.Observe.Observation.follow_filters/0","doc":"","ref":"ValueFlows.Observe.Observation.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Observe.Observation.get/3","doc":"","ref":"ValueFlows.Observe.Observation.html#get/3"},{"type":"function","title":"ValueFlows.Observe.Observation.put/3","doc":"","ref":"ValueFlows.Observe.Observation.html#put/3"},{"type":"function","title":"ValueFlows.Observe.Observation.query_module/0","doc":"","ref":"ValueFlows.Observe.Observation.html#query_module/0"},{"type":"function","title":"ValueFlows.Observe.Observation.update_changeset/2","doc":"","ref":"ValueFlows.Observe.Observation.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Observe.Observation.t/0","doc":"","ref":"ValueFlows.Observe.Observation.html#t:t/0"},{"type":"module","title":"ValueFlows.Observe.Observation.Queries","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.filter/2","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.join_to/3","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.queries/5","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.query/1","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Observe.Observation.Queries.query/2","doc":"","ref":"ValueFlows.Observe.Observation.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Observe.Observations","doc":"","ref":"ValueFlows.Observe.Observations.html"},{"type":"function","title":"ValueFlows.Observe.Observations.create/2","doc":"Create an observation","ref":"ValueFlows.Observe.Observations.html#create/2"},{"type":"function","title":"ValueFlows.Observe.Observations.create/3","doc":"","ref":"ValueFlows.Observe.Observations.html#create/3"},{"type":"function","title":"ValueFlows.Observe.Observations.cursor/0","doc":"","ref":"ValueFlows.Observe.Observations.html#cursor/0"},{"type":"function","title":"ValueFlows.Observe.Observations.fields/2","doc":"","ref":"ValueFlows.Observe.Observations.html#fields/2"},{"type":"function","title":"ValueFlows.Observe.Observations.indexing_object_format/1","doc":"","ref":"ValueFlows.Observe.Observations.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Observe.Observations.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Observe.Observations.html#many/1"},{"type":"function","title":"ValueFlows.Observe.Observations.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Observe.Observations.html#one/1"},{"type":"function","title":"ValueFlows.Observe.Observations.page/5","doc":"Retrieves an Page of observations according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Observe.Observations.html#page/5"},{"type":"function","title":"ValueFlows.Observe.Observations.pages/6","doc":"Retrieves an Pages of observations according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Observe.Observations.html#pages/6"},{"type":"function","title":"ValueFlows.Observe.Observations.preload_all/1","doc":"","ref":"ValueFlows.Observe.Observations.html#preload_all/1"},{"type":"function","title":"ValueFlows.Observe.Observations.soft_delete/1","doc":"","ref":"ValueFlows.Observe.Observations.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Observe.Observations.test_cursor/0","doc":"","ref":"ValueFlows.Observe.Observations.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Observe.Observations.update/3","doc":"","ref":"ValueFlows.Observe.Observations.html#update/3"},{"type":"module","title":"ValueFlows.Observe.Observations.ObservationsResolvers","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.all_observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#all_observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.create_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#create_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.delete_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#delete_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.fetch_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#fetch_observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.fetch_observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#fetch_observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.has_feature_of_interest/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#has_feature_of_interest/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.has_result_edge/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#has_result_edge/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.list_observations/4","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#list_observations/4"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.made_by_edge/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#made_by_edge/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.name_as_label/3","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#name_as_label/3"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#observation/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.observations/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#observations/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observable_object_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observable_object_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observable_result_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observable_result_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.resolve_observer_type/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#resolve_observer_type/2"},{"type":"function","title":"ValueFlows.Observe.Observations.ObservationsResolvers.update_observation/2","doc":"","ref":"ValueFlows.Observe.Observations.ObservationsResolvers.html#update_observation/2"},{"type":"module","title":"ValueFlows.Observe.Seeds","doc":"","ref":"ValueFlows.Observe.Seeds.html"},{"type":"function","title":"ValueFlows.Observe.Seeds.down/1","doc":"","ref":"ValueFlows.Observe.Seeds.html#down/1"},{"type":"function","title":"ValueFlows.Observe.Seeds.up/1","doc":"","ref":"ValueFlows.Observe.Seeds.html#up/1"},{"type":"module","title":"ValueFlows.Observe.Simulate","doc":"","ref":"ValueFlows.Observe.Simulate.html"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observable_phenomenon!/3","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observable_phenomenon!/3"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observable_property!/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observable_property!/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.fake_observation!/3","doc":"","ref":"ValueFlows.Observe.Simulate.html#fake_observation!/3"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_phenomenon/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_phenomenon/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_phenomenon_input/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_phenomenon_input/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_property/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_property/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observable_property_input/1","doc":"","ref":"ValueFlows.Observe.Simulate.html#observable_property_input/1"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation/4","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation/4"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation_input/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation_input/2"},{"type":"function","title":"ValueFlows.Observe.Simulate.observation_with_req_fields/2","doc":"","ref":"ValueFlows.Observe.Simulate.html#observation_with_req_fields/2"},{"type":"module","title":"ValueFlows.Planning.Commitment","doc":"","ref":"ValueFlows.Planning.Commitment.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.context_module/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.delete/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.get/3","doc":"","ref":"ValueFlows.Planning.Commitment.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.put/3","doc":"","ref":"ValueFlows.Planning.Commitment.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.query_module/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Commitment.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Commitment.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Planning.Commitment.attrs/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#t:attrs/0"},{"type":"type","title":"ValueFlows.Planning.Commitment.t/0","doc":"","ref":"ValueFlows.Planning.Commitment.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Commitment.Commitments","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.by_id/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.create/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.many/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.one/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.preload_action/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#preload_action/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.preload_all/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.prep_attrs/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#prep_attrs/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.soft_delete/1","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Commitments.update/3","doc":"","ref":"ValueFlows.Planning.Commitment.Commitments.html#update/3"},{"type":"module","title":"ValueFlows.Planning.Commitment.GraphQL","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.commitments_filtered/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#commitments_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.create_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#create_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.delete_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#delete_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_commitment/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_created/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_created/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.fetch_satisfies_edge/3","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#fetch_satisfies_edge/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.GraphQL.update_commitment/2","doc":"","ref":"ValueFlows.Planning.Commitment.GraphQL.html#update_commitment/2"},{"type":"module","title":"ValueFlows.Planning.Commitment.Queries","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Commitment.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Commitment.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Intent","doc":"","ref":"ValueFlows.Planning.Intent.html"},{"type":"function","title":"ValueFlows.Planning.Intent.context_module/0","doc":"","ref":"ValueFlows.Planning.Intent.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Intent.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Intent.delete/2","doc":"","ref":"ValueFlows.Planning.Intent.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Intent.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Intent.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Intent.get/3","doc":"","ref":"ValueFlows.Planning.Intent.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Intent.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Intent.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Intent.put/3","doc":"","ref":"ValueFlows.Planning.Intent.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Intent.query_module/0","doc":"","ref":"ValueFlows.Planning.Intent.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Intent.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Intent.validate_changeset/1","doc":"","ref":"ValueFlows.Planning.Intent.html#validate_changeset/1"},{"type":"type","title":"ValueFlows.Planning.Intent.t/0","doc":"","ref":"ValueFlows.Planning.Intent.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Intent.GraphQL","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.agent_intents/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#agent_intents/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.agent_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#agent_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_need/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_need/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.create_offer/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#create_offer/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.delete_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#delete_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_agent_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_agent_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_input_of_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_input_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_needs/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_needs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_offers/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_offers/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_output_of_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_output_of_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_provider_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_provider_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_resource_inventoried_as_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_resource_inventoried_as_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.fetch_satisfied_by_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#fetch_satisfied_by_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intent/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.intents_filtered/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#intents_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.list_intents/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#list_intents/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.needs/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#needs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.offers/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#offers/2"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.provider_intents/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#provider_intents/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.provider_intents_edge/3","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#provider_intents_edge/3"},{"type":"function","title":"ValueFlows.Planning.Intent.GraphQL.update_intent/2","doc":"","ref":"ValueFlows.Planning.Intent.GraphQL.html#update_intent/2"},{"type":"module","title":"ValueFlows.Planning.Intent.Intents","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.ap_publish_activity/3","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.ap_receive_activity/3","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.by_id/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.create/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.cursor/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#cursor/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.federation_module/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#federation_module/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.fields/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#fields/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.indexing_object_format/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Planning.Intent.Intents.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Planning.Intent.Intents.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.page/5","doc":"Retrieves an Page of intents according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Planning.Intent.Intents.html#page/5"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.pages/6","doc":"Retrieves an Pages of intents according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Planning.Intent.Intents.html#pages/6"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.preload_action/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#preload_action/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.preload_all/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.prepare_attrs/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#prepare_attrs/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.soft_delete/1","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.test_cursor/0","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Planning.Intent.Intents.update/4","doc":"","ref":"ValueFlows.Planning.Intent.Intents.html#update/4"},{"type":"module","title":"ValueFlows.Planning.Intent.LiveHandler","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.assign_to/4","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#assign_to/4"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.create_from_list/6","doc":"Create intents from a markdown-formatted list of checkboxes","ref":"ValueFlows.Planning.Intent.LiveHandler.html#create_from_list/6"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.create_from_list/7","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#create_from_list/7"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#handle_event/3"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.handle_param/3","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#handle_param/3"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.input_date/1","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#input_date/1"},{"type":"macro","title":"ValueFlows.Planning.Intent.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#sigil_p/2"},{"type":"function","title":"ValueFlows.Planning.Intent.LiveHandler.update_verb/1","doc":"","ref":"ValueFlows.Planning.Intent.LiveHandler.html#update_verb/1"},{"type":"module","title":"ValueFlows.Planning.Intent.Queries","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Intent.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Intent.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction","doc":"","ref":"ValueFlows.Planning.Satisfaction.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.context_module/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#context_module/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.create_changeset/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.follow_filters/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.get/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#get/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.measure_fields/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#measure_fields/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.put/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#put/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.query_module/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#query_module/0"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.update_changeset/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Planning.Satisfaction.attrs/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#t:attrs/0"},{"type":"type","title":"ValueFlows.Planning.Satisfaction.t/0","doc":"","ref":"ValueFlows.Planning.Satisfaction.html#t:t/0"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.GraphQL","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.create/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.event_or_commitment_resolve_type/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#event_or_commitment_resolve_type/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfaction/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfaction/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfied_by_edge/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfied_by_edge/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.fetch_satisfies_edge/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#fetch_satisfies_edge/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.satisfaction/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#satisfaction/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.satisfactions_filtered/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#satisfactions_filtered/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.GraphQL.update/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.GraphQL.html#update/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.Queries","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.filter/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.filter/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#filter/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.join_to/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.queries/5","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.query/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Queries.query/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Planning.Satisfaction.Satisfactions","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.by_id/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#by_id/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.create/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#create/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.many/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#many/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.one/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#one/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.preload_all/1","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#preload_all/1"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.soft_delete/2","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#soft_delete/2"},{"type":"function","title":"ValueFlows.Planning.Satisfaction.Satisfactions.update/3","doc":"","ref":"ValueFlows.Planning.Satisfaction.Satisfactions.html#update/3"},{"type":"module","title":"ValueFlows.Process","doc":"","ref":"ValueFlows.Process.html"},{"type":"function","title":"ValueFlows.Process.context_module/0","doc":"","ref":"ValueFlows.Process.html#context_module/0"},{"type":"function","title":"ValueFlows.Process.create_changeset/2","doc":"","ref":"ValueFlows.Process.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Process.delete/2","doc":"","ref":"ValueFlows.Process.html#delete/2"},{"type":"function","title":"ValueFlows.Process.follow_filters/0","doc":"","ref":"ValueFlows.Process.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Process.get/3","doc":"","ref":"ValueFlows.Process.html#get/3"},{"type":"function","title":"ValueFlows.Process.put/3","doc":"","ref":"ValueFlows.Process.html#put/3"},{"type":"function","title":"ValueFlows.Process.query_module/0","doc":"","ref":"ValueFlows.Process.html#query_module/0"},{"type":"function","title":"ValueFlows.Process.update_changeset/2","doc":"","ref":"ValueFlows.Process.html#update_changeset/2"},{"type":"function","title":"ValueFlows.Process.validate_changeset/1","doc":"","ref":"ValueFlows.Process.html#validate_changeset/1"},{"type":"type","title":"ValueFlows.Process.t/0","doc":"","ref":"ValueFlows.Process.html#t:t/0"},{"type":"module","title":"ValueFlows.Process.LiveHandler","doc":"","ref":"ValueFlows.Process.LiveHandler.html"},{"type":"function","title":"ValueFlows.Process.LiveHandler.changeset/1","doc":"","ref":"ValueFlows.Process.LiveHandler.html#changeset/1"},{"type":"function","title":"ValueFlows.Process.LiveHandler.do_update/3","doc":"","ref":"ValueFlows.Process.LiveHandler.html#do_update/3"},{"type":"function","title":"ValueFlows.Process.LiveHandler.handle_event/3","doc":"","ref":"ValueFlows.Process.LiveHandler.html#handle_event/3"},{"type":"macro","title":"ValueFlows.Process.LiveHandler.sigil_p/2","doc":"","ref":"ValueFlows.Process.LiveHandler.html#sigil_p/2"},{"type":"module","title":"ValueFlows.Process.Processes","doc":"","ref":"ValueFlows.Process.Processes.html"},{"type":"function","title":"ValueFlows.Process.Processes.ap_publish_activity/3","doc":"","ref":"ValueFlows.Process.Processes.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Process.Processes.ap_receive_activity/3","doc":"","ref":"ValueFlows.Process.Processes.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Process.Processes.create/2","doc":"","ref":"ValueFlows.Process.Processes.html#create/2"},{"type":"function","title":"ValueFlows.Process.Processes.cursor/0","doc":"","ref":"ValueFlows.Process.Processes.html#cursor/0"},{"type":"function","title":"ValueFlows.Process.Processes.federation_module/0","doc":"","ref":"ValueFlows.Process.Processes.html#federation_module/0"},{"type":"function","title":"ValueFlows.Process.Processes.fields/2","doc":"","ref":"ValueFlows.Process.Processes.html#fields/2"},{"type":"function","title":"ValueFlows.Process.Processes.indexing_object_format/1","doc":"","ref":"ValueFlows.Process.Processes.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Process.Processes.inputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#inputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.intended_inputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#intended_inputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.intended_outputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#intended_outputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Process.Processes.html#many/1"},{"type":"function","title":"ValueFlows.Process.Processes.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Process.Processes.html#one/1"},{"type":"function","title":"ValueFlows.Process.Processes.outputs/2","doc":"","ref":"ValueFlows.Process.Processes.html#outputs/2"},{"type":"function","title":"ValueFlows.Process.Processes.page/5","doc":"Retrieves an Page of processes according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Process.Processes.html#page/5"},{"type":"function","title":"ValueFlows.Process.Processes.pages/6","doc":"Retrieves an Pages of processes according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Process.Processes.html#pages/6"},{"type":"function","title":"ValueFlows.Process.Processes.preload_all/1","doc":"","ref":"ValueFlows.Process.Processes.html#preload_all/1"},{"type":"function","title":"ValueFlows.Process.Processes.prepare_attrs/1","doc":"","ref":"ValueFlows.Process.Processes.html#prepare_attrs/1"},{"type":"function","title":"ValueFlows.Process.Processes.soft_delete/1","doc":"","ref":"ValueFlows.Process.Processes.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Process.Processes.test_cursor/0","doc":"","ref":"ValueFlows.Process.Processes.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Process.Processes.trace/3","doc":"","ref":"ValueFlows.Process.Processes.html#trace/3"},{"type":"function","title":"ValueFlows.Process.Processes.track/3","doc":"","ref":"ValueFlows.Process.Processes.html#track/3"},{"type":"function","title":"ValueFlows.Process.Processes.update/2","doc":"","ref":"ValueFlows.Process.Processes.html#update/2"},{"type":"module","title":"ValueFlows.Process.Queries","doc":"","ref":"ValueFlows.Process.Queries.html"},{"type":"function","title":"ValueFlows.Process.Queries.filter/2","doc":"","ref":"ValueFlows.Process.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Process.Queries.join_to/3","doc":"","ref":"ValueFlows.Process.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Process.Queries.queries/5","doc":"","ref":"ValueFlows.Process.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Process.Queries.query/1","doc":"","ref":"ValueFlows.Process.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Process.Queries.query/2","doc":"","ref":"ValueFlows.Process.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal","doc":"Schema for proposal, using `Needle.Pointable`","ref":"ValueFlows.Proposal.html"},{"type":"function","title":"ValueFlows.Proposal.context_module/0","doc":"","ref":"ValueFlows.Proposal.html#context_module/0"},{"type":"function","title":"ValueFlows.Proposal.create_changeset/2","doc":"","ref":"ValueFlows.Proposal.html#create_changeset/2"},{"type":"function","title":"ValueFlows.Proposal.delete/2","doc":"","ref":"ValueFlows.Proposal.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.follow_filters/0","doc":"","ref":"ValueFlows.Proposal.html#follow_filters/0"},{"type":"function","title":"ValueFlows.Proposal.get/3","doc":"","ref":"ValueFlows.Proposal.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.put/3","doc":"","ref":"ValueFlows.Proposal.html#put/3"},{"type":"function","title":"ValueFlows.Proposal.query_module/0","doc":"","ref":"ValueFlows.Proposal.html#query_module/0"},{"type":"function","title":"ValueFlows.Proposal.update_changeset/2","doc":"","ref":"ValueFlows.Proposal.html#update_changeset/2"},{"type":"type","title":"ValueFlows.Proposal.t/0","doc":"","ref":"ValueFlows.Proposal.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.GraphQL","doc":"","ref":"ValueFlows.Proposal.GraphQL.html"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.agent_proposals/3","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#agent_proposals/3"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.all_proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#all_proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.create_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#create_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.delete_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#delete_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.eligible_location_edge/3","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#eligible_location_edge/3"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.fetch_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#fetch_proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.fetch_proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#fetch_proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposal/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposals/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposals/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.proposals_filtered/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#proposals_filtered/2"},{"type":"function","title":"ValueFlows.Proposal.GraphQL.update_proposal/2","doc":"","ref":"ValueFlows.Proposal.GraphQL.html#update_proposal/2"},{"type":"module","title":"ValueFlows.Proposal.Proposals","doc":"","ref":"ValueFlows.Proposal.Proposals.html"},{"type":"function","title":"ValueFlows.Proposal.Proposals.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.Proposals.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.Proposals.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.Proposals.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.Proposals.create/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#create/2"},{"type":"function","title":"ValueFlows.Proposal.Proposals.cursor/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#cursor/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.federation_module/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.fields/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#fields/2"},{"type":"function","title":"ValueFlows.Proposal.Proposals.indexing_object_format/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#indexing_object_format/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.many/1","doc":"Retrieves a list of them by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Proposal.Proposals.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.one/1","doc":"Retrieves a single one by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for this (inc. tests)","ref":"ValueFlows.Proposal.Proposals.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.page/5","doc":"Retrieves an Page of proposals according to various filters\n\nUsed by:\n* GraphQL resolver single-parent resolution","ref":"ValueFlows.Proposal.Proposals.html#page/5"},{"type":"function","title":"ValueFlows.Proposal.Proposals.pages/6","doc":"Retrieves an Pages of proposals according to various filters\n\nUsed by:\n* GraphQL resolver bulk resolution","ref":"ValueFlows.Proposal.Proposals.html#pages/6"},{"type":"function","title":"ValueFlows.Proposal.Proposals.preload_all/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#preload_all/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.soft_delete/1","doc":"","ref":"ValueFlows.Proposal.Proposals.html#soft_delete/1"},{"type":"function","title":"ValueFlows.Proposal.Proposals.test_cursor/0","doc":"","ref":"ValueFlows.Proposal.Proposals.html#test_cursor/0"},{"type":"function","title":"ValueFlows.Proposal.Proposals.update/2","doc":"","ref":"ValueFlows.Proposal.Proposals.html#update/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntent","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.changeset/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#changeset/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.delete/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.get/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntent.put/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#put/3"},{"type":"type","title":"ValueFlows.Proposal.ProposedIntent.t/0","doc":"","ref":"ValueFlows.Proposal.ProposedIntent.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntentQueries","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.filter/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.join_to/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.query/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntentQueries.query/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntentQueries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedIntents","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.create/2","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#create/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.delete/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#delete/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.federation_module/0","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.many/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.one/1","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedIntents.propose_intent/3","doc":"","ref":"ValueFlows.Proposal.ProposedIntents.html#propose_intent/3"},{"type":"module","title":"ValueFlows.Proposal.ProposedTo","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.changeset/2","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#changeset/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.delete/2","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#delete/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.get/3","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#get/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTo.put/3","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#put/3"},{"type":"type","title":"ValueFlows.Proposal.ProposedTo.t/0","doc":"","ref":"ValueFlows.Proposal.ProposedTo.html#t:t/0"},{"type":"module","title":"ValueFlows.Proposal.ProposedToQueries","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.filter/2","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.join_to/3","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.query/1","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedToQueries.query/2","doc":"","ref":"ValueFlows.Proposal.ProposedToQueries.html#query/2"},{"type":"module","title":"ValueFlows.Proposal.ProposedTos","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.ap_publish_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#ap_publish_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.ap_receive_activity/3","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#ap_receive_activity/3"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.delete/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#delete/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.federation_module/0","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#federation_module/0"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.many/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#many/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.one/1","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#one/1"},{"type":"function","title":"ValueFlows.Proposal.ProposedTos.propose_to/2","doc":"","ref":"ValueFlows.Proposal.ProposedTos.html#propose_to/2"},{"type":"module","title":"ValueFlows.Proposal.Queries","doc":"","ref":"ValueFlows.Proposal.Queries.html"},{"type":"function","title":"ValueFlows.Proposal.Queries.filter/2","doc":"","ref":"ValueFlows.Proposal.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.Proposal.Queries.join_to/3","doc":"","ref":"ValueFlows.Proposal.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.Proposal.Queries.queries/5","doc":"","ref":"ValueFlows.Proposal.Queries.html#queries/5"},{"type":"function","title":"ValueFlows.Proposal.Queries.query/1","doc":"","ref":"ValueFlows.Proposal.Queries.html#query/1"},{"type":"function","title":"ValueFlows.Proposal.Queries.query/2","doc":"","ref":"ValueFlows.Proposal.Queries.html#query/2"},{"type":"module","title":"ValueFlows.Util","doc":"","ref":"ValueFlows.Util.html"},{"type":"function","title":"ValueFlows.Util.attr_get_agent/3","doc":"","ref":"ValueFlows.Util.html#attr_get_agent/3"},{"type":"function","title":"ValueFlows.Util.can?/3","doc":"","ref":"ValueFlows.Util.html#can?/3"},{"type":"function","title":"ValueFlows.Util.change_measures/3","doc":"","ref":"ValueFlows.Util.html#change_measures/3"},{"type":"function","title":"ValueFlows.Util.common_filters/2","doc":"","ref":"ValueFlows.Util.html#common_filters/2"},{"type":"function","title":"ValueFlows.Util.content_url_or_path/1","doc":"","ref":"ValueFlows.Util.html#content_url_or_path/1"},{"type":"function","title":"ValueFlows.Util.default_recurse_limit/0","doc":"","ref":"ValueFlows.Util.html#default_recurse_limit/0"},{"type":"function","title":"ValueFlows.Util.handle_changeset_errors/3","doc":"","ref":"ValueFlows.Util.html#handle_changeset_errors/3"},{"type":"function","title":"ValueFlows.Util.image_schema/0","doc":"","ref":"ValueFlows.Util.html#image_schema/0"},{"type":"function","title":"ValueFlows.Util.image_url/1","doc":"","ref":"ValueFlows.Util.html#image_url/1"},{"type":"function","title":"ValueFlows.Util.index_for_search/1","doc":"","ref":"ValueFlows.Util.html#index_for_search/1"},{"type":"function","title":"ValueFlows.Util.indexing_format_creator/1","doc":"","ref":"ValueFlows.Util.html#indexing_format_creator/1"},{"type":"function","title":"ValueFlows.Util.indexing_format_tags/1","doc":"","ref":"ValueFlows.Util.html#indexing_format_tags/1"},{"type":"function","title":"ValueFlows.Util.map_values/2","doc":"","ref":"ValueFlows.Util.html#map_values/2"},{"type":"function","title":"ValueFlows.Util.max_recurse_limit/0","doc":"","ref":"ValueFlows.Util.html#max_recurse_limit/0"},{"type":"function","title":"ValueFlows.Util.maybe_classification/2","doc":"lookup tag from URL(s), to support vf-graphql mode","ref":"ValueFlows.Util.html#maybe_classification/2"},{"type":"function","title":"ValueFlows.Util.maybe_classification_id/2","doc":"","ref":"ValueFlows.Util.html#maybe_classification_id/2"},{"type":"function","title":"ValueFlows.Util.maybe_search/2","doc":"","ref":"ValueFlows.Util.html#maybe_search/2"},{"type":"function","title":"ValueFlows.Util.org_schema/0","doc":"","ref":"ValueFlows.Util.html#org_schema/0"},{"type":"function","title":"ValueFlows.Util.parse_measurement_attrs/2","doc":"","ref":"ValueFlows.Util.html#parse_measurement_attrs/2"},{"type":"function","title":"ValueFlows.Util.prepare_opts_and_maybe_set_boundaries/3","doc":"","ref":"ValueFlows.Util.html#prepare_opts_and_maybe_set_boundaries/3"},{"type":"function","title":"ValueFlows.Util.publish/2","doc":"","ref":"ValueFlows.Util.html#publish/2"},{"type":"function","title":"ValueFlows.Util.publish/4","doc":"","ref":"ValueFlows.Util.html#publish/4"},{"type":"function","title":"ValueFlows.Util.search_for_matches/1","doc":"","ref":"ValueFlows.Util.html#search_for_matches/1"},{"type":"function","title":"ValueFlows.Util.try_tag_thing/3","doc":"","ref":"ValueFlows.Util.html#try_tag_thing/3"},{"type":"function","title":"ValueFlows.Util.user_or_org_schema/0","doc":"","ref":"ValueFlows.Util.html#user_or_org_schema/0"},{"type":"function","title":"ValueFlows.Util.user_schema/0","doc":"","ref":"ValueFlows.Util.html#user_schema/0"},{"type":"module","title":"ValueFlows.Util.Federation","doc":"","ref":"ValueFlows.Util.Federation.html"},{"type":"function","title":"ValueFlows.Util.Federation.activity_object_id/1","doc":"","ref":"ValueFlows.Util.Federation.html#activity_object_id/1"},{"type":"function","title":"ValueFlows.Util.Federation.ap_graphql_fields/2","doc":"","ref":"ValueFlows.Util.Federation.html#ap_graphql_fields/2"},{"type":"function","title":"ValueFlows.Util.Federation.ap_prepare_object/1","doc":"","ref":"ValueFlows.Util.Federation.html#ap_prepare_object/1"},{"type":"function","title":"ValueFlows.Util.Federation.ap_publish/3","doc":"","ref":"ValueFlows.Util.Federation.html#ap_publish/3"},{"type":"function","title":"ValueFlows.Util.Federation.ap_publish_activity/6","doc":"","ref":"ValueFlows.Util.Federation.html#ap_publish_activity/6"},{"type":"function","title":"ValueFlows.Util.Federation.ap_receive_activity/4","doc":"Incoming federation","ref":"ValueFlows.Util.Federation.html#ap_receive_activity/4"},{"type":"function","title":"ValueFlows.Util.Federation.fetch_api_object/4","doc":"","ref":"ValueFlows.Util.Federation.html#fetch_api_object/4"},{"type":"function","title":"ValueFlows.Util.Federation.maybe_create_nested_object/3","doc":"","ref":"ValueFlows.Util.Federation.html#maybe_create_nested_object/3"},{"type":"function","title":"ValueFlows.Util.Federation.maybe_id/2","doc":"","ref":"ValueFlows.Util.Federation.html#maybe_id/2"},{"type":"function","title":"ValueFlows.Util.Federation.struct_to_json/1","doc":"","ref":"ValueFlows.Util.Federation.html#struct_to_json/1"},{"type":"module","title":"ValueFlows.ValueCalculation","doc":"","ref":"ValueFlows.ValueCalculation.html"},{"type":"function","title":"ValueFlows.ValueCalculation.create_changeset/2","doc":"","ref":"ValueFlows.ValueCalculation.html#create_changeset/2"},{"type":"function","title":"ValueFlows.ValueCalculation.delete/2","doc":"","ref":"ValueFlows.ValueCalculation.html#delete/2"},{"type":"function","title":"ValueFlows.ValueCalculation.follow_filters/0","doc":"","ref":"ValueFlows.ValueCalculation.html#follow_filters/0"},{"type":"function","title":"ValueFlows.ValueCalculation.get/3","doc":"","ref":"ValueFlows.ValueCalculation.html#get/3"},{"type":"function","title":"ValueFlows.ValueCalculation.put/3","doc":"","ref":"ValueFlows.ValueCalculation.html#put/3"},{"type":"function","title":"ValueFlows.ValueCalculation.query_module/0","doc":"","ref":"ValueFlows.ValueCalculation.html#query_module/0"},{"type":"function","title":"ValueFlows.ValueCalculation.update_changeset/2","doc":"","ref":"ValueFlows.ValueCalculation.html#update_changeset/2"},{"type":"type","title":"ValueFlows.ValueCalculation.t/0","doc":"","ref":"ValueFlows.ValueCalculation.html#t:t/0"},{"type":"module","title":"ValueFlows.ValueCalculation.GraphQL","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.create_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#create_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.delete_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#delete_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.fetch_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#fetch_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.fetch_value_calculations/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#fetch_value_calculations/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.resource_conforms_to_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#resource_conforms_to_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.update_value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#update_value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_action_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_action_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_calculation/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_calculation/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_calculations/2","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_calculations/2"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_resource_conforms_to_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_resource_conforms_to_edge/3"},{"type":"function","title":"ValueFlows.ValueCalculation.GraphQL.value_unit_edge/3","doc":"","ref":"ValueFlows.ValueCalculation.GraphQL.html#value_unit_edge/3"},{"type":"module","title":"ValueFlows.ValueCalculation.Queries","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.filter/2","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#filter/2"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.join_to/3","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#join_to/3"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.query/1","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#query/1"},{"type":"function","title":"ValueFlows.ValueCalculation.Queries.query/2","doc":"","ref":"ValueFlows.ValueCalculation.Queries.html#query/2"},{"type":"module","title":"ValueFlows.ValueCalculation.ValueCalculations","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.apply_to/2","doc":"Apply the value calculation to a context","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#apply_to/2"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.create/2","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#create/2"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.many/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#many/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.one/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#one/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.preload_all/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#preload_all/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.soft_delete/1","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#soft_delete/1"},{"type":"function","title":"ValueFlows.ValueCalculation.ValueCalculations.update/2","doc":"","ref":"ValueFlows.ValueCalculation.ValueCalculations.html#update/2"},{"type":"module","title":"Bonfire.Breadpub","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.Breadpub.html"},{"type":"module","title":"Handy commands - Bonfire.Breadpub","doc":"","ref":"Bonfire.Breadpub.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Breadpub","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Breadpub.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Breadpub.mailer/0","doc":"","ref":"Bonfire.Breadpub.html#mailer/0"},{"type":"function","title":"Bonfire.Breadpub.remote_tag_id/0","doc":"","ref":"Bonfire.Breadpub.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.Breadpub.repo/0","doc":"","ref":"Bonfire.Breadpub.html#repo/0"},{"type":"module","title":"Bonfire.Breadpub.IntentLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.IntentLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.IntentLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.MapLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.MapLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.MapLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.Breadpub.Web.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Breadpub.Web.Routes","doc":"","ref":"Bonfire.Breadpub.Web.Routes.html"},{"type":"function","title":"Bonfire.Breadpub.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Breadpub.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Classify","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Defining categories/topics\n- Defining relationships (parent or related) between categories to create taxonomies\n\nUse Bonfire.Tag if you want to tag/classify posts or other objects with these categories/topics.","ref":"Bonfire.Classify.html"},{"type":"module","title":"Handy commands - Bonfire.Classify","doc":"","ref":"Bonfire.Classify.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Classify","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Classify.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Classify.arrange_categories_tree/1","doc":"","ref":"Bonfire.Classify.html#arrange_categories_tree/1"},{"type":"function","title":"Bonfire.Classify.ensure_update_allowed/2","doc":"","ref":"Bonfire.Classify.html#ensure_update_allowed/2"},{"type":"function","title":"Bonfire.Classify.maybe_index/1","doc":"","ref":"Bonfire.Classify.html#maybe_index/1"},{"type":"function","title":"Bonfire.Classify.maybe_unindex/1","doc":"","ref":"Bonfire.Classify.html#maybe_unindex/1"},{"type":"function","title":"Bonfire.Classify.my_followed_tree/2","doc":"","ref":"Bonfire.Classify.html#my_followed_tree/2"},{"type":"function","title":"Bonfire.Classify.publish/5","doc":"","ref":"Bonfire.Classify.html#publish/5"},{"type":"module","title":"Bonfire.Classify.Categories","doc":"","ref":"Bonfire.Classify.Categories.html"},{"type":"function","title":"Bonfire.Classify.Categories.ap_publish_activity/3","doc":"","ref":"Bonfire.Classify.Categories.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Classify.Categories.ap_receive_activity/3","doc":"","ref":"Bonfire.Classify.Categories.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Classify.Categories.attrs_prepare_tree/2","doc":"","ref":"Bonfire.Classify.Categories.html#attrs_prepare_tree/2"},{"type":"function","title":"Bonfire.Classify.Categories.attrs_with_username/1","doc":"","ref":"Bonfire.Classify.Categories.html#attrs_with_username/1"},{"type":"function","title":"Bonfire.Classify.Categories.by_username/2","doc":"","ref":"Bonfire.Classify.Categories.html#by_username/2"},{"type":"function","title":"Bonfire.Classify.Categories.clean_username/1","doc":"","ref":"Bonfire.Classify.Categories.html#clean_username/1"},{"type":"function","title":"Bonfire.Classify.Categories.create/3","doc":"Create a brand-new category object, with info stored in profile and character mixins","ref":"Bonfire.Classify.Categories.html#create/3"},{"type":"function","title":"Bonfire.Classify.Categories.create_remote/1","doc":"","ref":"Bonfire.Classify.Categories.html#create_remote/1"},{"type":"function","title":"Bonfire.Classify.Categories.federation_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#federation_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.format_actor/1","doc":"","ref":"Bonfire.Classify.Categories.html#format_actor/1"},{"type":"function","title":"Bonfire.Classify.Categories.get/2","doc":"","ref":"Bonfire.Classify.Categories.html#get/2"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format_name/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format_name/1"},{"type":"function","title":"Bonfire.Classify.Categories.indexing_object_format_parent/1","doc":"","ref":"Bonfire.Classify.Categories.html#indexing_object_format_parent/1"},{"type":"function","title":"Bonfire.Classify.Categories.list/2","doc":"","ref":"Bonfire.Classify.Categories.html#list/2"},{"type":"function","title":"Bonfire.Classify.Categories.list_tree/2","doc":"","ref":"Bonfire.Classify.Categories.html#list_tree/2"},{"type":"function","title":"Bonfire.Classify.Categories.moderators/1","doc":"","ref":"Bonfire.Classify.Categories.html#moderators/1"},{"type":"function","title":"Bonfire.Classify.Categories.name_already_taken?/1","doc":"","ref":"Bonfire.Classify.Categories.html#name_already_taken?/1"},{"type":"function","title":"Bonfire.Classify.Categories.one/2","doc":"","ref":"Bonfire.Classify.Categories.html#one/2"},{"type":"function","title":"Bonfire.Classify.Categories.put_attrs_with_parent_category/2","doc":"","ref":"Bonfire.Classify.Categories.html#put_attrs_with_parent_category/2"},{"type":"function","title":"Bonfire.Classify.Categories.put_generated_username/2","doc":"","ref":"Bonfire.Classify.Categories.html#put_generated_username/2"},{"type":"function","title":"Bonfire.Classify.Categories.query_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#query_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.schema_module/0","doc":"","ref":"Bonfire.Classify.Categories.html#schema_module/0"},{"type":"function","title":"Bonfire.Classify.Categories.soft_delete/2","doc":"","ref":"Bonfire.Classify.Categories.html#soft_delete/2"},{"type":"function","title":"Bonfire.Classify.Categories.try_several_usernames/4","doc":"","ref":"Bonfire.Classify.Categories.html#try_several_usernames/4"},{"type":"function","title":"Bonfire.Classify.Categories.update/4","doc":"","ref":"Bonfire.Classify.Categories.html#update/4"},{"type":"function","title":"Bonfire.Classify.Categories.update_local_actor/2","doc":"","ref":"Bonfire.Classify.Categories.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Classify.Categories.update_remote_actor/2","doc":"","ref":"Bonfire.Classify.Categories.html#update_remote_actor/2"},{"type":"function","title":"Bonfire.Classify.Categories.username_with_parent/2","doc":"","ref":"Bonfire.Classify.Categories.html#username_with_parent/2"},{"type":"module","title":"Bonfire.Classify.Category","doc":"","ref":"Bonfire.Classify.Category.html"},{"type":"function","title":"Bonfire.Classify.Category.base_create_changeset/2","doc":"","ref":"Bonfire.Classify.Category.html#base_create_changeset/2"},{"type":"function","title":"Bonfire.Classify.Category.context_module/0","doc":"","ref":"Bonfire.Classify.Category.html#context_module/0"},{"type":"function","title":"Bonfire.Classify.Category.create_changeset/3","doc":"","ref":"Bonfire.Classify.Category.html#create_changeset/3"},{"type":"function","title":"Bonfire.Classify.Category.delete/2","doc":"","ref":"Bonfire.Classify.Category.html#delete/2"},{"type":"function","title":"Bonfire.Classify.Category.follow_filters/0","doc":"","ref":"Bonfire.Classify.Category.html#follow_filters/0"},{"type":"function","title":"Bonfire.Classify.Category.get/3","doc":"","ref":"Bonfire.Classify.Category.html#get/3"},{"type":"function","title":"Bonfire.Classify.Category.put/3","doc":"","ref":"Bonfire.Classify.Category.html#put/3"},{"type":"function","title":"Bonfire.Classify.Category.query_module/0","doc":"","ref":"Bonfire.Classify.Category.html#query_module/0"},{"type":"function","title":"Bonfire.Classify.Category.update_changeset/3","doc":"","ref":"Bonfire.Classify.Category.html#update_changeset/3"},{"type":"type","title":"Bonfire.Classify.Category.t/0","doc":"","ref":"Bonfire.Classify.Category.html#t:t/0"},{"type":"module","title":"Bonfire.Classify.Category.Queries","doc":"","ref":"Bonfire.Classify.Category.Queries.html"},{"type":"function","title":"Bonfire.Classify.Category.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Classify.Category.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Classify.Category.Queries.join_to/3","doc":"","ref":"Bonfire.Classify.Category.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Classify.Category.Queries.queries/4","doc":"","ref":"Bonfire.Classify.Category.Queries.html#queries/4"},{"type":"function","title":"Bonfire.Classify.Category.Queries.query/1","doc":"","ref":"Bonfire.Classify.Category.Queries.html#query/1"},{"type":"function","title":"Bonfire.Classify.Category.Queries.query/2","doc":"","ref":"Bonfire.Classify.Category.Queries.html#query/2"},{"type":"module","title":"Bonfire.Classify.LiveHandler","doc":"","ref":"Bonfire.Classify.LiveHandler.html"},{"type":"function","title":"Bonfire.Classify.LiveHandler.declared_extension/0","doc":"","ref":"Bonfire.Classify.LiveHandler.html#declared_extension/0"},{"type":"function","title":"Bonfire.Classify.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.mounted/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#mounted/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.new/3","doc":"","ref":"Bonfire.Classify.LiveHandler.html#new/3"},{"type":"function","title":"Bonfire.Classify.LiveHandler.set_image/5","doc":"","ref":"Bonfire.Classify.LiveHandler.html#set_image/5"},{"type":"macro","title":"Bonfire.Classify.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Classify.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Classify.RuntimeConfig","doc":"","ref":"Bonfire.Classify.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Classify.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Classify.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Classify.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Classify.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Classify.Simulate","doc":"","ref":"Bonfire.Classify.Simulate.html"},{"type":"function","title":"Bonfire.Classify.Simulate.category/1","doc":"","ref":"Bonfire.Classify.Simulate.html#category/1"},{"type":"function","title":"Bonfire.Classify.Simulate.fake_category!/3","doc":"","ref":"Bonfire.Classify.Simulate.html#fake_category!/3"},{"type":"module","title":"Bonfire.Classify.Tree","doc":"A mixin used to record parent/child relationships between categories (eg. a topic that belongs to a group) and between objects and categories (eg. a post was published in a topic)","ref":"Bonfire.Classify.Tree.html"},{"type":"function","title":"Bonfire.Classify.Tree.ancestor_ids/1","doc":"","ref":"Bonfire.Classify.Tree.html#ancestor_ids/1"},{"type":"function","title":"Bonfire.Classify.Tree.ancestors/1","doc":"","ref":"Bonfire.Classify.Tree.html#ancestors/1"},{"type":"function","title":"Bonfire.Classify.Tree.arrange/2","doc":"","ref":"Bonfire.Classify.Tree.html#arrange/2"},{"type":"function","title":"Bonfire.Classify.Tree.build_child/1","doc":"","ref":"Bonfire.Classify.Tree.html#build_child/1"},{"type":"function","title":"Bonfire.Classify.Tree.changeset/2","doc":"","ref":"Bonfire.Classify.Tree.html#changeset/2"},{"type":"function","title":"Bonfire.Classify.Tree.children/1","doc":"","ref":"Bonfire.Classify.Tree.html#children/1"},{"type":"function","title":"Bonfire.Classify.Tree.delete/2","doc":"","ref":"Bonfire.Classify.Tree.html#delete/2"},{"type":"function","title":"Bonfire.Classify.Tree.depth/1","doc":"","ref":"Bonfire.Classify.Tree.html#depth/1"},{"type":"function","title":"Bonfire.Classify.Tree.descendants/1","doc":"","ref":"Bonfire.Classify.Tree.html#descendants/1"},{"type":"function","title":"Bonfire.Classify.Tree.get/3","doc":"","ref":"Bonfire.Classify.Tree.html#get/3"},{"type":"function","title":"Bonfire.Classify.Tree.make_child_of/2","doc":"","ref":"Bonfire.Classify.Tree.html#make_child_of/2"},{"type":"function","title":"Bonfire.Classify.Tree.parent/1","doc":"","ref":"Bonfire.Classify.Tree.html#parent/1"},{"type":"function","title":"Bonfire.Classify.Tree.parent_id/1","doc":"","ref":"Bonfire.Classify.Tree.html#parent_id/1"},{"type":"function","title":"Bonfire.Classify.Tree.path/1","doc":"","ref":"Bonfire.Classify.Tree.html#path/1"},{"type":"function","title":"Bonfire.Classify.Tree.path_ids/1","doc":"","ref":"Bonfire.Classify.Tree.html#path_ids/1"},{"type":"function","title":"Bonfire.Classify.Tree.put/3","doc":"","ref":"Bonfire.Classify.Tree.html#put/3"},{"type":"function","title":"Bonfire.Classify.Tree.put_tree/3","doc":"","ref":"Bonfire.Classify.Tree.html#put_tree/3"},{"type":"function","title":"Bonfire.Classify.Tree.root/1","doc":"","ref":"Bonfire.Classify.Tree.html#root/1"},{"type":"function","title":"Bonfire.Classify.Tree.root?/1","doc":"","ref":"Bonfire.Classify.Tree.html#root?/1"},{"type":"function","title":"Bonfire.Classify.Tree.root_id/1","doc":"","ref":"Bonfire.Classify.Tree.html#root_id/1"},{"type":"function","title":"Bonfire.Classify.Tree.siblings/1","doc":"","ref":"Bonfire.Classify.Tree.html#siblings/1"},{"type":"function","title":"Bonfire.Classify.Tree.subtree/1","doc":"","ref":"Bonfire.Classify.Tree.html#subtree/1"},{"type":"function","title":"Bonfire.Classify.Tree.where_depth/2","doc":"","ref":"Bonfire.Classify.Tree.html#where_depth/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Extensible/configurable tools for translating Bonfire data to/from ActivityStreams\n- Bonfire Adapter for the [ActivityPub federation library ](https://github.com/bonfire-networks/activity_pub)","ref":"Bonfire.Federate.ActivityPub.html"},{"type":"module","title":"Testing - Bonfire.Federate.ActivityPub","doc":"There are unit tests both in this repo, and in the activity_pub lib, but they can't cover every possible federation case, so manual testing with e.g. `curl -H \"Accept: application/activity+json\" -v \"http://localhost:4001/pub/actors/my_username\" | jq '.'` and by trying out federation flows between instances of Bonfire and other ActivityPub implementation is a must.","ref":"Bonfire.Federate.ActivityPub.html#module-testing"},{"type":"module","title":"Handy commands - Bonfire.Federate.ActivityPub","doc":"","ref":"Bonfire.Federate.ActivityPub.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Federate.ActivityPub","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Federate.ActivityPub.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Federate.ActivityPub.disable/1","doc":"","ref":"Bonfire.Federate.ActivityPub.html#disable/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.federating?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.html#federating?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.federating_default?/0","doc":"","ref":"Bonfire.Federate.ActivityPub.html#federating_default?/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.repo/0","doc":"","ref":"Bonfire.Federate.ActivityPub.html#repo/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.set_federating/2","doc":"","ref":"Bonfire.Federate.ActivityPub.html#set_federating/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Adapter","doc":"Adapter functions delegated from the `ActivityPub` Library","ref":"Bonfire.Federate.ActivityPub.Adapter.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.external_followers_for_activity/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#external_followers_for_activity/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.federate_actor?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#federate_actor?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_actor_by_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_actor_by_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_follower_local_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_follower_local_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_following_local_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_following_local_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_locale/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_locale/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_or_create_service_actor/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_or_create_service_actor/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.get_redirect_url/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#get_redirect_url/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.handle_activity/1","doc":"Process incoming activities","ref":"Bonfire.Federate.ActivityPub.Adapter.html#handle_activity/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.local_actor_updated/2","doc":"For updating an Actor in cache after a User/etc is updated","ref":"Bonfire.Federate.ActivityPub.Adapter.html#local_actor_updated/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.maybe_create_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#maybe_create_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.maybe_publish_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#maybe_publish_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.redirect_to_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#redirect_to_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_local_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Adapter.update_remote_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Adapter.html#update_remote_actor/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.AdapterUtils","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.all_actors/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#all_actors/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.all_recipients/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#all_recipients/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.ap_base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#ap_base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.apply_fun_style/3","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#apply_fun_style/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.character_module/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#character_module/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.character_to_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#character_to_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.create_author_object/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#create_author_object/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.create_remote_actor/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#create_remote_actor/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/3","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.determine_recipients/4","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#determine_recipients/4"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.format_actor/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#format_actor/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_actor_by_ap_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_actor_by_ap_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_actor_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_actor_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_author/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_author/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_by_url_ap_id_or_username/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_by_url_ap_id_or_username/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_ap_id!/1","doc":"without :ok / :error tuple","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_character_by_username/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_character_by_username/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_context_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_context_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_creator_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_creator_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_different_creator_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_different_creator_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_in_reply_to/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_in_reply_to/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_local_actor_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_local_actor_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_local_character_by_ap_id/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_local_character_by_ap_id/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_ap_id!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_object_or_actor_by_ap_id!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_object_or_actor_by_ap_id!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_create_service_character/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_create_service_character/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_and_create_by_uri/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_and_create_by_uri/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_and_create_by_username/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_and_create_by_username/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_or_fetch_character_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_or_fetch_character_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.get_pointer_id_by_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#get_pointer_id_by_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.id_or_object_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#id_or_object_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_follow?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_follow?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local?/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local?/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local_collection?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local_collection?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.is_local_collection_or_built_in?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#is_local_collection_or_built_in?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.local_actor_ids/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#local_actor_ids/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.log/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#log/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_add_aliases/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_add_aliases/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_attach_property_value/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_attach_property_value/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_banner_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_banner_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_icon_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_icon_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_create_image_object/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_create_image_object/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_fix_image_object/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_fix_image_object/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_format_image_object_from_path/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_format_image_object_from_path/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.maybe_pointer_id_for_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#maybe_pointer_id_for_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.preload_peered/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#preload_peered/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.public_uri/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#public_uri/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.return_pointable/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#return_pointable/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.return_pointer/2","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#return_pointer/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.service_character_id/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#service_character_id/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.service_character_username/0","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#service_character_username/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.the_ap_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#the_ap_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.AdapterUtils.validate_url/1","doc":"","ref":"Bonfire.Federate.ActivityPub.AdapterUtils.html#validate_url/1"},{"type":"module","title":"Bonfire.Federate.ActivityPub.BoundariesMRF","doc":"Filter activities depending on their origin instance, actor, or other criteria","ref":"Bonfire.Federate.ActivityPub.BoundariesMRF.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.BoundariesMRF.actor_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.BoundariesMRF.html#actor_blocked?/3"},{"type":"behaviour","title":"Bonfire.Federate.ActivityPub.FederationModules","doc":"A automatically-generated global list of federation modules which can queried by activity and/or object type.\n\nTo add a module to this list, you should declare `@behaviour Bonfire.Federate.ActivityPub.FederationModules` in it and define a `federation_module/0` function which returns a list of object and/or activity types which that module handles.\n\nExample:\n```\n@behaviour Bonfire.Federate.ActivityPub.FederationModules\ndef federation_module,\n do: [\n \"Announce\",\n {\"Create\", \"Announce\"},\n {\"Undo\", \"Announce\"},\n {\"Delete\", \"Announce\"}\n ]\n```\n\nYou should also then implement these two functions:\n- for outgoing federation: `ap_publish_activity(subject_struct, verb, object_struct)`\n- for incoming federation: `ap_receive_activity(subject_struct, activity_json, object_json)`","ref":"Bonfire.Federate.ActivityPub.FederationModules.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.app_modules/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#app_modules/0"},{"type":"callback","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module/0","doc":"Get a Federation Module identified by activity and/or object type, given a activity and/or object (string or {activity, object} tuple).","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#c:federation_module/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module/2","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_module/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_module!/2","doc":"Look up a Federation Module, throw :not_found if not found.","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_module!/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_modules/1","doc":"Look up many types at once, throw :not_found if any of them are not found","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_modules/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.federation_modules_data_types/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#federation_modules_data_types/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.maybe_federation_module/2","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#maybe_federation_module/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.FederationModules.modules/0","doc":"","ref":"Bonfire.Federate.ActivityPub.FederationModules.html#modules/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Incoming","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.no_federation_module_match/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#no_federation_module_match/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_activity/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_activity/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_activity/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_activity/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Incoming.receive_object/2","doc":"Create an object without an activity","ref":"Bonfire.Federate.ActivityPub.Incoming.html#receive_object/2"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Instances","doc":"Federated instances\nContext for `Bonfire.Data.ActivityPub.Peer`","ref":"Bonfire.Federate.ActivityPub.Instances.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_by_domain/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_by_domain/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_by_id/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_by_id/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_or_create/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_or_create/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.get_or_create_instance_circle/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#get_or_create_instance_circle/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.is_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#is_blocked?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list_paginated/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list_paginated/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Instances.list_query/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Instances.html#list_query/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.LoadTesting","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.LoadTesting.cases/0","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html#cases/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.LoadTesting.run_bench/0","doc":"","ref":"Bonfire.Federate.ActivityPub.LoadTesting.html#run_bench/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.base_url/0","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html#base_url/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.gather_nodeinfo_data/0","doc":"","ref":"Bonfire.Federate.ActivityPub.NodeinfoAdapter.html#gather_nodeinfo_data/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Outgoing","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.ap_activity!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#ap_activity!/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.federate_outgoing?/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#federate_outgoing?/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.maybe_federate/4","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#maybe_federate/4"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.preparation_error/2","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#preparation_error/2"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.push_actor_update/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#push_actor_update/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Outgoing.push_now!/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Outgoing.html#push_now!/1"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Peered","doc":"Federated actors or objects\nContext for `Bonfire.Data.ActivityPub.Peered`","ref":"Bonfire.Federate.ActivityPub.Peered.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.get/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#get/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.get_canonical_uri/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#get_canonical_uri/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.is_blocked?/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#is_blocked?/3"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.list/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#list/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Peered.save_canonical_uri/3","doc":"","ref":"Bonfire.Federate.ActivityPub.Peered.html#save_canonical_uri/3"},{"type":"module","title":"Bonfire.Federate.ActivityPub.RuntimeConfig","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Federate.ActivityPub.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Federate.ActivityPub.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Federate.ActivityPub.Simulate","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.actor_json/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#actor_json/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.fake_remote_user/1","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#fake_remote_user/1"},{"type":"function","title":"Bonfire.Federate.ActivityPub.Simulate.webfingered/0","doc":"","ref":"Bonfire.Federate.ActivityPub.Simulate.html#webfingered/0"},{"type":"module","title":"Bonfire.Geolocate","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Geolocation schema\n- Optional GraphQL API for geolocations\n- Geocoding of addresses\n- Reverse geocoding","ref":"Bonfire.Geolocate.html"},{"type":"module","title":"Usage - Bonfire.Geolocate","doc":"If you want to use the map LiveView component, you will need to `npm add leaflet --save --prefix assets/` in your app, and import","ref":"Bonfire.Geolocate.html#module-usage"},{"type":"module","title":"Handy commands - Bonfire.Geolocate","doc":"","ref":"Bonfire.Geolocate.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Geolocate","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Geolocate.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Geolocate.start/2","doc":"","ref":"Bonfire.Geolocate.html#start/2"},{"type":"module","title":"Bonfire.Geolocate.Geocode","doc":"","ref":"Bonfire.Geolocate.Geocode.html"},{"type":"function","title":"Bonfire.Geolocate.Geocode.coordinates/1","doc":"","ref":"Bonfire.Geolocate.Geocode.html#coordinates/1"},{"type":"module","title":"Bonfire.Geolocate.Geolocation","doc":"","ref":"Bonfire.Geolocate.Geolocation.html"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.context_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#context_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.create_changeset/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#create_changeset/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.delete/2","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#delete/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.follow_filters/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#follow_filters/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.get/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#get/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.put/3","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#put/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.query_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#query_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocation.update_changeset/2","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#update_changeset/2"},{"type":"type","title":"Bonfire.Geolocate.Geolocation.t/0","doc":"","ref":"Bonfire.Geolocate.Geolocation.html#t:t/0"},{"type":"module","title":"Bonfire.Geolocate.Geolocations","doc":"","ref":"Bonfire.Geolocate.Geolocations.html"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.ap_publish_activity/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.ap_receive_activity/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.create/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#create/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.create/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#create/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.cursor/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#cursor/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.federation_module/0","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#federation_module/0"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.indexing_object_format/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.many/1","doc":"Retrieves a list of geolocations by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for geolocations (inc. tests)","ref":"Bonfire.Geolocate.Geolocations.html#many/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.many!/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#many!/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.maybe_index/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#maybe_index/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.one/1","doc":"Retrieves a single geolocation by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for geolocations (inc. tests)","ref":"Bonfire.Geolocate.Geolocations.html#one/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.populate_coordinates/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#populate_coordinates/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.populate_result/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#populate_result/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.resolve_mappable_address/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#resolve_mappable_address/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.search/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#search/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.soft_delete/2","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#soft_delete/2"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.test_cursor/1","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#test_cursor/1"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.thing_add_location/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#thing_add_location/3"},{"type":"function","title":"Bonfire.Geolocate.Geolocations.update/3","doc":"","ref":"Bonfire.Geolocate.Geolocations.html#update/3"},{"type":"module","title":"Bonfire.Geolocate.GraphQL.Hydration","doc":"","ref":"Bonfire.Geolocate.GraphQL.Hydration.html"},{"type":"function","title":"Bonfire.Geolocate.GraphQL.Hydration.hydrate/0","doc":"","ref":"Bonfire.Geolocate.GraphQL.Hydration.html#hydrate/0"},{"type":"module","title":"Bonfire.Geolocate.LiveHandler","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.create_in_autocomplete/2","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#create_in_autocomplete/2"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Geolocate.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Geolocate.LiveHandler.to_tuple/1","doc":"","ref":"Bonfire.Geolocate.LiveHandler.html#to_tuple/1"},{"type":"module","title":"Bonfire.Geolocate.Places","doc":"","ref":"Bonfire.Geolocate.Places.html"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_place/2","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_place/2"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_place_things/2","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_place_things/2"},{"type":"function","title":"Bonfire.Geolocate.Places.fetch_places/1","doc":"","ref":"Bonfire.Geolocate.Places.html#fetch_places/1"},{"type":"module","title":"Bonfire.Geolocate.Queries","doc":"","ref":"Bonfire.Geolocate.Queries.html"},{"type":"function","title":"Bonfire.Geolocate.Queries.filter/2","doc":"","ref":"Bonfire.Geolocate.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Geolocate.Queries.join_to/3","doc":"","ref":"Bonfire.Geolocate.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Geolocate.Queries.queries/5","doc":"","ref":"Bonfire.Geolocate.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Geolocate.Queries.query/1","doc":"","ref":"Bonfire.Geolocate.Queries.html#query/1"},{"type":"function","title":"Bonfire.Geolocate.Queries.query/2","doc":"","ref":"Bonfire.Geolocate.Queries.html#query/2"},{"type":"module","title":"Bonfire.Geolocate.RuntimeConfig","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Geolocate.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Geolocate.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Geolocate.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Geolocate.Simulate","doc":"","ref":"Bonfire.Geolocate.Simulate.html"},{"type":"function","title":"Bonfire.Geolocate.Simulate.address/0","doc":"","ref":"Bonfire.Geolocate.Simulate.html#address/0"},{"type":"function","title":"Bonfire.Geolocate.Simulate.fake_geolocation!/3","doc":"","ref":"Bonfire.Geolocate.Simulate.html#fake_geolocation!/3"},{"type":"function","title":"Bonfire.Geolocate.Simulate.geolocation/1","doc":"","ref":"Bonfire.Geolocate.Simulate.html#geolocation/1"},{"type":"function","title":"Bonfire.Geolocate.Simulate.geolocation_input/1","doc":"","ref":"Bonfire.Geolocate.Simulate.html#geolocation_input/1"},{"type":"function","title":"Bonfire.Geolocate.Simulate.mappable_address/0","doc":"","ref":"Bonfire.Geolocate.Simulate.html#mappable_address/0"},{"type":"module","title":"Bonfire.Geolocate.Web.Routes","doc":"","ref":"Bonfire.Geolocate.Web.Routes.html"},{"type":"function","title":"Bonfire.Geolocate.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Geolocate.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Invite.Links","doc":"An extension for [Bonfire](https://bonfire.cafe/) to generate invite links","ref":"Bonfire.Invite.Links.html"},{"type":"module","title":"Handy commands - Bonfire.Invite.Links","doc":"","ref":"Bonfire.Invite.Links.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Invite.Links","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Invite.Links.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Invite.Links.create/2","doc":"","ref":"Bonfire.Invite.Links.html#create/2"},{"type":"function","title":"Bonfire.Invite.Links.date_expires/1","doc":"","ref":"Bonfire.Invite.Links.html#date_expires/1"},{"type":"function","title":"Bonfire.Invite.Links.expired?/1","doc":"","ref":"Bonfire.Invite.Links.html#expired?/1"},{"type":"function","title":"Bonfire.Invite.Links.get/2","doc":"","ref":"Bonfire.Invite.Links.html#get/2"},{"type":"function","title":"Bonfire.Invite.Links.list_paginated/2","doc":"","ref":"Bonfire.Invite.Links.html#list_paginated/2"},{"type":"function","title":"Bonfire.Invite.Links.one/2","doc":"","ref":"Bonfire.Invite.Links.html#one/2"},{"type":"function","title":"Bonfire.Invite.Links.query/2","doc":"","ref":"Bonfire.Invite.Links.html#query/2"},{"type":"function","title":"Bonfire.Invite.Links.redeem/1","doc":"","ref":"Bonfire.Invite.Links.html#redeem/1"},{"type":"function","title":"Bonfire.Invite.Links.redeemable?/1","doc":"","ref":"Bonfire.Invite.Links.html#redeemable?/1"},{"type":"module","title":"Bonfire.Invite.Links.Fake","doc":"","ref":"Bonfire.Invite.Links.Fake.html"},{"type":"module","title":"Bonfire.Invite.Links.Integration","doc":"","ref":"Bonfire.Invite.Links.Integration.html"},{"type":"function","title":"Bonfire.Invite.Links.Integration.repo/0","doc":"","ref":"Bonfire.Invite.Links.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Invite.Links.LiveHandler","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html"},{"type":"function","title":"Bonfire.Invite.Links.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Invite.Links.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Invite.Links.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Invite.Links.Web.Routes","doc":"","ref":"Bonfire.Invite.Links.Web.Routes.html"},{"type":"function","title":"Bonfire.Invite.Links.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Invite.Links.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.InviteLink","doc":"","ref":"Bonfire.InviteLink.html"},{"type":"function","title":"Bonfire.InviteLink.changeset/2","doc":"","ref":"Bonfire.InviteLink.html#changeset/2"},{"type":"function","title":"Bonfire.InviteLink.delete/2","doc":"","ref":"Bonfire.InviteLink.html#delete/2"},{"type":"function","title":"Bonfire.InviteLink.get/3","doc":"","ref":"Bonfire.InviteLink.html#get/3"},{"type":"function","title":"Bonfire.InviteLink.put/3","doc":"","ref":"Bonfire.InviteLink.html#put/3"},{"type":"module","title":"Bonfire.Label","doc":"Bonfire.Label is a powerful and flexible extension designed to enhance content moderation and improve online safety. Inspired by the design principles outlined by Prosocial Design (specifically the [Label Misleading Content & Add Links to Reliable Related Content](https://www.prosocialdesign.org/library/label-misleading-content-add-links-to-reliable-related-content) pattern), this library enables the addition of custom labels and descriptions to user-generated posts. \n\nThis feature aids in identifying and marking potentially misleading, harmful, or unsafe content, while also providing users with links to reliable and related information.","ref":"Bonfire.Label.html"},{"type":"module","title":"Features - Bonfire.Label","doc":"- **Custom Labeling**: Easily add custom labels to posts, categorizing them based on content, reliability, and safety.\n- **Dynamic Descriptions**: Append descriptions to posts to provide context, warnings, or additional information.\n- **Link to Reliable Sources**: Option to include up to 3 links to authoritative sources for further reading or fact-checking.\n- **Configurable Settings**: Tailor the permission system to fit the specific governance of your platform.\n- **User-friendly Interface**: Intuitive tools for moderators and administrators to manage labels and descriptions.","ref":"Bonfire.Label.html#module-features"},{"type":"module","title":"Copyright and License - Bonfire.Label","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Label.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Label.changeset/2","doc":"","ref":"Bonfire.Label.html#changeset/2"},{"type":"function","title":"Bonfire.Label.delete/2","doc":"","ref":"Bonfire.Label.html#delete/2"},{"type":"function","title":"Bonfire.Label.get/3","doc":"","ref":"Bonfire.Label.html#get/3"},{"type":"function","title":"Bonfire.Label.put/3","doc":"","ref":"Bonfire.Label.html#put/3"},{"type":"module","title":"Bonfire.Label.Acts.LabelObject","doc":"Takes an object and label and returns a changeset for labeling that object. \nImplements `Bonfire.Epics.Act`.\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n\nAct Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.","ref":"Bonfire.Label.Acts.LabelObject.html"},{"type":"module","title":"Bonfire.Label.ContentLabels","doc":"","ref":"Bonfire.Label.ContentLabels.html"},{"type":"function","title":"Bonfire.Label.ContentLabels.built_in_ids/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#built_in_ids/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.built_ins/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#built_ins/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.can_label?/3","doc":"","ref":"Bonfire.Label.ContentLabels.html#can_label?/3"},{"type":"function","title":"Bonfire.Label.ContentLabels.labels/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#labels/0"},{"type":"function","title":"Bonfire.Label.ContentLabels.labels_under/1","doc":"","ref":"Bonfire.Label.ContentLabels.html#labels_under/1"},{"type":"function","title":"Bonfire.Label.ContentLabels.parent_label_id/0","doc":"","ref":"Bonfire.Label.ContentLabels.html#parent_label_id/0"},{"type":"module","title":"Bonfire.Label.Fake","doc":"","ref":"Bonfire.Label.Fake.html"},{"type":"module","title":"Bonfire.Label.Labelling","doc":"","ref":"Bonfire.Label.Labelling.html"},{"type":"function","title":"Bonfire.Label.Labelling.ap_publish_activity/3","doc":"","ref":"Bonfire.Label.Labelling.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Label.Labelling.count/2","doc":"","ref":"Bonfire.Label.Labelling.html#count/2"},{"type":"function","title":"Bonfire.Label.Labelling.date_last_labelled/2","doc":"","ref":"Bonfire.Label.Labelling.html#date_last_labelled/2"},{"type":"function","title":"Bonfire.Label.Labelling.get/3","doc":"","ref":"Bonfire.Label.Labelling.html#get/3"},{"type":"function","title":"Bonfire.Label.Labelling.get!/3","doc":"","ref":"Bonfire.Label.Labelling.html#get!/3"},{"type":"function","title":"Bonfire.Label.Labelling.label_object/3","doc":"","ref":"Bonfire.Label.Labelling.html#label_object/3"},{"type":"function","title":"Bonfire.Label.Labelling.labelled?/2","doc":"","ref":"Bonfire.Label.Labelling.html#labelled?/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_by/2","doc":"List labels by the user","ref":"Bonfire.Label.Labelling.html#list_by/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_my/1","doc":"List current user's labels","ref":"Bonfire.Label.Labelling.html#list_my/1"},{"type":"function","title":"Bonfire.Label.Labelling.list_of/2","doc":"List label of an object","ref":"Bonfire.Label.Labelling.html#list_of/2"},{"type":"function","title":"Bonfire.Label.Labelling.list_paginated/2","doc":"","ref":"Bonfire.Label.Labelling.html#list_paginated/2"},{"type":"function","title":"Bonfire.Label.Labelling.query/2","doc":"","ref":"Bonfire.Label.Labelling.html#query/2"},{"type":"function","title":"Bonfire.Label.Labelling.query_module/0","doc":"","ref":"Bonfire.Label.Labelling.html#query_module/0"},{"type":"function","title":"Bonfire.Label.Labelling.run_epic/4","doc":"","ref":"Bonfire.Label.Labelling.html#run_epic/4"},{"type":"function","title":"Bonfire.Label.Labelling.schema_module/0","doc":"","ref":"Bonfire.Label.Labelling.html#schema_module/0"},{"type":"function","title":"Bonfire.Label.Labelling.unlabel/3","doc":"","ref":"Bonfire.Label.Labelling.html#unlabel/3"},{"type":"module","title":"Bonfire.Label.Labels","doc":"","ref":"Bonfire.Label.Labels.html"},{"type":"function","title":"Bonfire.Label.Labels.create/4","doc":"","ref":"Bonfire.Label.Labels.html#create/4"},{"type":"function","title":"Bonfire.Label.Labels.get/2","doc":"","ref":"Bonfire.Label.Labels.html#get/2"},{"type":"function","title":"Bonfire.Label.Labels.get_or_create/4","doc":"","ref":"Bonfire.Label.Labels.html#get_or_create/4"},{"type":"function","title":"Bonfire.Label.Labels.repo/0","doc":"","ref":"Bonfire.Label.Labels.html#repo/0"},{"type":"function","title":"Bonfire.Label.Labels.top_label_id/0","doc":"","ref":"Bonfire.Label.Labels.html#top_label_id/0"},{"type":"module","title":"Bonfire.Label.LiveHandler","doc":"","ref":"Bonfire.Label.LiveHandler.html"},{"type":"function","title":"Bonfire.Label.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Label.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Label.LiveHandler.maybe_tag/4","doc":"","ref":"Bonfire.Label.LiveHandler.html#maybe_tag/4"},{"type":"macro","title":"Bonfire.Label.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Label.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Label.RuntimeConfig","doc":"","ref":"Bonfire.Label.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Label.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Label.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Label.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Label.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Label.Web.Routes","doc":"","ref":"Bonfire.Label.Web.Routes.html"},{"type":"function","title":"Bonfire.Label.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Label.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Localise","doc":"Runs at compile-time to include dynamic strings (like verb names and object types) in localisation string extraction.","ref":"Bonfire.Localise.html"},{"type":"module","title":"Bonfire.Me","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Account creation\n- Email verification\n- Authentication\n- User/Profile creation\n- User/Profile switching\n- User Profile\n- Settings","ref":"Bonfire.Me.html"},{"type":"module","title":"Handy commands - Bonfire.Me","doc":"","ref":"Bonfire.Me.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Me","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Me.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Me.make_account_and_user/4","doc":"","ref":"Bonfire.Me.html#make_account_and_user/4"},{"type":"function","title":"Bonfire.Me.make_account_only/3","doc":"","ref":"Bonfire.Me.html#make_account_only/3"},{"type":"function","title":"Bonfire.Me.make_admin/1","doc":"","ref":"Bonfire.Me.html#make_admin/1"},{"type":"module","title":"Bonfire.Me.Accounts","doc":"An account represents a private identity within the system, and can have many User identities (see `Bonfire.Me.Accounts`). An account usually has an `Bonfire.Data.Identity.Email` and a `Bonfire.Data.Identity.Credential` user for login.","ref":"Bonfire.Me.Accounts.html"},{"type":"function","title":"Bonfire.Me.Accounts.allow_signup?/1","doc":"Checks if signup is allowed based on instance config and provided options.","ref":"Bonfire.Me.Accounts.html#allow_signup?/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.allow_signup?/1","doc":"iex> allow_signup?(%{invite: \"invite_code\"})\n true","ref":"Bonfire.Me.Accounts.html#allow_signup?/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_email/3","doc":"Changes the email for the current account.","ref":"Bonfire.Me.Accounts.html#change_email/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.change_email/3","doc":"> change_email(%Account{}, %{old_email: \"old@example.com\", email: \"new@example.com\"})\n {:ok, %Account{}}\n\n > change_email(%Account{}, %Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#change_email/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_password/3","doc":"Changes the password for the current account.","ref":"Bonfire.Me.Accounts.html#change_password/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.change_password/3","doc":"> change_password(%Account{}, %{old_password: \"old\", password: \"new\"})\n {:ok, %Account{}}\n\n > change_password(%Account{}, %Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#change_password/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.change_password/4","doc":"","ref":"Bonfire.Me.Accounts.html#change_password/4"},{"type":"function","title":"Bonfire.Me.Accounts.changeset/3","doc":"Returns a changeset for the given changeset name and parameters.","ref":"Bonfire.Me.Accounts.html#changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.changeset/3","doc":"> changeset(:forgot_password, %{})\n %Changeset{}\n\n > changeset(:login, %{email: \"test@example.com\", password: \"secret\"})\n %Changeset{}","ref":"Bonfire.Me.Accounts.html#changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.confirm_email/2","doc":"Confirms an account's email address as valid, usually by providing a confirmation token, or directly by providing an Account.","ref":"Bonfire.Me.Accounts.html#confirm_email/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.confirm_email/2","doc":"> confirm_email(\"some_token\")\n {:ok, %Account{}}\n\n > confirm_email(%Account{})\n {:ok, %Account{}}","ref":"Bonfire.Me.Accounts.html#confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.confirm_email_manually/1","doc":"Confirms an account's email manually, by providing the email address. Only for internal or CLI use.","ref":"Bonfire.Me.Accounts.html#confirm_email_manually/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.confirm_email_manually/1","doc":"> confirm_email_manually(\"test@example.com\")\n {:ok, %Account{}}","ref":"Bonfire.Me.Accounts.html#confirm_email_manually/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.count/0","doc":"Counts the number of accounts.","ref":"Bonfire.Me.Accounts.html#count/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.count/0","doc":"iex> count()\n 42","ref":"Bonfire.Me.Accounts.html#count/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.delete/2","doc":"Deletes the given account - use `enqueue_delete/1` instead.","ref":"Bonfire.Me.Accounts.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.delete/2","doc":"iex> delete(%Account{})\n :ok\n\n iex> delete(\"some_account_id\")\n :ok","ref":"Bonfire.Me.Accounts.html#delete/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.do_signup/2","doc":"","ref":"Bonfire.Me.Accounts.html#do_signup/2"},{"type":"function","title":"Bonfire.Me.Accounts.enqueue_delete/1","doc":"Enqueues the deletion of the given account.","ref":"Bonfire.Me.Accounts.html#enqueue_delete/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.enqueue_delete/1","doc":"> enqueue_delete(%Account{})\n :ok\n\n > enqueue_delete(\"some_account_id\")\n :ok","ref":"Bonfire.Me.Accounts.html#enqueue_delete/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.fetch_current/1","doc":"Fetches the current account by its ID, returns `{:error, :not_found}` if the ID is nil.","ref":"Bonfire.Me.Accounts.html#fetch_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.fetch_current/1","doc":"iex> fetch_current(nil)\n {:error, :not_found}\n\n > fetch_current(\"some_id\")\n {:ok, %Account{id: \"some_id\"}}","ref":"Bonfire.Me.Accounts.html#fetch_current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.get_by_email/1","doc":"Returns the account by its email.","ref":"Bonfire.Me.Accounts.html#get_by_email/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.get_by_email/1","doc":"> get_by_email(\"test@example.com\")\n %Account{email: \"test@example.com\"}","ref":"Bonfire.Me.Accounts.html#get_by_email/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.get_current/1","doc":"Returns the current account by its ID or nil if the ID is nil.","ref":"Bonfire.Me.Accounts.html#get_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.get_current/1","doc":"iex> get_current(nil)\n nil\n\n > get_current(\"some_id\")\n %Account{id: \"some_id\"}","ref":"Bonfire.Me.Accounts.html#get_current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.instance_is_invite_only?/0","doc":"Checks if the instance is invite-only.","ref":"Bonfire.Me.Accounts.html#instance_is_invite_only?/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.instance_is_invite_only?/0","doc":"> instance_is_invite_only?()\n true","ref":"Bonfire.Me.Accounts.html#instance_is_invite_only?/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.is_admin?/1","doc":"Checks if the given user or account is an admin.","ref":"Bonfire.Me.Accounts.html#is_admin?/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.is_admin?/1","doc":"> is_admin?(user)\n true\n\n > is_admin?(account)\n true","ref":"Bonfire.Me.Accounts.html#is_admin?/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.is_first_account?/0","doc":"","ref":"Bonfire.Me.Accounts.html#is_first_account?/0"},{"type":"function","title":"Bonfire.Me.Accounts.login/2","doc":"Attempts to log in by password and either username or email.\n\nAccepts a map of parameters or a `LoginFields` changeset.\n\nOn success, returns `{:ok, account, user}` if a username was\nprovided and `{:ok, account, nil}` otherwise.\nOn error, returns `{:error, changeset}`","ref":"Bonfire.Me.Accounts.html#login/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.login/2","doc":"> login(%{email: \"test@example.com\", password: \"secret\"})\n {:ok, %Account{}, nil}\n\n > login(%{username: \"test\", password: \"secret\"})\n {:ok, %Account{}, %User{}}\n\n > login(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#login/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.login_valid?/2","doc":"","ref":"Bonfire.Me.Accounts.html#login_valid?/2"},{"type":"function","title":"Bonfire.Me.Accounts.make_account/2","doc":"","ref":"Bonfire.Me.Accounts.html#make_account/2"},{"type":"function","title":"Bonfire.Me.Accounts.maybe_redeem_invite/2","doc":"","ref":"Bonfire.Me.Accounts.html#maybe_redeem_invite/2"},{"type":"function","title":"Bonfire.Me.Accounts.prepare_signup_opts/1","doc":"","ref":"Bonfire.Me.Accounts.html#prepare_signup_opts/1"},{"type":"function","title":"Bonfire.Me.Accounts.redeemable_invite?/1","doc":"","ref":"Bonfire.Me.Accounts.html#redeemable_invite?/1"},{"type":"function","title":"Bonfire.Me.Accounts.request_confirm_email/2","doc":"Requests an email confirmation for the account.","ref":"Bonfire.Me.Accounts.html#request_confirm_email/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.request_confirm_email/2","doc":"> request_confirm_email(%{email: \"test@example.com\"})\n {:ok, :resent, %Account{}}\n\n > request_confirm_email(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#request_confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.request_forgot_password/1","doc":"Requests a password reset to be sent for the account.","ref":"Bonfire.Me.Accounts.html#request_forgot_password/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.request_forgot_password/1","doc":"> request_forgot_password(%{email: \"test@example.com\"})\n {:ok, :resent, %Account{}}","ref":"Bonfire.Me.Accounts.html#request_forgot_password/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.signup/2","doc":"Signs up a new account with the given parameters.","ref":"Bonfire.Me.Accounts.html#signup/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.signup/2","doc":"> signup(%{email: \"test@example.com\", password: \"secret\"})\n {:ok, %Account{}}\n\n > signup(%Changeset{valid?: false})\n {:error, %Changeset{}}","ref":"Bonfire.Me.Accounts.html#signup/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.update_is_admin/3","doc":"","ref":"Bonfire.Me.Accounts.html#update_is_admin/3"},{"type":"type","title":"Bonfire.Me.Accounts.changeset_name/0","doc":"","ref":"Bonfire.Me.Accounts.html#t:changeset_name/0"},{"type":"module","title":"Bonfire.Me.Accounts.ChangeEmailFields","doc":"A changeset for changing an account's email address","ref":"Bonfire.Me.Accounts.ChangeEmailFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ChangeEmailFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ChangeEmailFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.ChangePasswordFields","doc":"A changeset for changing an account's password","ref":"Bonfire.Me.Accounts.ChangePasswordFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ChangePasswordFields.changeset/3","doc":"","ref":"Bonfire.Me.Accounts.ChangePasswordFields.html#changeset/3"},{"type":"module","title":"Bonfire.Me.Accounts.ConfirmEmailFields","doc":"A changeset for confirming an email address","ref":"Bonfire.Me.Accounts.ConfirmEmailFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ConfirmEmailFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ConfirmEmailFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.ForgotPasswordFields","doc":"A changeset for requesting a password reset","ref":"Bonfire.Me.Accounts.ForgotPasswordFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.ForgotPasswordFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.ForgotPasswordFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.LoginFields","doc":"A changeset for logging in","ref":"Bonfire.Me.Accounts.LoginFields.html"},{"type":"function","title":"Bonfire.Me.Accounts.LoginFields.changeset/2","doc":"","ref":"Bonfire.Me.Accounts.LoginFields.html#changeset/2"},{"type":"module","title":"Bonfire.Me.Accounts.Queries","doc":"Queries for `Bonfire.Me.Accounts`","ref":"Bonfire.Me.Accounts.Queries.html"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.by_confirm_token/1","doc":"Finds an account by email confirmation token.","ref":"Bonfire.Me.Accounts.Queries.html#by_confirm_token/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.by_confirm_token/1","doc":"iex> by_confirm_token(\"some_token\")\n #Ecto.Query<...>","ref":"Bonfire.Me.Accounts.Queries.html#by_confirm_token/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.by_email/1","doc":"Finds an account by email address.","ref":"Bonfire.Me.Accounts.Queries.html#by_email/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.by_email/1","doc":"iex> Bonfire.Me.Accounts.Queries.by_email(\"example@example.com\")\n #Ecto.Query<...>","ref":"Bonfire.Me.Accounts.Queries.html#by_email/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.count/1","doc":"Counts the total number of accounts, or counts the number of records in the provided query.","ref":"Bonfire.Me.Accounts.Queries.html#count/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.count/1","doc":"iex> Bonfire.Me.Accounts.Queries.count()\n\n iex> Bonfire.Me.Accounts.Queries.count(from(a in Account, where: a.active == true))","ref":"Bonfire.Me.Accounts.Queries.html#count/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.current/1","doc":"Retrieves the current account by ID.","ref":"Bonfire.Me.Accounts.Queries.html#current/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.Queries.current/1","doc":"iex> Bonfire.Me.Accounts.Queries.current(\"some_id\")","ref":"Bonfire.Me.Accounts.Queries.html#current/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_account_id/1","doc":"Find an account by ID, preloading email and credential information.","ref":"Bonfire.Me.Accounts.Queries.html#login_by_account_id/1"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_email/1","doc":"Find an account by email address, preloading email and credential information.","ref":"Bonfire.Me.Accounts.Queries.html#login_by_email/1"},{"type":"function","title":"Bonfire.Me.Accounts.Queries.login_by_username/1","doc":"Find an account by username, preloading the user (with character, and profile information).","ref":"Bonfire.Me.Accounts.Queries.html#login_by_username/1"},{"type":"module","title":"Bonfire.Me.Accounts.SecondFactors","doc":"Support for second-factor authentication. Powered by `NimbleTOTP`.","ref":"Bonfire.Me.Accounts.SecondFactors.html"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.changeset/3","doc":"Creates or updates a TOTP changeset.\n\n The secret will only be updated if the OTP code sent is valid.","ref":"Bonfire.Me.Accounts.SecondFactors.html#changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.changeset/3","doc":"iex> Bonfire.Me.Accounts.SecondFactors.changeset(%AuthSecondFactor{}, %{secret: \"new_secret\"}, [])\n %Ecto.Changeset{data: %AuthSecondFactor{}}","ref":"Bonfire.Me.Accounts.SecondFactors.html#changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.delete_account_totp/1","doc":"Disables the TOTP configuration for the given account.","ref":"Bonfire.Me.Accounts.SecondFactors.html#delete_account_totp/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.delete_account_totp/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(%AuthSecondFactor{id: \"some_id\"})\n\n iex> Bonfire.Me.Accounts.SecondFactors.delete_account_totp(\"some_id\")","ref":"Bonfire.Me.Accounts.SecondFactors.html#delete_account_totp/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.enabled?/0","doc":"Checks if second-factor authentication (TOTP) is enabled on the instance.","ref":"Bonfire.Me.Accounts.SecondFactors.html#enabled?/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.enabled?/0","doc":"iex> Bonfire.Me.Accounts.SecondFactors.enabled?()\n true","ref":"Bonfire.Me.Accounts.SecondFactors.html#enabled?/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.format_secret/1","doc":"Formats a TOTP secret into a human-readable format.","ref":"Bonfire.Me.Accounts.SecondFactors.html#format_secret/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.format_secret/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.format_secret(\"JBSWY3DPEHPK3PXP\")\n \"JBSW Y3DP EHPK 3PXP\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#format_secret/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.get_account_totp/1","doc":"Retrieves the second factor record for an account, if any.","ref":"Bonfire.Me.Accounts.SecondFactors.html#get_account_totp/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.get_account_totp/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(%{auth_second_factor: %AuthSecondFactor{}})\n %AuthSecondFactor{}\n\n iex> Bonfire.Me.Accounts.SecondFactors.get_account_totp(\"some_id\")\n %AuthSecondFactor{}","ref":"Bonfire.Me.Accounts.SecondFactors.html#get_account_totp/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.maybe_authenticate/2","doc":"Tries to authenticates an account using the provided parameters.","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_authenticate/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.maybe_authenticate/2","doc":"iex> Bonfire.Me.Accounts.SecondFactors.maybe_authenticate(\"account_id\", %{\"auth_second_factor\" => %{\"code\" => \"123456\"}})\n {:ok, :valid_totp}","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_authenticate/2-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset/3","doc":"Conditionally casts a TOTP changeset based on parameters and options.","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_cast_totp_changeset/3"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset/3","doc":"iex> Bonfire.Me.Accounts.SecondFactors.maybe_cast_totp_changeset(changeset, %{auth_second_factor: %{code: \"123456\"}}, [])\n %Ecto.Changeset{data: %AuthSecondFactor{}}","ref":"Bonfire.Me.Accounts.SecondFactors.html#maybe_cast_totp_changeset/3-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new/0","doc":"Generates a new TOTP secret if second-factor authentication is enabled.\n\n The secret is a random 20 bytes binary that is used to generate the QR Code to enable 2FA using auth applications.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new/0"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new/0","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new()\n \"JBSWY3DPEHPK3PXP\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new/0-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_qrcode/1","doc":"Generates a QR code for the TOTP URI.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_qrcode/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new_qrcode/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new_qrcode()\n \" ... \"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_qrcode/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_struct/1","doc":"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_struct/1"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.new_uri/1","doc":"Generates a new TOTP URI for use in an authentication app.","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_uri/1"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.new_uri/1","doc":"iex> Bonfire.Me.Accounts.SecondFactors.new_uri()\n \"otpauth://totp/bonfire:AccountName?secret=APYWY3DPEHPK3PXV&issuer=Issuer\"\n\n iex> Bonfire.Me.Accounts.SecondFactors.new_uri(\"JBSWY3DPEHPK3PXP\")\n \"otpauth://totp/bonfire:AccountName?secret=JBSWY3DPEHPK3PXP&issuer=Issuer\"","ref":"Bonfire.Me.Accounts.SecondFactors.html#new_uri/1-examples"},{"type":"function","title":"Bonfire.Me.Accounts.SecondFactors.validate_account_totp/2","doc":"Validates if the given TOTP code is valid.","ref":"Bonfire.Me.Accounts.SecondFactors.html#validate_account_totp/2"},{"type":"function","title":"Examples - Bonfire.Me.Accounts.SecondFactors.validate_account_totp/2","doc":"iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(%AuthSecondFactor{id: \"some_id\", secret: \"JBSWY3DPEHPK3PXP\"}, \"123456\")\n :valid_totp\n\n iex> Bonfire.Me.Accounts.SecondFactors.validate_account_totp(\"some_id\", \"123456\")\n :valid_totp","ref":"Bonfire.Me.Accounts.SecondFactors.html#validate_account_totp/2-examples"},{"type":"module","title":"Bonfire.Me.Acts.Caretaker","doc":"An act that deals with maintaining a `Caretaker` record for a changeset.\n\nDuring insertion, adds an associated insert if a caretaker can be found in the epic options.\n\nDuring deletion, ensures that the related record will be cleaned up.\n\nEpic Options (insert):\n * `:caretaker` - user that will take care of the post, falls back to `:current_user`\n * `:current_user` - user that will taker care of the post, fallback if `:caretaker` is not set.\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Me.Acts.Caretaker.html"},{"type":"function","title":"Bonfire.Me.Acts.Caretaker.run/2","doc":"","ref":"Bonfire.Me.Acts.Caretaker.html#run/2"},{"type":"module","title":"Bonfire.Me.Acts.Creator","doc":"An act that deals with maintaining a `Created` record for a changeset.\n\nDuring insertion, adds an associated insert if a creator can be found in the epic options.\n\nDuring deletion, ensures that the related record will be cleaned up.\n\nEpic Options (insert):\n * `:creator` - user that will create the post, falls back to `:current_user`\n * `:current_user` - user that will create the post, fallback if `:creator` is not set.\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Me.Acts.Creator.html"},{"type":"module","title":"Bonfire.Me.Archive.LiveHandler","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Archive.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Me.Archive.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Archive.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Me.Characters","doc":"Shared helpers for character types (such as User or Category)\n\nContext for `Bonfire.Data.Identity.Character` mixin, which has these fields:\n- username\n- username_hash: hashed username (used for preserving uniqueness incl. deleted usernames)\n- outbox: Feed of activities by the user\n- inbox: Feed of messages and other activities for the user\n- notifications: Feed of notifications for the user","ref":"Bonfire.Me.Characters.html"},{"type":"function","title":"Bonfire.Me.Characters.by_username/1","doc":"Retrieves a character by username.","ref":"Bonfire.Me.Characters.html#by_username/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.by_username/1","doc":"> Bonfire.Me.Characters.by_username(\"username\")\n %Bonfire.Data.Identity.Character{}","ref":"Bonfire.Me.Characters.html#by_username/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.by_username!/1","doc":"","ref":"Bonfire.Me.Characters.html#by_username!/1"},{"type":"function","title":"Bonfire.Me.Characters.by_username_q/1","doc":"","ref":"Bonfire.Me.Characters.html#by_username_q/1"},{"type":"function","title":"Bonfire.Me.Characters.changeset/3","doc":"","ref":"Bonfire.Me.Characters.html#changeset/3"},{"type":"function","title":"Bonfire.Me.Characters.character_mention_prefix/1","doc":"Returns the appropriate mention prefix for a character type.","ref":"Bonfire.Me.Characters.html#character_mention_prefix/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.character_mention_prefix/1","doc":"iex> Bonfire.Me.Characters.character_mention_prefix(%Bonfire.Data.Identity.User{})\n \"@\"","ref":"Bonfire.Me.Characters.html#character_mention_prefix/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.character_url/1","doc":"Returns the canonical URL for a character.","ref":"Bonfire.Me.Characters.html#character_url/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.character_url/1","doc":"iex> Bonfire.Me.Characters.character_url(%Bonfire.Data.Identity.Character{})\n \"http://example.com/character/username\"","ref":"Bonfire.Me.Characters.html#character_url/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.clean_username/1","doc":"Cleans a username by replacing forbidden characters with underscores.","ref":"Bonfire.Me.Characters.html#clean_username/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.clean_username/1","doc":"iex> Bonfire.Me.Characters.clean_username(\"invalid username!\")\n \"invalid_username\"","ref":"Bonfire.Me.Characters.html#clean_username/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.display_username/4","doc":"Displays a username with optional domain and prefix.","ref":"Bonfire.Me.Characters.html#display_username/4"},{"type":"function","title":"Examples - Bonfire.Me.Characters.display_username/4","doc":"iex> Bonfire.Me.Characters.display_username(\"username\")\n \"@username\"\n\n iex> Bonfire.Me.Characters.display_username(\"username\", true, true, \"@\")\n \"@username@domain.com\"","ref":"Bonfire.Me.Characters.html#display_username/4-examples"},{"type":"function","title":"Bonfire.Me.Characters.get/1","doc":"Retrieves multiple characters by IDs.","ref":"Bonfire.Me.Characters.html#get/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.get/1","doc":"> Bonfire.Me.Characters.get(\"id_or_username\")\n %Bonfire.Data.Identity.Character{}\n\n > Bonfire.Me.Characters.get([\"id1\", \"id2\"])\n {:ok, [%Bonfire.Data.Identity.Character{}, %Bonfire.Data.Identity.Character{}]}","ref":"Bonfire.Me.Characters.html#get/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.hash_available?/1","doc":"Checks if a username hash is available.","ref":"Bonfire.Me.Characters.html#hash_available?/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.hash_available?/1","doc":"iex> Bonfire.Me.Characters.hash_available?(\"hash\")\n true","ref":"Bonfire.Me.Characters.html#hash_available?/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.hash_delete/1","doc":"Deletes a character by username hash.","ref":"Bonfire.Me.Characters.html#hash_delete/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.hash_delete/1","doc":"> Bonfire.Me.Characters.hash_delete(\"hash\")","ref":"Bonfire.Me.Characters.html#hash_delete/1-examples"},{"type":"function","title":"Bonfire.Me.Characters.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Characters.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Characters.q_by_id/1","doc":"","ref":"Bonfire.Me.Characters.html#q_by_id/1"},{"type":"function","title":"Bonfire.Me.Characters.remote_changeset/2","doc":"","ref":"Bonfire.Me.Characters.html#remote_changeset/2"},{"type":"function","title":"Bonfire.Me.Characters.schema_module/0","doc":"","ref":"Bonfire.Me.Characters.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Characters.update/2","doc":"Updates a character with the given attributes.","ref":"Bonfire.Me.Characters.html#update/2"},{"type":"function","title":"Examples - Bonfire.Me.Characters.update/2","doc":"> Bonfire.Me.Characters.update(%Bonfire.Data.Identity.Character{}, %{field: \"value\"})\n {:ok, %Bonfire.Data.Identity.Character{}}","ref":"Bonfire.Me.Characters.html#update/2-examples"},{"type":"function","title":"Bonfire.Me.Characters.username_available?/1","doc":"Checks if a username is available.","ref":"Bonfire.Me.Characters.html#username_available?/1"},{"type":"function","title":"Examples - Bonfire.Me.Characters.username_available?/1","doc":"iex> Bonfire.Me.Characters.username_available?(\"non_existing_username\")\n true","ref":"Bonfire.Me.Characters.html#username_available?/1-examples"},{"type":"module","title":"Bonfire.Me.DeleteWorker","doc":"Handles queued deletion of a user and its data.","ref":"Bonfire.Me.DeleteWorker.html"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete/2","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete/2"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete_now/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete_now/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.delete_structs_now/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#delete_structs_now/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.enqueue_delete/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#enqueue_delete/1"},{"type":"function","title":"Bonfire.Me.DeleteWorker.perform/1","doc":"","ref":"Bonfire.Me.DeleteWorker.html#perform/1"},{"type":"module","title":"Bonfire.Me.Fake","doc":"","ref":"Bonfire.Me.Fake.html"},{"type":"function","title":"Bonfire.Me.Fake.fake_account!/2","doc":"","ref":"Bonfire.Me.Fake.html#fake_account!/2"},{"type":"function","title":"Bonfire.Me.Fake.fake_user!/3","doc":"","ref":"Bonfire.Me.Fake.html#fake_user!/3"},{"type":"module","title":"Bonfire.Me.Fake.Helpers","doc":"","ref":"Bonfire.Me.Fake.Helpers.html"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.atusername/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#atusername/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.avatar_url/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#avatar_url/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.avatar_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#avatar_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.character_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#character_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.confirm_token/0","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#confirm_token/0"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.create_user_form/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#create_user_form/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.credential_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#credential_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.email_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#email_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.icon_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#icon_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.image/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#image/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.image_url/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#image_url/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.profile_subform/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#profile_subform/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.signup_form/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#signup_form/1"},{"type":"function","title":"Bonfire.Me.Fake.Helpers.user_live/1","doc":"","ref":"Bonfire.Me.Fake.Helpers.html#user_live/1"},{"type":"module","title":"Bonfire.Me.Integration","doc":"","ref":"Bonfire.Me.Integration.html"},{"type":"function","title":"Bonfire.Me.Integration.declared_extension/0","doc":"","ref":"Bonfire.Me.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Me.Integration.indexing_format_created/2","doc":"","ref":"Bonfire.Me.Integration.html#indexing_format_created/2"},{"type":"function","title":"Bonfire.Me.Integration.indexing_format_creator/2","doc":"","ref":"Bonfire.Me.Integration.html#indexing_format_creator/2"},{"type":"function","title":"Bonfire.Me.Integration.is_local?/2","doc":"","ref":"Bonfire.Me.Integration.html#is_local?/2"},{"type":"function","title":"Bonfire.Me.Integration.mailer/0","doc":"","ref":"Bonfire.Me.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Me.Integration.maybe_index/1","doc":"","ref":"Bonfire.Me.Integration.html#maybe_index/1"},{"type":"function","title":"Bonfire.Me.Integration.repo/0","doc":"","ref":"Bonfire.Me.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Me.Mails","doc":"Handles email sending functionality for accounts and users","ref":"Bonfire.Me.Mails.html"},{"type":"function","title":"Bonfire.Me.Mails.confirm_email/2","doc":"Sends a confirmation email based on the specified action.","ref":"Bonfire.Me.Mails.html#confirm_email/2"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.confirm_email/2","doc":"- `account`: The `%Account{}` struct for the user.\n - `opts`: Options including `:confirm_action`, which determines the type of email to send.","ref":"Bonfire.Me.Mails.html#confirm_email/2-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.confirm_email/2","doc":"iex> Bonfire.Me.Mails.confirm_email(%Account{})\n # sends signup confirmation\n\n iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)\n\n iex> Bonfire.Me.Mails.confirm_email(%Account{}, confirm_action: :forgot_password)","ref":"Bonfire.Me.Mails.html#confirm_email/2-examples"},{"type":"function","title":"Bonfire.Me.Mails.forgot_password/1","doc":"Sends a password reset email.","ref":"Bonfire.Me.Mails.html#forgot_password/1"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.forgot_password/1","doc":"- `account`: The `%Account{}` struct for the user.","ref":"Bonfire.Me.Mails.html#forgot_password/1-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.forgot_password/1","doc":"iex> Bonfire.Me.Mails.forgot_password(%Account{email: %{confirm_token: \"token\"}})\n :ok","ref":"Bonfire.Me.Mails.html#forgot_password/1-examples"},{"type":"function","title":"Bonfire.Me.Mails.mailer/0","doc":"","ref":"Bonfire.Me.Mails.html#mailer/0"},{"type":"function","title":"Bonfire.Me.Mails.render/3","doc":"","ref":"Bonfire.Me.Mails.html#render/3"},{"type":"function","title":"Bonfire.Me.Mails.signup_confirm_email/1","doc":"Sends a confirmation email for user signup.","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1"},{"type":"function","title":"Parameters - Bonfire.Me.Mails.signup_confirm_email/1","doc":"- `account`: The `%Account{}` struct for the user.","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1-parameters"},{"type":"function","title":"Examples - Bonfire.Me.Mails.signup_confirm_email/1","doc":"iex> Bonfire.Me.Mails.signup_confirm_email(%Account{email: %{confirm_token: \"token\"}})","ref":"Bonfire.Me.Mails.html#signup_confirm_email/1-examples"},{"type":"module","title":"Bonfire.Me.Mails.EmailView","doc":"","ref":"Bonfire.Me.Mails.EmailView.html"},{"type":"function","title":"Bonfire.Me.Mails.EmailView.render_template/2","doc":"","ref":"Bonfire.Me.Mails.EmailView.html#render_template/2"},{"type":"module","title":"Bonfire.Me.Profiles","doc":"Shared helpers for profiles (such as the profile of a User or Category)\n\nContext for `Bonfire.Data.Social.Profile` mixin, which has these fields:\n- name\n- summary\n- website\n- location (plaintext, see )\n- icon: eg. avatar (references a `Bonfire.Files.Media`)\n- image: eg. banner","ref":"Bonfire.Me.Profiles.html"},{"type":"function","title":"Bonfire.Me.Profiles.changeset/2","doc":"","ref":"Bonfire.Me.Profiles.html#changeset/2"},{"type":"function","title":"Bonfire.Me.Profiles.changeset_simple/2","doc":"","ref":"Bonfire.Me.Profiles.html#changeset_simple/2"},{"type":"function","title":"Bonfire.Me.Profiles.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Profiles.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Profiles.schema_module/0","doc":"","ref":"Bonfire.Me.Profiles.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Profiles.set_profile_image/3","doc":"","ref":"Bonfire.Me.Profiles.html#set_profile_image/3"},{"type":"function","title":"Bonfire.Me.Profiles.spam?/2","doc":"","ref":"Bonfire.Me.Profiles.html#spam?/2"},{"type":"function","title":"Bonfire.Me.Profiles.spam_check!/2","doc":"","ref":"Bonfire.Me.Profiles.html#spam_check!/2"},{"type":"module","title":"Bonfire.Me.Profiles.LiveHandler","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.default_assigns/1","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#default_assigns/1"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.get/1","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#get/1"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.init/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#init/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.maybe_assign_aliases/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#maybe_assign_aliases/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.set_image_setting/5","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#set_image_setting/5"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.set_profile_image/5","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#set_profile_image/5"},{"type":"macro","title":"Bonfire.Me.Profiles.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Me.Profiles.LiveHandler.user_assigns/3","doc":"","ref":"Bonfire.Me.Profiles.LiveHandler.html#user_assigns/3"},{"type":"module","title":"Bonfire.Me.RuntimeConfig","doc":"","ref":"Bonfire.Me.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Me.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Me.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Me.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Me.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Me.SharedUsers","doc":"Enables multiple people to share one identity, by associating one User with many Accounts. Context for `Bonfire.Data.SharedUser`","ref":"Bonfire.Me.SharedUsers.html"},{"type":"function","title":"Bonfire.Me.SharedUsers.add_account/3","doc":"","ref":"Bonfire.Me.SharedUsers.html#add_account/3"},{"type":"function","title":"Bonfire.Me.SharedUsers.add_accounts/3","doc":"","ref":"Bonfire.Me.SharedUsers.html#add_accounts/3"},{"type":"function","title":"Bonfire.Me.SharedUsers.by_account/1","doc":"","ref":"Bonfire.Me.SharedUsers.html#by_account/1"},{"type":"function","title":"Bonfire.Me.SharedUsers.by_username_and_account_query/2","doc":"","ref":"Bonfire.Me.SharedUsers.html#by_username_and_account_query/2"},{"type":"function","title":"Bonfire.Me.SharedUsers.federation_module/0","doc":"","ref":"Bonfire.Me.SharedUsers.html#federation_module/0"},{"type":"function","title":"Bonfire.Me.SharedUsers.init_shared_user/2","doc":"","ref":"Bonfire.Me.SharedUsers.html#init_shared_user/2"},{"type":"module","title":"Bonfire.Me.Users","doc":"A User represents a visible identity within the system belonging to an Account (see `Bonfire.Me.Accounts`) and having a Profile (see `Bonfire.Me.Profiles`) and a Character identified by a username (see `Bonfire.Me.Characters`).","ref":"Bonfire.Me.Users.html"},{"type":"function","title":"Bonfire.Me.Users.ap_receive_activity/3","doc":"","ref":"Bonfire.Me.Users.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Me.Users.automod_id/0","doc":"","ref":"Bonfire.Me.Users.html#automod_id/0"},{"type":"function","title":"Bonfire.Me.Users.by_account/1","doc":"Gets users by account.","ref":"Bonfire.Me.Users.html#by_account/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_account/1","doc":"> Bonfire.Me.Users.by_account(%Bonfire.Data.Identity.Account{id: \"account_id\"})\n [%Bonfire.Data.Identity.User{}]\n\n > Bonfire.Me.Users.by_account!(\"account_id\")\n [%Bonfire.Data.Identity.User{}]","ref":"Bonfire.Me.Users.html#by_account/1-examples"},{"type":"function","title":"Bonfire.Me.Users.by_account!/1","doc":"","ref":"Bonfire.Me.Users.html#by_account!/1"},{"type":"function","title":"Bonfire.Me.Users.by_ap_id/1","doc":"","ref":"Bonfire.Me.Users.html#by_ap_id/1"},{"type":"function","title":"Bonfire.Me.Users.by_ap_id!/1","doc":"","ref":"Bonfire.Me.Users.html#by_ap_id!/1"},{"type":"function","title":"Bonfire.Me.Users.by_canonical_uri/1","doc":"Gets a user by canonical URI.","ref":"Bonfire.Me.Users.html#by_canonical_uri/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_canonical_uri/1","doc":"> Bonfire.Me.Users.by_canonical_uri(\"http://example.com\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_canonical_uri/1-examples"},{"type":"function","title":"Bonfire.Me.Users.by_id/2","doc":"Gets a user by ID.","ref":"Bonfire.Me.Users.html#by_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_id/2","doc":"> Bonfire.Me.Users.by_id(\"user_id\")\n %Bonfire.Data.Identity.User{}\n\n > Bonfire.Me.Users.by_id([\"user_id\"])\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_user_and_account/2","doc":"Gets a user by username or user ID and account ID, useful for switch-user functionality. \n\nWill throw an error if any of the account's users is blocked instance-wide by admins.","ref":"Bonfire.Me.Users.html#by_user_and_account/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_user_and_account/2","doc":"> Bonfire.Me.Users.by_user_and_account(\"username\", \"account_id\")\n {:ok, %Bonfire.Data.Identity.User{}}","ref":"Bonfire.Me.Users.html#by_user_and_account/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_username/2","doc":"Gets a user by username.","ref":"Bonfire.Me.Users.html#by_username/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_username/2","doc":"> Bonfire.Me.Users.by_username(\"username\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_username/2-examples"},{"type":"function","title":"Bonfire.Me.Users.by_username!/1","doc":"Gets a user by username, raising an error if not found.","ref":"Bonfire.Me.Users.html#by_username!/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.by_username!/1","doc":"> Bonfire.Me.Users.by_username!(\"username\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#by_username!/1-examples"},{"type":"function","title":"Bonfire.Me.Users.changeset/4","doc":"","ref":"Bonfire.Me.Users.html#changeset/4"},{"type":"function","title":"Bonfire.Me.Users.check_active/1","doc":"Checks if users are active.","ref":"Bonfire.Me.Users.html#check_active/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.check_active/1","doc":"iex> Bonfire.Me.Users.check_active([user1])\n [{:ok, %Bonfire.Data.Identity.User{}}]\n\n iex> Bonfire.Me.Users.check_active(user)\n {:ok, %Bonfire.Data.Identity.User{}}","ref":"Bonfire.Me.Users.html#check_active/1-examples"},{"type":"function","title":"Bonfire.Me.Users.check_active!/1","doc":"","ref":"Bonfire.Me.Users.html#check_active!/1"},{"type":"function","title":"Bonfire.Me.Users.count/1","doc":"","ref":"Bonfire.Me.Users.html#count/1"},{"type":"function","title":"Bonfire.Me.Users.create/2","doc":"","ref":"Bonfire.Me.Users.html#create/2"},{"type":"function","title":"Bonfire.Me.Users.create_remote/1","doc":"Creates a remote user","ref":"Bonfire.Me.Users.html#create_remote/1"},{"type":"function","title":"Bonfire.Me.Users.enqueue_delete/1","doc":"","ref":"Bonfire.Me.Users.html#enqueue_delete/1"},{"type":"function","title":"Bonfire.Me.Users.federation_module/0","doc":"","ref":"Bonfire.Me.Users.html#federation_module/0"},{"type":"function","title":"Bonfire.Me.Users.fetch_current/1","doc":"Fetches the current user by ID.","ref":"Bonfire.Me.Users.html#fetch_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.fetch_current/1","doc":"> Bonfire.Me.Users.fetch_current(\"user_id\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#fetch_current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.flatten/1","doc":"","ref":"Bonfire.Me.Users.html#flatten/1"},{"type":"function","title":"Bonfire.Me.Users.format_actor/1","doc":"","ref":"Bonfire.Me.Users.html#format_actor/1"},{"type":"function","title":"Bonfire.Me.Users.get_current/1","doc":"Gets the current user by ID.","ref":"Bonfire.Me.Users.html#get_current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.get_current/1","doc":"iex> Bonfire.Me.Users.get_current(nil)\n nil\n\n > Bonfire.Me.Users.get_current(\"user_id\")\n %Bonfire.Data.Identity.User{}","ref":"Bonfire.Me.Users.html#get_current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.get_current/2","doc":"","ref":"Bonfire.Me.Users.html#get_current/2"},{"type":"function","title":"Bonfire.Me.Users.get_only_in_account/1","doc":"","ref":"Bonfire.Me.Users.html#get_only_in_account/1"},{"type":"function","title":"Bonfire.Me.Users.get_or_create_automod/0","doc":"","ref":"Bonfire.Me.Users.html#get_or_create_automod/0"},{"type":"function","title":"Bonfire.Me.Users.get_or_create_service_character/2","doc":"","ref":"Bonfire.Me.Users.html#get_or_create_service_character/2"},{"type":"function","title":"Bonfire.Me.Users.ids_by_account/1","doc":"","ref":"Bonfire.Me.Users.html#ids_by_account/1"},{"type":"function","title":"Bonfire.Me.Users.indexing_object_format/1","doc":"","ref":"Bonfire.Me.Users.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Me.Users.is_active?/1","doc":"Checks if a user is active.","ref":"Bonfire.Me.Users.html#is_active?/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.is_active?/1","doc":"> Bonfire.Me.Users.is_active?(user)","ref":"Bonfire.Me.Users.html#is_active?/1-examples"},{"type":"function","title":"Bonfire.Me.Users.is_first_user?/0","doc":"","ref":"Bonfire.Me.Users.html#is_first_user?/0"},{"type":"function","title":"Bonfire.Me.Users.list/1","doc":"","ref":"Bonfire.Me.Users.html#list/1"},{"type":"function","title":"Bonfire.Me.Users.list_admins/0","doc":"","ref":"Bonfire.Me.Users.html#list_admins/0"},{"type":"function","title":"Bonfire.Me.Users.list_boundarised_query/1","doc":"","ref":"Bonfire.Me.Users.html#list_boundarised_query/1"},{"type":"function","title":"Bonfire.Me.Users.list_paginated/1","doc":"","ref":"Bonfire.Me.Users.html#list_paginated/1"},{"type":"function","title":"Bonfire.Me.Users.make_admin/1","doc":"Grants a user superpowers.","ref":"Bonfire.Me.Users.html#make_admin/1"},{"type":"function","title":"Bonfire.Me.Users.make_user/3","doc":"","ref":"Bonfire.Me.Users.html#make_user/3"},{"type":"function","title":"Bonfire.Me.Users.maybe_count/1","doc":"","ref":"Bonfire.Me.Users.html#maybe_count/1"},{"type":"function","title":"Bonfire.Me.Users.maybe_index_user/1","doc":"","ref":"Bonfire.Me.Users.html#maybe_index_user/1"},{"type":"function","title":"Bonfire.Me.Users.query_module/0","doc":"","ref":"Bonfire.Me.Users.html#query_module/0"},{"type":"function","title":"Bonfire.Me.Users.remote_fetcher_id/0","doc":"","ref":"Bonfire.Me.Users.html#remote_fetcher_id/0"},{"type":"function","title":"Bonfire.Me.Users.revoke_admin/1","doc":"Revokes a user's superpowers.","ref":"Bonfire.Me.Users.html#revoke_admin/1"},{"type":"function","title":"Bonfire.Me.Users.schema_module/0","doc":"","ref":"Bonfire.Me.Users.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Users.search/2","doc":"Searches for users.","ref":"Bonfire.Me.Users.html#search/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.search/2","doc":"> Bonfire.Me.Users.search(\"username\")\n [%Bonfire.Data.Identity.User{}]","ref":"Bonfire.Me.Users.html#search/2-examples"},{"type":"function","title":"Bonfire.Me.Users.search_query/2","doc":"Query for searching for users.","ref":"Bonfire.Me.Users.html#search_query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.search_query/2","doc":"> Bonfire.Me.Users.search_query(\"search_term\")\n %Ecto.Query{}","ref":"Bonfire.Me.Users.html#search_query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.update/3","doc":"","ref":"Bonfire.Me.Users.html#update/3"},{"type":"function","title":"Bonfire.Me.Users.update_local_actor/2","doc":"","ref":"Bonfire.Me.Users.html#update_local_actor/2"},{"type":"function","title":"Bonfire.Me.Users.update_remote_actor/2","doc":"Updates a remote user","ref":"Bonfire.Me.Users.html#update_remote_actor/2"},{"type":"type","title":"Bonfire.Me.Users.changeset_extra/0","doc":"","ref":"Bonfire.Me.Users.html#t:changeset_extra/0"},{"type":"type","title":"Bonfire.Me.Users.changeset_name/0","doc":"","ref":"Bonfire.Me.Users.html#t:changeset_name/0"},{"type":"module","title":"Bonfire.Me.Users.LiveHandler","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_account_session/1","doc":"This function disconnects the user and account, erases the session and CSRF token, and starts a new session","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_account_session/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_sockets/1","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_sockets/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.disconnect_user_session/1","doc":"This function disconnects the user but leaves the account session alone","ref":"Bonfire.Me.Users.LiveHandler.html#disconnect_user_session/1"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Me.Users.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Me.Users.LiveHandler.to_tuple/1","doc":"","ref":"Bonfire.Me.Users.LiveHandler.html#to_tuple/1"},{"type":"module","title":"Bonfire.Me.Users.Queries","doc":"Queries for `Bonfire.Me.Users`","ref":"Bonfire.Me.Users.Queries.html"},{"type":"function","title":"Bonfire.Me.Users.Queries.admins/1","doc":"Returns the query to list admin users.","ref":"Bonfire.Me.Users.Queries.html#admins/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.base_by_id/1","doc":"","ref":"Bonfire.Me.Users.Queries.html#base_by_id/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.base_query/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#base_query/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_account/1","doc":"Finds users by account ID.","ref":"Bonfire.Me.Users.Queries.html#by_account/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_account/1","doc":"iex> Bonfire.Me.Users.Queries.by_account(\"account_id\")","ref":"Bonfire.Me.Users.Queries.html#by_account/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_canonical_uri/2","doc":"Finds a user by canonical URI.","ref":"Bonfire.Me.Users.Queries.html#by_canonical_uri/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_canonical_uri/2","doc":"iex> Bonfire.Me.Users.Queries.by_canonical_uri(\"canonical_uri\")","ref":"Bonfire.Me.Users.Queries.html#by_canonical_uri/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_id/2","doc":"Gets a user by ID.","ref":"Bonfire.Me.Users.Queries.html#by_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_id/2","doc":"iex> Bonfire.Me.Users.Queries.by_id(\"user_id\")","ref":"Bonfire.Me.Users.Queries.html#by_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_user_and_account/2","doc":"Finds a user by username or user ID and account ID.","ref":"Bonfire.Me.Users.Queries.html#by_user_and_account/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_user_and_account/2","doc":"iex> Bonfire.Me.Users.Queries.by_user_and_account(\"username_or_user_id\", \"account_id\")","ref":"Bonfire.Me.Users.Queries.html#by_user_and_account/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_username_or_id/2","doc":"Finds a user by username or ID.","ref":"Bonfire.Me.Users.Queries.html#by_username_or_id/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_username_or_id/2","doc":"iex> Bonfire.Me.Users.Queries.by_username_or_id(\"username_or_id\")","ref":"Bonfire.Me.Users.Queries.html#by_username_or_id/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.by_username_query/2","doc":"Finds a user by username.","ref":"Bonfire.Me.Users.Queries.html#by_username_query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.by_username_query/2","doc":"iex> Bonfire.Me.Users.Queries.by_username_query(\"username\")","ref":"Bonfire.Me.Users.Queries.html#by_username_query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.context_module/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#context_module/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.count/1","doc":"Counts the number of users.","ref":"Bonfire.Me.Users.Queries.html#count/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.count/1","doc":"iex> Bonfire.Me.Users.Queries.count(:all)\n\n iex> Bonfire.Me.Users.Queries.count(:local)\n\n iex> Bonfire.Me.Users.Queries.count(:remote)","ref":"Bonfire.Me.Users.Queries.html#count/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.current/1","doc":"Returns for the current user based on the user ID.","ref":"Bonfire.Me.Users.Queries.html#current/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.current/1","doc":"iex> Bonfire.Me.Users.Queries.current(\"user_id\")","ref":"Bonfire.Me.Users.Queries.html#current/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.current/2","doc":"Returns for the current user based on the user ID and account ID.","ref":"Bonfire.Me.Users.Queries.html#current/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.current/2","doc":"iex> Bonfire.Me.Users.Queries.current(\"user_id\", \"account_id\")","ref":"Bonfire.Me.Users.Queries.html#current/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.join_peered/1","doc":"","ref":"Bonfire.Me.Users.Queries.html#join_peered/1"},{"type":"function","title":"Bonfire.Me.Users.Queries.list/1","doc":"Lists all users, or local or remote users, or users by instance ID.","ref":"Bonfire.Me.Users.Queries.html#list/1"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.list/1","doc":"iex> Bonfire.Me.Users.Queries.list(:all)\n\n iex> Bonfire.Me.Users.Queries.list(:local)\n\n iex> Bonfire.Me.Users.Queries.list(:remote)\n\n iex> Bonfire.Me.Users.Queries.list({:instance, \"instance_id\"})","ref":"Bonfire.Me.Users.Queries.html#list/1-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.query/2","doc":"Queries for a user based on the given filter.","ref":"Bonfire.Me.Users.Queries.html#query/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.query/2","doc":"iex> Bonfire.Me.Users.Queries.query(id: \"some_id\")\n\n iex> Bonfire.Me.Users.Queries.query(username: \"some_username\")\n\n iex> Bonfire.Me.Users.Queries.query(:invalid_filter)\n {:error, \"Could not query\"}","ref":"Bonfire.Me.Users.Queries.html#query/2-examples"},{"type":"function","title":"Bonfire.Me.Users.Queries.schema_module/0","doc":"","ref":"Bonfire.Me.Users.Queries.html#schema_module/0"},{"type":"function","title":"Bonfire.Me.Users.Queries.search/2","doc":"Searches for users based on a text string.","ref":"Bonfire.Me.Users.Queries.html#search/2"},{"type":"function","title":"Examples - Bonfire.Me.Users.Queries.search/2","doc":"iex> Bonfire.Me.Users.Queries.search(\"userna\")","ref":"Bonfire.Me.Users.Queries.html#search/2-examples"},{"type":"module","title":"Bonfire.Messages","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- DM\n- Group messaging","ref":"Bonfire.Messages.html"},{"type":"module","title":"Handy commands - Bonfire.Messages","doc":"","ref":"Bonfire.Messages.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Messages","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Messages.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Messages.ap_publish_activity/3","doc":"Publishes an activity to the ActivityPub.","ref":"Bonfire.Messages.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Messages.ap_publish_activity/3","doc":"iex> Bonfire.Messages.ap_publish_activity(subject, verb, message)","ref":"Bonfire.Messages.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Messages.ap_receive_activity/3","doc":"Receives an activity from ActivityPub.","ref":"Bonfire.Messages.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Messages.ap_receive_activity/3","doc":"iex> Bonfire.Messages.ap_receive_activity(creator, activity, object)","ref":"Bonfire.Messages.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Messages.changeset/3","doc":"","ref":"Bonfire.Messages.html#changeset/3"},{"type":"function","title":"Bonfire.Messages.draft/2","doc":"Save a new message as a draft (without sending it).","ref":"Bonfire.Messages.html#draft/2"},{"type":"function","title":"Examples - Bonfire.Messages.draft/2","doc":"iex> Bonfire.Messages.draft(creator, attrs)\n {:ok, %Message{}}","ref":"Bonfire.Messages.html#draft/2-examples"},{"type":"function","title":"Bonfire.Messages.federation_module/0","doc":"","ref":"Bonfire.Messages.html#federation_module/0"},{"type":"function","title":"Bonfire.Messages.filter/3","doc":"","ref":"Bonfire.Messages.html#filter/3"},{"type":"function","title":"Bonfire.Messages.list/3","doc":"Lists messages created by the user, excluding replies.","ref":"Bonfire.Messages.html#list/3"},{"type":"function","title":"Examples - Bonfire.Messages.list/3","doc":"iex> Bonfire.Messages.list(current_user)\n [%Message{}]","ref":"Bonfire.Messages.html#list/3-examples"},{"type":"function","title":"Bonfire.Messages.list/4","doc":"","ref":"Bonfire.Messages.html#list/4"},{"type":"function","title":"Bonfire.Messages.maybe_spam_check/3","doc":"","ref":"Bonfire.Messages.html#maybe_spam_check/3"},{"type":"function","title":"Bonfire.Messages.read/2","doc":"Attempt to read a message by its ID.","ref":"Bonfire.Messages.html#read/2"},{"type":"function","title":"Examples - Bonfire.Messages.read/2","doc":"iex> Bonfire.Messages.read(message_id, current_user: me)\n %Message{}","ref":"Bonfire.Messages.html#read/2-examples"},{"type":"function","title":"Bonfire.Messages.schema_module/0","doc":"","ref":"Bonfire.Messages.html#schema_module/0"},{"type":"function","title":"Bonfire.Messages.send/3","doc":"Sends a message to the specified recipients.","ref":"Bonfire.Messages.html#send/3"},{"type":"function","title":"Examples - Bonfire.Messages.send/3","doc":"iex> Bonfire.Messages.send(me, %{post_content: %{html_body: \"test message\"}}, to_user_id)","ref":"Bonfire.Messages.html#send/3-examples"},{"type":"module","title":"Bonfire.Messages.Fake","doc":"","ref":"Bonfire.Messages.Fake.html"},{"type":"function","title":"Bonfire.Messages.Fake.fake_comment!/4","doc":"","ref":"Bonfire.Messages.Fake.html#fake_comment!/4"},{"type":"function","title":"Bonfire.Messages.Fake.fake_post!/4","doc":"","ref":"Bonfire.Messages.Fake.html#fake_post!/4"},{"type":"function","title":"Bonfire.Messages.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Messages.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Messages.Integration","doc":"","ref":"Bonfire.Messages.Integration.html"},{"type":"function","title":"Bonfire.Messages.Integration.declared_extension/0","doc":"","ref":"Bonfire.Messages.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Messages.Integration.mailer/0","doc":"","ref":"Bonfire.Messages.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Messages.Integration.repo/0","doc":"","ref":"Bonfire.Messages.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Messages.LiveHandler","doc":"","ref":"Bonfire.Messages.LiveHandler.html"},{"type":"function","title":"Bonfire.Messages.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.list_threads/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#list_threads/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.live_more/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#live_more/3"},{"type":"function","title":"Bonfire.Messages.LiveHandler.send_message/2","doc":"","ref":"Bonfire.Messages.LiveHandler.html#send_message/2"},{"type":"macro","title":"Bonfire.Messages.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Messages.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_meta/4","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_meta/4"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_meta/5","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_meta/5"},{"type":"function","title":"Bonfire.Messages.LiveHandler.thread_participants/4","doc":"","ref":"Bonfire.Messages.LiveHandler.html#thread_participants/4"},{"type":"function","title":"Bonfire.Messages.LiveHandler.threads_widget/3","doc":"","ref":"Bonfire.Messages.LiveHandler.html#threads_widget/3"},{"type":"module","title":"Bonfire.OpenID","doc":"An extension to enable:\n- authenticating on Bonfire using an external identity using OpenID Connect\n- using your Bonfire identity to authenticate in other apps with OpenID Connect 1.0 or OAuth 2.0","ref":"Bonfire.OpenID.html"},{"type":"module","title":"Copyright and License - Bonfire.OpenID","doc":"Powered by these libraries: \n- https://hex.pm/packages/boruta (MIT license)\n- https://hex.pm/packages/openid_connect (MIT license)\n\nExtension copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenID.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.OpenID.Client","doc":"","ref":"Bonfire.OpenID.Client.html"},{"type":"function","title":"Bonfire.OpenID.Client.oauth2_providers/0","doc":"","ref":"Bonfire.OpenID.Client.html#oauth2_providers/0"},{"type":"function","title":"Bonfire.OpenID.Client.open_id_connect_providers/0","doc":"","ref":"Bonfire.OpenID.Client.html#open_id_connect_providers/0"},{"type":"function","title":"Bonfire.OpenID.Client.providers_authorization_urls/1","doc":"","ref":"Bonfire.OpenID.Client.html#providers_authorization_urls/1"},{"type":"module","title":"Bonfire.OpenID.Fake","doc":"","ref":"Bonfire.OpenID.Fake.html"},{"type":"function","title":"Bonfire.OpenID.Fake.fake_account!/2","doc":"","ref":"Bonfire.OpenID.Fake.html#fake_account!/2"},{"type":"function","title":"Bonfire.OpenID.Fake.fake_user!/2","doc":"","ref":"Bonfire.OpenID.Fake.html#fake_user!/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.AuthRequired","doc":"","ref":"Bonfire.OpenID.Plugs.AuthRequired.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.AuthRequired.require_auth/2","doc":"","ref":"Bonfire.OpenID.Plugs.AuthRequired.html#require_auth/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.Authorize","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.authorize/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#authorize/2"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.load_authorization/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#load_authorization/2"},{"type":"function","title":"Bonfire.OpenID.Plugs.Authorize.maybe_load_authorization/2","doc":"","ref":"Bonfire.OpenID.Plugs.Authorize.html#maybe_load_authorization/2"},{"type":"module","title":"Bonfire.OpenID.Plugs.ClientID","doc":"","ref":"Bonfire.OpenID.Plugs.ClientID.html"},{"type":"function","title":"Bonfire.OpenID.Plugs.ClientID.validate_client_id/2","doc":"","ref":"Bonfire.OpenID.Plugs.ClientID.html#validate_client_id/2"},{"type":"module","title":"Bonfire.OpenID.Provider.ClientApps","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get/2","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get_or_new/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get_or_new/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.get_or_new/2","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#get_or_new/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.init_test_client_app/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#init_test_client_app/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_active_tokens/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_active_tokens/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_clients/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_clients/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.list_scopes/0","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#list_scopes/0"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.new/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#new/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.new/2","doc":"Define an OAuth client app, providing a name and redirect URI(s)","ref":"Bonfire.OpenID.Provider.ClientApps.html#new/2"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.prepare_redirect_uri/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#prepare_redirect_uri/1"},{"type":"function","title":"Bonfire.OpenID.Provider.ClientApps.prepare_redirect_uris/1","doc":"","ref":"Bonfire.OpenID.Provider.ClientApps.html#prepare_redirect_uris/1"},{"type":"module","title":"Bonfire.OpenID.Provider.OAuth","doc":"","ref":"Bonfire.OpenID.Provider.OAuth.html"},{"type":"function","title":"Bonfire.OpenID.Provider.OAuth.redirect_uri_validate/1","doc":"","ref":"Bonfire.OpenID.Provider.OAuth.html#redirect_uri_validate/1"},{"type":"module","title":"Bonfire.OpenID.RuntimeConfig","doc":"","ref":"Bonfire.OpenID.RuntimeConfig.html"},{"type":"function","title":"Bonfire.OpenID.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.OpenID.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.OpenID.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.OpenID.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.OpenID.Web.Routes","doc":"","ref":"Bonfire.OpenID.Web.Routes.html"},{"type":"function","title":"Bonfire.OpenID.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.OpenID.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.OpenScience","doc":"See https://bonfirenetworks.org/app/open-science/","ref":"Bonfire.OpenScience.html"},{"type":"module","title":"Copyright and License - Bonfire.OpenScience","doc":"Copyright (c) 2024 Bonfire and Open Science Network Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenScience.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.OpenScience.repo/0","doc":"","ref":"Bonfire.OpenScience.html#repo/0"},{"type":"function","title":"Bonfire.OpenScience.user_aliases/1","doc":"","ref":"Bonfire.OpenScience.html#user_aliases/1"},{"type":"module","title":"Bonfire.OpenScience.APIs","doc":"","ref":"Bonfire.OpenScience.APIs.html"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch/2","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch/2"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_crossref/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_crossref/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_for_all_known_scientists/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_for_all_known_scientists/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_latest/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_latest/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_record/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_record/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.fetch_orcid_works/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#fetch_orcid_works/3"},{"type":"function","title":"Bonfire.OpenScience.APIs.find_orcid_id/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#find_orcid_id/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.is_doi?/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#is_doi?/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.is_pub_id_or_uri_match?/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#is_pub_id_or_uri_match?/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.maybe_fetch/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#maybe_fetch/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.open_alex_fetch_topics/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#open_alex_fetch_topics/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_and_uri_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_and_uri_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_matcher/1","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_matcher/1"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_id_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_id_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.pub_uri_matchers/0","doc":"","ref":"Bonfire.OpenScience.APIs.html#pub_uri_matchers/0"},{"type":"function","title":"Bonfire.OpenScience.APIs.trigger/3","doc":"","ref":"Bonfire.OpenScience.APIs.html#trigger/3"},{"type":"module","title":"Bonfire.OpenScience.Fake","doc":"","ref":"Bonfire.OpenScience.Fake.html"},{"type":"module","title":"Bonfire.OpenScience.RuntimeConfig","doc":"","ref":"Bonfire.OpenScience.RuntimeConfig.html"},{"type":"function","title":"Bonfire.OpenScience.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.OpenScience.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.OpenScience.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.OpenScience.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.OpenScience.Web.Routes","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declare_routes/0"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declared_extension/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declared_extension/0"},{"type":"function","title":"Bonfire.OpenScience.Web.Routes.declared_nav/0","doc":"","ref":"Bonfire.OpenScience.Web.Routes.html#declared_nav/0"},{"type":"module","title":"Bonfire.Pages","doc":"Basic CMS","ref":"Bonfire.Pages.html"},{"type":"module","title":"Copyright and License - Bonfire.Pages","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Pages.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Pages.create/1","doc":"","ref":"Bonfire.Pages.html#create/1"},{"type":"function","title":"Bonfire.Pages.get/2","doc":"","ref":"Bonfire.Pages.html#get/2"},{"type":"function","title":"Bonfire.Pages.list_paginated/2","doc":"","ref":"Bonfire.Pages.html#list_paginated/2"},{"type":"function","title":"Bonfire.Pages.one/2","doc":"","ref":"Bonfire.Pages.html#one/2"},{"type":"function","title":"Bonfire.Pages.page_path/2","doc":"","ref":"Bonfire.Pages.html#page_path/2"},{"type":"function","title":"Bonfire.Pages.query/2","doc":"","ref":"Bonfire.Pages.html#query/2"},{"type":"function","title":"Bonfire.Pages.run_epic/4","doc":"","ref":"Bonfire.Pages.html#run_epic/4"},{"type":"function","title":"Bonfire.Pages.slug/1","doc":"","ref":"Bonfire.Pages.html#slug/1"},{"type":"function","title":"Bonfire.Pages.summary/1","doc":"","ref":"Bonfire.Pages.html#summary/1"},{"type":"module","title":"Bonfire.Pages.Acts.Page.Create","doc":"Creates a changeset for publishing a page\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n * `:page_attrs` (configurable) - attrs to create the page from, required.\n * `:page_id` (configurable) - id to use for the created page (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:page_id`\n * `:as` - key to assign changeset to, default: `:page`.\n * `:attrs` - epic options key to find the attributes at, default: `:page_attrs`.","ref":"Bonfire.Pages.Acts.Page.Create.html"},{"type":"module","title":"Bonfire.Pages.Acts.Section.Upsert","doc":"Creates a changeset for publishing a section\n\nEpic Options:\n * `:current_user` - user that will create the section, required.\n * `:section_attrs` (configurable) - attrs to create the section from, required.\n * `:section_id` (configurable) - id to use for the created section (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:section_id`\n * `:as` - key to assign changeset to, default: `:section`.\n * `:attrs` - epic options key to find the attributes at, default: `:section_attrs`.","ref":"Bonfire.Pages.Acts.Section.Upsert.html"},{"type":"module","title":"Bonfire.Pages.LiveHandler","doc":"","ref":"Bonfire.Pages.LiveHandler.html"},{"type":"function","title":"Bonfire.Pages.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Pages.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Pages.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Pages.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Pages.Page","doc":"","ref":"Bonfire.Pages.Page.html"},{"type":"function","title":"Bonfire.Pages.Page.changeset/2","doc":"","ref":"Bonfire.Pages.Page.html#changeset/2"},{"type":"function","title":"Bonfire.Pages.Page.delete/2","doc":"","ref":"Bonfire.Pages.Page.html#delete/2"},{"type":"function","title":"Bonfire.Pages.Page.get/3","doc":"","ref":"Bonfire.Pages.Page.html#get/3"},{"type":"function","title":"Bonfire.Pages.Page.put/3","doc":"","ref":"Bonfire.Pages.Page.html#put/3"},{"type":"module","title":"Bonfire.Pages.Section","doc":"","ref":"Bonfire.Pages.Section.html"},{"type":"function","title":"Bonfire.Pages.Section.changeset/2","doc":"","ref":"Bonfire.Pages.Section.html#changeset/2"},{"type":"function","title":"Bonfire.Pages.Section.delete/2","doc":"","ref":"Bonfire.Pages.Section.html#delete/2"},{"type":"function","title":"Bonfire.Pages.Section.get/3","doc":"","ref":"Bonfire.Pages.Section.html#get/3"},{"type":"function","title":"Bonfire.Pages.Section.put/3","doc":"","ref":"Bonfire.Pages.Section.html#put/3"},{"type":"module","title":"Bonfire.Pages.Sections","doc":"","ref":"Bonfire.Pages.Sections.html"},{"type":"function","title":"Bonfire.Pages.Sections.get/2","doc":"","ref":"Bonfire.Pages.Sections.html#get/2"},{"type":"function","title":"Bonfire.Pages.Sections.list_paginated/2","doc":"","ref":"Bonfire.Pages.Sections.html#list_paginated/2"},{"type":"function","title":"Bonfire.Pages.Sections.one/2","doc":"","ref":"Bonfire.Pages.Sections.html#one/2"},{"type":"function","title":"Bonfire.Pages.Sections.put_in_page/3","doc":"","ref":"Bonfire.Pages.Sections.html#put_in_page/3"},{"type":"function","title":"Bonfire.Pages.Sections.query/2","doc":"","ref":"Bonfire.Pages.Sections.html#query/2"},{"type":"function","title":"Bonfire.Pages.Sections.remove_from_page/2","doc":"","ref":"Bonfire.Pages.Sections.html#remove_from_page/2"},{"type":"function","title":"Bonfire.Pages.Sections.upsert/1","doc":"","ref":"Bonfire.Pages.Sections.html#upsert/1"},{"type":"module","title":"Bonfire.Pages.Web.Routes","doc":"","ref":"Bonfire.Pages.Web.Routes.html"},{"type":"function","title":"Bonfire.Pages.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Pages.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Poll","doc":"An extensions for asking questions, collecting options, and conducting ranked voting on [Bonfire](https://bonfire.cafe/)","ref":"Bonfire.Poll.html"},{"type":"module","title":"Copyright and License - Bonfire.Poll","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Poll.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Poll.repo/0","doc":"","ref":"Bonfire.Poll.html#repo/0"},{"type":"module","title":"Bonfire.Poll.Acts.Choices.Upsert","doc":"Creates a changeset for publishing choice(s) for a question\n\nEpic Options:\n * `:current_user` - user that will create the choice, required.\n * `:choice_attrs` (configurable) - attrs to create the choice from, required.\n * `:choice_id` (configurable) - id to use for the created choice (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:choice_id`\n * `:as` - key to assign changeset to, default: `:choice`.\n * `:attrs` - epic options key to find the attributes at, default: `:choice_attrs`.","ref":"Bonfire.Poll.Acts.Choices.Upsert.html"},{"type":"module","title":"Bonfire.Poll.Choice","doc":"","ref":"Bonfire.Poll.Choice.html"},{"type":"function","title":"Bonfire.Poll.Choice.changeset/2","doc":"","ref":"Bonfire.Poll.Choice.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Choice.delete/2","doc":"","ref":"Bonfire.Poll.Choice.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Choice.get/3","doc":"","ref":"Bonfire.Poll.Choice.html#get/3"},{"type":"function","title":"Bonfire.Poll.Choice.put/3","doc":"","ref":"Bonfire.Poll.Choice.html#put/3"},{"type":"module","title":"Bonfire.Poll.Choices","doc":"","ref":"Bonfire.Poll.Choices.html"},{"type":"function","title":"Bonfire.Poll.Choices.put_choice/3","doc":"","ref":"Bonfire.Poll.Choices.html#put_choice/3"},{"type":"function","title":"Bonfire.Poll.Choices.simple_create_and_put/4","doc":"","ref":"Bonfire.Poll.Choices.html#simple_create_and_put/4"},{"type":"module","title":"Bonfire.Poll.Fake","doc":"","ref":"Bonfire.Poll.Fake.html"},{"type":"module","title":"Bonfire.Poll.LiveHandler","doc":"","ref":"Bonfire.Poll.LiveHandler.html"},{"type":"function","title":"Bonfire.Poll.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Poll.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Poll.LiveHandler.negative_score_info/0","doc":"","ref":"Bonfire.Poll.LiveHandler.html#negative_score_info/0"},{"type":"macro","title":"Bonfire.Poll.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Poll.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Poll.Question","doc":"","ref":"Bonfire.Poll.Question.html"},{"type":"function","title":"Bonfire.Poll.Question.delete/2","doc":"","ref":"Bonfire.Poll.Question.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Question.get/3","doc":"","ref":"Bonfire.Poll.Question.html#get/3"},{"type":"function","title":"Bonfire.Poll.Question.put/3","doc":"","ref":"Bonfire.Poll.Question.html#put/3"},{"type":"module","title":"Bonfire.Poll.Question.Create","doc":"Creates a changeset for publishing a page\n\nEpic Options:\n * `:current_user` - user that will create the page, required.\n * `:page_attrs` (configurable) - attrs to create the page from, required.\n * `:page_id` (configurable) - id to use for the created page (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:page_id`\n * `:as` - key to assign changeset to, default: `:page`.\n * `:attrs` - epic options key to find the attributes at, default: `:page_attrs`.","ref":"Bonfire.Poll.Question.Create.html"},{"type":"module","title":"Bonfire.Poll.Questions","doc":"","ref":"Bonfire.Poll.Questions.html"},{"type":"function","title":"Bonfire.Poll.Questions.changeset/2","doc":"","ref":"Bonfire.Poll.Questions.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Questions.create/1","doc":"","ref":"Bonfire.Poll.Questions.html#create/1"},{"type":"function","title":"Bonfire.Poll.Questions.create_simple/1","doc":"","ref":"Bonfire.Poll.Questions.html#create_simple/1"},{"type":"function","title":"Bonfire.Poll.Questions.list_by/2","doc":"List posts created by the user and which are in their outbox, which are not replies","ref":"Bonfire.Poll.Questions.html#list_by/2"},{"type":"function","title":"Bonfire.Poll.Questions.list_paginated/2","doc":"List posts with pagination","ref":"Bonfire.Poll.Questions.html#list_paginated/2"},{"type":"function","title":"Bonfire.Poll.Questions.query/2","doc":"","ref":"Bonfire.Poll.Questions.html#query/2"},{"type":"function","title":"Bonfire.Poll.Questions.query_paginated/2","doc":"Query posts with pagination","ref":"Bonfire.Poll.Questions.html#query_paginated/2"},{"type":"function","title":"Bonfire.Poll.Questions.read/2","doc":"","ref":"Bonfire.Poll.Questions.html#read/2"},{"type":"function","title":"Bonfire.Poll.Questions.run_epic/4","doc":"","ref":"Bonfire.Poll.Questions.html#run_epic/4"},{"type":"module","title":"Bonfire.Poll.RuntimeConfig","doc":"","ref":"Bonfire.Poll.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Poll.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's `runtime.exs`, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs()` line","ref":"Bonfire.Poll.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Poll.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Poll.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Poll.Vote","doc":"","ref":"Bonfire.Poll.Vote.html"},{"type":"function","title":"Bonfire.Poll.Vote.changeset/2","doc":"","ref":"Bonfire.Poll.Vote.html#changeset/2"},{"type":"function","title":"Bonfire.Poll.Vote.delete/2","doc":"","ref":"Bonfire.Poll.Vote.html#delete/2"},{"type":"function","title":"Bonfire.Poll.Vote.get/3","doc":"","ref":"Bonfire.Poll.Vote.html#get/3"},{"type":"function","title":"Bonfire.Poll.Vote.put/3","doc":"","ref":"Bonfire.Poll.Vote.html#put/3"},{"type":"module","title":"Bonfire.Poll.Votes","doc":"","ref":"Bonfire.Poll.Votes.html"},{"type":"function","title":"Bonfire.Poll.Votes.by_voter/2","doc":"","ref":"Bonfire.Poll.Votes.html#by_voter/2"},{"type":"function","title":"Bonfire.Poll.Votes.calculate_total/3","doc":"","ref":"Bonfire.Poll.Votes.html#calculate_total/3"},{"type":"function","title":"Bonfire.Poll.Votes.count/2","doc":"","ref":"Bonfire.Poll.Votes.html#count/2"},{"type":"function","title":"Bonfire.Poll.Votes.get/3","doc":"","ref":"Bonfire.Poll.Votes.html#get/3"},{"type":"function","title":"Bonfire.Poll.Votes.get!/3","doc":"","ref":"Bonfire.Poll.Votes.html#get!/3"},{"type":"function","title":"Bonfire.Poll.Votes.get_average_base_score/2","doc":"","ref":"Bonfire.Poll.Votes.html#get_average_base_score/2"},{"type":"function","title":"Bonfire.Poll.Votes.get_average_emoji/4","doc":"","ref":"Bonfire.Poll.Votes.html#get_average_emoji/4"},{"type":"function","title":"Bonfire.Poll.Votes.get_score/2","doc":"","ref":"Bonfire.Poll.Votes.html#get_score/2"},{"type":"function","title":"Bonfire.Poll.Votes.query/2","doc":"","ref":"Bonfire.Poll.Votes.html#query/2"},{"type":"function","title":"Bonfire.Poll.Votes.register_vote_choice/4","doc":"","ref":"Bonfire.Poll.Votes.html#register_vote_choice/4"},{"type":"function","title":"Bonfire.Poll.Votes.scores/0","doc":"","ref":"Bonfire.Poll.Votes.html#scores/0"},{"type":"function","title":"Bonfire.Poll.Votes.send_vote_activity/4","doc":"","ref":"Bonfire.Poll.Votes.html#send_vote_activity/4"},{"type":"function","title":"Bonfire.Poll.Votes.vote/4","doc":"","ref":"Bonfire.Poll.Votes.html#vote/4"},{"type":"module","title":"Bonfire.Poll.Web.Routes","doc":"","ref":"Bonfire.Poll.Web.Routes.html"},{"type":"function","title":"Bonfire.Poll.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Poll.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Posts","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Creating and reading posts","ref":"Bonfire.Posts.html"},{"type":"module","title":"Handy commands - Bonfire.Posts","doc":"","ref":"Bonfire.Posts.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Posts","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Posts.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Posts.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a post.","ref":"Bonfire.Posts.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Posts.ap_publish_activity/3","doc":"- `subject`: The subject of the activity.\n- `verb`: The verb of the activity.\n- `post`: The post to publish.","ref":"Bonfire.Posts.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.ap_publish_activity/3","doc":"`{:ok, activity}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Posts.ap_publish_activity/3","doc":"iex> Bonfire.Posts.ap_publish_activity(user, :create, post)\n {:ok, %ActivityPub.Activity{}}","ref":"Bonfire.Posts.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Posts.ap_receive_activity/3","doc":"Receives an incoming ActivityPub post.","ref":"Bonfire.Posts.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Posts.ap_receive_activity/3","doc":"- `creator`: The creator of the post.\n- `activity`: The ActivityPub activity.\n- `object`: The ActivityPub object.\n- `circles`: The circles to publish to (default: `[]`).","ref":"Bonfire.Posts.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.ap_receive_activity/3","doc":"`{:ok, post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#ap_receive_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Posts.ap_receive_activity/3","doc":"iex> Bonfire.Posts.ap_receive_activity(creator, activity, object)\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Posts.changeset/4","doc":"Creates a changeset for a post.","ref":"Bonfire.Posts.html#changeset/4"},{"type":"function","title":"Parameters - Bonfire.Posts.changeset/4","doc":"- `action`: The action to perform (`:create`).\n- `attrs`: Attributes for the post.","ref":"Bonfire.Posts.html#changeset/4-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.changeset/4","doc":"A `%Changeset{}` for the post.","ref":"Bonfire.Posts.html#changeset/4-returns"},{"type":"function","title":"Examples - Bonfire.Posts.changeset/4","doc":"iex> Bonfire.Posts.changeset(:create, %{title: \"New Post\"})","ref":"Bonfire.Posts.html#changeset/4-examples"},{"type":"function","title":"Bonfire.Posts.count_total/0","doc":"","ref":"Bonfire.Posts.html#count_total/0"},{"type":"function","title":"Bonfire.Posts.delete/2","doc":"Deletes a post.\n\nNote: You should use `Bonfire.Social.Objects.delete/2` instead.","ref":"Bonfire.Posts.html#delete/2"},{"type":"function","title":"Parameters - Bonfire.Posts.delete/2","doc":"- `object`: The post object to delete.\n- `opts`: Options for deleting the post.","ref":"Bonfire.Posts.html#delete/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.delete/2","doc":"`{:ok, deleted_post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#delete/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.delete/2","doc":"iex> Bonfire.Posts.delete(post)\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#delete/2-examples"},{"type":"function","title":"Bonfire.Posts.draft/2","doc":"TODO: Creates a draft post. Not implemented yet.","ref":"Bonfire.Posts.html#draft/2"},{"type":"function","title":"Parameters - Bonfire.Posts.draft/2","doc":"- `creator`: The creator of the draft post.\n- `attrs`: Attributes for the draft post.","ref":"Bonfire.Posts.html#draft/2-parameters"},{"type":"function","title":"Bonfire.Posts.federation_module/0","doc":"","ref":"Bonfire.Posts.html#federation_module/0"},{"type":"function","title":"Bonfire.Posts.indexing_object_format/2","doc":"Formats a post for search indexing.","ref":"Bonfire.Posts.html#indexing_object_format/2"},{"type":"function","title":"Parameters - Bonfire.Posts.indexing_object_format/2","doc":"- `post`: The post to format.\n- `opts`: Formatting options.","ref":"Bonfire.Posts.html#indexing_object_format/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.indexing_object_format/2","doc":"A map with formatted post data for indexing.","ref":"Bonfire.Posts.html#indexing_object_format/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.indexing_object_format/2","doc":"iex> Bonfire.Posts.indexing_object_format(post)\n %{id: \"post_123\", index_type: \"Bonfire.Data.Social.Post\", post_content: %{}, created: %{}, tags: []}","ref":"Bonfire.Posts.html#indexing_object_format/2-examples"},{"type":"function","title":"Bonfire.Posts.list_by/2","doc":"Lists posts created by a user that are in their outbox and are not replies.","ref":"Bonfire.Posts.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Posts.list_by/2","doc":"- `by_user`: The user whose posts to list.\n- `opts`: Options for listing posts.","ref":"Bonfire.Posts.html#list_by/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.list_by/2","doc":"A list of posts.","ref":"Bonfire.Posts.html#list_by/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.list_by/2","doc":"iex> Bonfire.Posts.list_by(user)\n [%Post{}, %Post{}]","ref":"Bonfire.Posts.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Posts.list_paginated/2","doc":"Lists posts with pagination.","ref":"Bonfire.Posts.html#list_paginated/2"},{"type":"function","title":"Parameters - Bonfire.Posts.list_paginated/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Options for pagination.","ref":"Bonfire.Posts.html#list_paginated/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.list_paginated/2","doc":"A paginated list of posts.","ref":"Bonfire.Posts.html#list_paginated/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.list_paginated/2","doc":"iex> Bonfire.Posts.list_paginated([])\n %{edges: [%Post{}, %Post{}], page_info: %{}}","ref":"Bonfire.Posts.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Posts.prepare_post_attrs/1","doc":"","ref":"Bonfire.Posts.html#prepare_post_attrs/1"},{"type":"function","title":"Bonfire.Posts.publish/1","doc":"Publishes a post.","ref":"Bonfire.Posts.html#publish/1"},{"type":"function","title":"Parameters - Bonfire.Posts.publish/1","doc":"- `opts`: Options for publishing the post.","ref":"Bonfire.Posts.html#publish/1-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.publish/1","doc":"`{:ok, post}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#publish/1-returns"},{"type":"function","title":"Examples - Bonfire.Posts.publish/1","doc":"iex> Bonfire.Posts.publish(\n current_user: me, \n boundary: \"public\",\n post_attrs: %{\n post_content: %{\n name: \"test post title\",\n html_body: \" epic html message \"\n }\n })\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#publish/1-examples"},{"type":"function","title":"Bonfire.Posts.query/2","doc":"Queries posts.","ref":"Bonfire.Posts.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Posts.query/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Query options.","ref":"Bonfire.Posts.html#query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.query/2","doc":"An Ecto query for posts.","ref":"Bonfire.Posts.html#query/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.query/2","doc":"iex> Bonfire.Posts.query([id: \"post_123\"])\n #Ecto.Query<>","ref":"Bonfire.Posts.html#query/2-examples"},{"type":"function","title":"Bonfire.Posts.query_module/0","doc":"","ref":"Bonfire.Posts.html#query_module/0"},{"type":"function","title":"Bonfire.Posts.query_paginated/2","doc":"Queries posts with pagination.","ref":"Bonfire.Posts.html#query_paginated/2"},{"type":"function","title":"Parameters - Bonfire.Posts.query_paginated/2","doc":"- `filters`: Filters to apply to the query.\n- `opts`: Options for pagination.","ref":"Bonfire.Posts.html#query_paginated/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.query_paginated/2","doc":"A paginated query for posts.","ref":"Bonfire.Posts.html#query_paginated/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.query_paginated/2","doc":"iex> Bonfire.Posts.query_paginated([])\n #Ecto.Query<>","ref":"Bonfire.Posts.html#query_paginated/2-examples"},{"type":"function","title":"Bonfire.Posts.read/2","doc":"Attempts to fetch a post by its ID, if the current user has permission to read it.","ref":"Bonfire.Posts.html#read/2"},{"type":"function","title":"Parameters - Bonfire.Posts.read/2","doc":"- `post_id`: The ID of the post to read.\n- `opts`: Options, incl. current user.","ref":"Bonfire.Posts.html#read/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.read/2","doc":"The post if found, `nil` otherwise.","ref":"Bonfire.Posts.html#read/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.read/2","doc":"iex> Bonfire.Posts.read(\"post_123\")\n %Post{}","ref":"Bonfire.Posts.html#read/2-examples"},{"type":"function","title":"Bonfire.Posts.run_epic/3","doc":"Runs a series of post `Bonfire.Epics` operations based on configured acts for this module.","ref":"Bonfire.Posts.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Posts.run_epic/3","doc":"- `type`: The type of epic operation to run.\n- `options`: Options for the epic operation.\n- `on`: The key in the epic assigns to return (default: `:post`).","ref":"Bonfire.Posts.html#run_epic/3-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.run_epic/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Posts.html#run_epic/3-returns"},{"type":"function","title":"Examples - Bonfire.Posts.run_epic/3","doc":"iex> Bonfire.Posts.run_epic(:publish, [])\n {:ok, %Post{}}","ref":"Bonfire.Posts.html#run_epic/3-examples"},{"type":"function","title":"Bonfire.Posts.schema_module/0","doc":"","ref":"Bonfire.Posts.html#schema_module/0"},{"type":"function","title":"Bonfire.Posts.search/2","doc":"Searches for posts.","ref":"Bonfire.Posts.html#search/2"},{"type":"function","title":"Parameters - Bonfire.Posts.search/2","doc":"- `search`: The search term to look for in the title, summary, or body.\n- `opts`: Search options.","ref":"Bonfire.Posts.html#search/2-parameters"},{"type":"function","title":"Returns - Bonfire.Posts.search/2","doc":"A list of matching posts.","ref":"Bonfire.Posts.html#search/2-returns"},{"type":"function","title":"Examples - Bonfire.Posts.search/2","doc":"iex> Bonfire.Posts.search(\"example\")\n [%Post{}, %Post{}]","ref":"Bonfire.Posts.html#search/2-examples"},{"type":"function","title":"Bonfire.Posts.search_query/2","doc":"","ref":"Bonfire.Posts.html#search_query/2"},{"type":"module","title":"Bonfire.Posts.Acts.Posts.Publish","doc":"Creates a changeset for publishing a post\n\nEpic Options:\n * `:current_user` - user that will create the post, required.\n * `:post_attrs` (configurable) - attrs to create the post from, required.\n * `:post_id` (configurable) - id to use for the created post (handy for creating\n activitypub objects with an id representing their reported creation time)\n\nAct Options:\n * `:id` - epic options key to find an id to force override with at, default: `:post_id`\n * `:as` - key to assign changeset to, default: `:post`.\n * `:attrs` - epic options key to find the attributes at, default: `:post_attrs`.","ref":"Bonfire.Posts.Acts.Posts.Publish.html"},{"type":"module","title":"Bonfire.Posts.Fake","doc":"","ref":"Bonfire.Posts.Fake.html"},{"type":"function","title":"Bonfire.Posts.Fake.fake_comment!/4","doc":"","ref":"Bonfire.Posts.Fake.html#fake_comment!/4"},{"type":"function","title":"Bonfire.Posts.Fake.fake_post!/4","doc":"","ref":"Bonfire.Posts.Fake.html#fake_post!/4"},{"type":"function","title":"Bonfire.Posts.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Posts.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Posts.Integration","doc":"","ref":"Bonfire.Posts.Integration.html"},{"type":"function","title":"Bonfire.Posts.Integration.declared_extension/0","doc":"","ref":"Bonfire.Posts.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Posts.Integration.mailer/0","doc":"","ref":"Bonfire.Posts.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Posts.Integration.repo/0","doc":"","ref":"Bonfire.Posts.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Posts.LiveHandler","doc":"","ref":"Bonfire.Posts.LiveHandler.html"},{"type":"function","title":"Bonfire.Posts.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Posts.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Posts.LiveHandler.post_changeset/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#post_changeset/2"},{"type":"macro","title":"Bonfire.Posts.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Posts.LiveHandler.write_feedback/2","doc":"","ref":"Bonfire.Posts.LiveHandler.html#write_feedback/2"},{"type":"module","title":"Bonfire.Quantify","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Units\n- Measures","ref":"Bonfire.Quantify.html"},{"type":"module","title":"Handy commands - Bonfire.Quantify","doc":"","ref":"Bonfire.Quantify.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Quantify","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Quantify.html#module-copyright-and-license"},{"type":"module","title":"Bonfire.Quantify.GraphQL.Hydration","doc":"","ref":"Bonfire.Quantify.GraphQL.Hydration.html"},{"type":"function","title":"Bonfire.Quantify.GraphQL.Hydration.hydrate/0","doc":"","ref":"Bonfire.Quantify.GraphQL.Hydration.html#hydrate/0"},{"type":"module","title":"Bonfire.Quantify.Measure","doc":"","ref":"Bonfire.Quantify.Measure.html"},{"type":"function","title":"Bonfire.Quantify.Measure.copy/1","doc":"Copy the attributes of a measure required to create a new one.","ref":"Bonfire.Quantify.Measure.html#copy/1"},{"type":"function","title":"Bonfire.Quantify.Measure.create_changeset/3","doc":"","ref":"Bonfire.Quantify.Measure.html#create_changeset/3"},{"type":"function","title":"Bonfire.Quantify.Measure.delete/2","doc":"","ref":"Bonfire.Quantify.Measure.html#delete/2"},{"type":"function","title":"Bonfire.Quantify.Measure.get/3","doc":"","ref":"Bonfire.Quantify.Measure.html#get/3"},{"type":"function","title":"Bonfire.Quantify.Measure.put/3","doc":"","ref":"Bonfire.Quantify.Measure.html#put/3"},{"type":"function","title":"Bonfire.Quantify.Measure.update_changeset/2","doc":"","ref":"Bonfire.Quantify.Measure.html#update_changeset/2"},{"type":"function","title":"Bonfire.Quantify.Measure.validate_changeset/2","doc":"","ref":"Bonfire.Quantify.Measure.html#validate_changeset/2"},{"type":"type","title":"Bonfire.Quantify.Measure.t/0","doc":"","ref":"Bonfire.Quantify.Measure.html#t:t/0"},{"type":"module","title":"Bonfire.Quantify.Measures","doc":"","ref":"Bonfire.Quantify.Measures.html"},{"type":"function","title":"Bonfire.Quantify.Measures.ap_publish_activity/3","doc":"","ref":"Bonfire.Quantify.Measures.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Quantify.Measures.ap_receive_activity/3","doc":"","ref":"Bonfire.Quantify.Measures.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Quantify.Measures.create/2","doc":"","ref":"Bonfire.Quantify.Measures.html#create/2"},{"type":"function","title":"Bonfire.Quantify.Measures.create/3","doc":"","ref":"Bonfire.Quantify.Measures.html#create/3"},{"type":"function","title":"Bonfire.Quantify.Measures.cursor/0","doc":"","ref":"Bonfire.Quantify.Measures.html#cursor/0"},{"type":"function","title":"Bonfire.Quantify.Measures.federation_module/0","doc":"","ref":"Bonfire.Quantify.Measures.html#federation_module/0"},{"type":"function","title":"Bonfire.Quantify.Measures.many/1","doc":"Retrieves a list of collections by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Measures.html#many/1"},{"type":"function","title":"Bonfire.Quantify.Measures.one/1","doc":"Retrieves a single collection by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Measures.html#one/1"},{"type":"function","title":"Bonfire.Quantify.Measures.test_cursor/0","doc":"","ref":"Bonfire.Quantify.Measures.html#test_cursor/0"},{"type":"function","title":"Bonfire.Quantify.Measures.update/2","doc":"","ref":"Bonfire.Quantify.Measures.html#update/2"},{"type":"module","title":"Bonfire.Quantify.Measures.Queries","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.filter/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.inc_quantity/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#inc_quantity/2"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.join_to/3","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.queries/5","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.query/1","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#query/1"},{"type":"function","title":"Bonfire.Quantify.Measures.Queries.query/2","doc":"","ref":"Bonfire.Quantify.Measures.Queries.html#query/2"},{"type":"module","title":"Bonfire.Quantify.Simulate","doc":"","ref":"Bonfire.Quantify.Simulate.html"},{"type":"function","title":"Bonfire.Quantify.Simulate.fake_measure!/3","doc":"","ref":"Bonfire.Quantify.Simulate.html#fake_measure!/3"},{"type":"function","title":"Bonfire.Quantify.Simulate.fake_unit!/3","doc":"","ref":"Bonfire.Quantify.Simulate.html#fake_unit!/3"},{"type":"function","title":"Bonfire.Quantify.Simulate.measure/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#measure/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.measure_input/2","doc":"","ref":"Bonfire.Quantify.Simulate.html#measure_input/2"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_input/1","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit_input/1"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_name/0","doc":"A unit","ref":"Bonfire.Quantify.Simulate.html#unit_name/0"},{"type":"function","title":"Bonfire.Quantify.Simulate.unit_symbol/0","doc":"","ref":"Bonfire.Quantify.Simulate.html#unit_symbol/0"},{"type":"module","title":"Bonfire.Quantify.Unit","doc":"","ref":"Bonfire.Quantify.Unit.html"},{"type":"function","title":"Bonfire.Quantify.Unit.create_changeset/2","doc":"","ref":"Bonfire.Quantify.Unit.html#create_changeset/2"},{"type":"function","title":"Bonfire.Quantify.Unit.create_changeset/3","doc":"","ref":"Bonfire.Quantify.Unit.html#create_changeset/3"},{"type":"function","title":"Bonfire.Quantify.Unit.delete/2","doc":"","ref":"Bonfire.Quantify.Unit.html#delete/2"},{"type":"function","title":"Bonfire.Quantify.Unit.get/3","doc":"","ref":"Bonfire.Quantify.Unit.html#get/3"},{"type":"function","title":"Bonfire.Quantify.Unit.put/3","doc":"","ref":"Bonfire.Quantify.Unit.html#put/3"},{"type":"function","title":"Bonfire.Quantify.Unit.update_changeset/2","doc":"","ref":"Bonfire.Quantify.Unit.html#update_changeset/2"},{"type":"type","title":"Bonfire.Quantify.Unit.t/0","doc":"","ref":"Bonfire.Quantify.Unit.html#t:t/0"},{"type":"module","title":"Bonfire.Quantify.Units","doc":"","ref":"Bonfire.Quantify.Units.html"},{"type":"function","title":"Bonfire.Quantify.Units.ap_publish_activity/3","doc":"","ref":"Bonfire.Quantify.Units.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Quantify.Units.ap_receive_activity/3","doc":"","ref":"Bonfire.Quantify.Units.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Quantify.Units.create/2","doc":"","ref":"Bonfire.Quantify.Units.html#create/2"},{"type":"function","title":"Bonfire.Quantify.Units.create/3","doc":"","ref":"Bonfire.Quantify.Units.html#create/3"},{"type":"function","title":"Bonfire.Quantify.Units.cursor/0","doc":"","ref":"Bonfire.Quantify.Units.html#cursor/0"},{"type":"function","title":"Bonfire.Quantify.Units.federation_module/0","doc":"","ref":"Bonfire.Quantify.Units.html#federation_module/0"},{"type":"function","title":"Bonfire.Quantify.Units.get_or_create/2","doc":"","ref":"Bonfire.Quantify.Units.html#get_or_create/2"},{"type":"function","title":"Bonfire.Quantify.Units.many/1","doc":"Retrieves a list of collections by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Units.html#many/1"},{"type":"function","title":"Bonfire.Quantify.Units.one/1","doc":"Retrieves a single collection by arbitrary filters.\nUsed by:\n* Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for collections (inc. tests)","ref":"Bonfire.Quantify.Units.html#one/1"},{"type":"function","title":"Bonfire.Quantify.Units.soft_delete/1","doc":"","ref":"Bonfire.Quantify.Units.html#soft_delete/1"},{"type":"function","title":"Bonfire.Quantify.Units.test_cursor/0","doc":"","ref":"Bonfire.Quantify.Units.html#test_cursor/0"},{"type":"function","title":"Bonfire.Quantify.Units.update/2","doc":"","ref":"Bonfire.Quantify.Units.html#update/2"},{"type":"module","title":"Bonfire.Quantify.Units.Queries","doc":"","ref":"Bonfire.Quantify.Units.Queries.html"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.filter/2","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.join_to/3","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.queries/5","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#queries/5"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.query/1","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#query/1"},{"type":"function","title":"Bonfire.Quantify.Units.Queries.query/2","doc":"","ref":"Bonfire.Quantify.Units.Queries.html#query/2"},{"type":"module","title":"Bonfire.RuntimeConfig","doc":"","ref":"Bonfire.RuntimeConfig.html"},{"type":"function","title":"Bonfire.RuntimeConfig.config/0","doc":"NOTE: you can override this default config in your app's runtime.exs, by placing similarly-named config keys below the `Bonfire.Common.Config.LoadExtensionsConfig.load_configs` line","ref":"Bonfire.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Search","doc":"An extension for [Bonfire](https://bonfire.cafe/) to handle:\n\n- Search indexing\n- Ultra-fast search\n- LiveView search UI\n\nYou can implement adapters for your prefered search backend. Currently adapters are included for:\n- Database\n- [Meili Search](https://www.meilisearch.com/)","ref":"Bonfire.Search.html"},{"type":"module","title":"Development & Deployment Documentation - Bonfire.Search","doc":"This extension is meant to be used inside of a Bonfire app, so please refer to the main repo at: https://github.com/bonfire-networks/bonfire-app","ref":"Bonfire.Search.html#module-development-deployment-documentation"},{"type":"module","title":"Copyright and License - Bonfire.Search","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Search.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Search.adapter/0","doc":"","ref":"Bonfire.Search.html#adapter/0"},{"type":"function","title":"Bonfire.Search.base_query/0","doc":"","ref":"Bonfire.Search.html#base_query/0"},{"type":"function","title":"Bonfire.Search.default_types/1","doc":"","ref":"Bonfire.Search.html#default_types/1"},{"type":"function","title":"Bonfire.Search.run_search_db/3","doc":"","ref":"Bonfire.Search.html#run_search_db/3"},{"type":"function","title":"Bonfire.Search.search/2","doc":"","ref":"Bonfire.Search.html#search/2"},{"type":"function","title":"Bonfire.Search.search/4","doc":"","ref":"Bonfire.Search.html#search/4"},{"type":"function","title":"Bonfire.Search.search_by_type/3","doc":"","ref":"Bonfire.Search.html#search_by_type/3"},{"type":"module","title":"Bonfire.Search.Acts.Queue","doc":"An act that enqueues publish/update/delete requests to meilisearch via an oban job queue.","ref":"Bonfire.Search.Acts.Queue.html"},{"type":"function","title":"Bonfire.Search.Acts.Queue.maybe_indexable_object/2","doc":"","ref":"Bonfire.Search.Acts.Queue.html#maybe_indexable_object/2"},{"type":"function","title":"Bonfire.Search.Acts.Queue.maybe_unindex/1","doc":"","ref":"Bonfire.Search.Acts.Queue.html#maybe_unindex/1"},{"type":"function","title":"Bonfire.Search.Acts.Queue.prepare_object/1","doc":"","ref":"Bonfire.Search.Acts.Queue.html#prepare_object/1"},{"type":"module","title":"Bonfire.Search.Fuzzy","doc":"","ref":"Bonfire.Search.Fuzzy.html"},{"type":"function","title":"Bonfire.Search.Fuzzy.do_search/4","doc":"","ref":"Bonfire.Search.Fuzzy.html#do_search/4"},{"type":"function","title":"Bonfire.Search.Fuzzy.search/4","doc":"","ref":"Bonfire.Search.Fuzzy.html#search/4"},{"type":"function","title":"Bonfire.Search.Fuzzy.search_filtered/2","doc":"","ref":"Bonfire.Search.Fuzzy.html#search_filtered/2"},{"type":"module","title":"Bonfire.Search.HTTP","doc":"","ref":"Bonfire.Search.HTTP.html"},{"type":"function","title":"Bonfire.Search.HTTP.http_adapter/0","doc":"","ref":"Bonfire.Search.HTTP.html#http_adapter/0"},{"type":"function","title":"Bonfire.Search.HTTP.http_error/5","doc":"","ref":"Bonfire.Search.HTTP.html#http_error/5"},{"type":"function","title":"Bonfire.Search.HTTP.http_request/4","doc":"","ref":"Bonfire.Search.HTTP.html#http_request/4"},{"type":"module","title":"Bonfire.Search.Indexer","doc":"","ref":"Bonfire.Search.Indexer.html"},{"type":"function","title":"Bonfire.Search.Indexer.host/1","doc":"","ref":"Bonfire.Search.Indexer.html#host/1"},{"type":"function","title":"Bonfire.Search.Indexer.index_public_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#index_public_object/1"},{"type":"function","title":"Bonfire.Search.Indexer.init_index/3","doc":"","ref":"Bonfire.Search.Indexer.html#init_index/3"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_delete_object/2","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_delete_object/2"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_index_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_index_object/1"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_indexable_and_discoverable/2","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_indexable_and_discoverable/2"},{"type":"function","title":"Bonfire.Search.Indexer.maybe_indexable_object/1","doc":"","ref":"Bonfire.Search.Indexer.html#maybe_indexable_object/1"},{"type":"module","title":"Bonfire.Search.LiveHandler","doc":"","ref":"Bonfire.Search.LiveHandler.html"},{"type":"function","title":"Bonfire.Search.LiveHandler.content_live_search/6","doc":"","ref":"Bonfire.Search.LiveHandler.html#content_live_search/6"},{"type":"function","title":"Bonfire.Search.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Search.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Search.LiveHandler.live_search/4","doc":"","ref":"Bonfire.Search.LiveHandler.html#live_search/4"},{"type":"macro","title":"Bonfire.Search.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Search.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Search.Meili","doc":"","ref":"Bonfire.Search.Meili.html"},{"type":"function","title":"Bonfire.Search.Meili.api/4","doc":"","ref":"Bonfire.Search.Meili.html#api/4"},{"type":"function","title":"Bonfire.Search.Meili.create_index/2","doc":"","ref":"Bonfire.Search.Meili.html#create_index/2"},{"type":"function","title":"Bonfire.Search.Meili.delete/3","doc":"","ref":"Bonfire.Search.Meili.html#delete/3"},{"type":"function","title":"Bonfire.Search.Meili.facet_from_map/1","doc":"","ref":"Bonfire.Search.Meili.html#facet_from_map/1"},{"type":"function","title":"Bonfire.Search.Meili.get/1","doc":"","ref":"Bonfire.Search.Meili.html#get/1"},{"type":"function","title":"Bonfire.Search.Meili.get/3","doc":"","ref":"Bonfire.Search.Meili.html#get/3"},{"type":"function","title":"Bonfire.Search.Meili.index_exists/1","doc":"","ref":"Bonfire.Search.Meili.html#index_exists/1"},{"type":"function","title":"Bonfire.Search.Meili.list_facets/1","doc":"","ref":"Bonfire.Search.Meili.html#list_facets/1"},{"type":"function","title":"Bonfire.Search.Meili.patch/3","doc":"","ref":"Bonfire.Search.Meili.html#patch/3"},{"type":"function","title":"Bonfire.Search.Meili.post/3","doc":"","ref":"Bonfire.Search.Meili.html#post/3"},{"type":"function","title":"Bonfire.Search.Meili.public_index/0","doc":"","ref":"Bonfire.Search.Meili.html#public_index/0"},{"type":"function","title":"Bonfire.Search.Meili.put/3","doc":"","ref":"Bonfire.Search.Meili.html#put/3"},{"type":"function","title":"Bonfire.Search.Meili.search/2","doc":"","ref":"Bonfire.Search.Meili.html#search/2"},{"type":"function","title":"Bonfire.Search.Meili.search/4","doc":"","ref":"Bonfire.Search.Meili.html#search/4"},{"type":"function","title":"Bonfire.Search.Meili.search_by_type/2","doc":"","ref":"Bonfire.Search.Meili.html#search_by_type/2"},{"type":"function","title":"Bonfire.Search.Meili.search_execute/2","doc":"","ref":"Bonfire.Search.Meili.html#search_execute/2"},{"type":"function","title":"Bonfire.Search.Meili.set_facets/2","doc":"","ref":"Bonfire.Search.Meili.html#set_facets/2"},{"type":"function","title":"Bonfire.Search.Meili.set_searchable_fields/2","doc":"","ref":"Bonfire.Search.Meili.html#set_searchable_fields/2"},{"type":"function","title":"Bonfire.Search.Meili.settings/2","doc":"","ref":"Bonfire.Search.Meili.html#settings/2"},{"type":"module","title":"Bonfire.Search.RuntimeConfig","doc":"","ref":"Bonfire.Search.RuntimeConfig.html"},{"type":"function","title":"Bonfire.Search.RuntimeConfig.config/0","doc":"","ref":"Bonfire.Search.RuntimeConfig.html#config/0"},{"type":"function","title":"Bonfire.Search.RuntimeConfig.config_module/0","doc":"","ref":"Bonfire.Search.RuntimeConfig.html#config_module/0"},{"type":"module","title":"Bonfire.Search.Stopwords","doc":"Handles matching of needs & offers","ref":"Bonfire.Search.Stopwords.html"},{"type":"function","title":"Bonfire.Search.Stopwords.filter/2","doc":"Filters out pre-defined stop words.","ref":"Bonfire.Search.Stopwords.html#filter/2"},{"type":"function","title":"Bonfire.Search.Stopwords.split_sentences/1","doc":"","ref":"Bonfire.Search.Stopwords.html#split_sentences/1"},{"type":"function","title":"Bonfire.Search.Stopwords.split_words/1","doc":"","ref":"Bonfire.Search.Stopwords.html#split_words/1"},{"type":"function","title":"Bonfire.Search.Stopwords.stop_words/1","doc":"","ref":"Bonfire.Search.Stopwords.html#stop_words/1"},{"type":"module","title":"Bonfire.Search.Web.Routes","doc":"","ref":"Bonfire.Search.Web.Routes.html"},{"type":"function","title":"Bonfire.Search.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Search.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Seeder","doc":"A way to have data seeds that work similarly to migrations.\n\nTo generate a new seed: `mix phil_columns.gen.seed my_seed_name` will create a new module in `priv/repo/seeds`\n\nTo actually insert the seeds into your app, if that's not configured to be done automatically in your mix aliases, run `mix phil_columns.seed`\n\nTo roll-back: `mix phil_columns.rollback`","ref":"Bonfire.Seeder.html"},{"type":"module","title":"Bonfire.Social","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Feeds / Timelines\n- Activities\n- Threads\n- Boosting\n- Liking\n- Flagging\n- etc","ref":"Bonfire.Social.html"},{"type":"module","title":"Handy commands - Bonfire.Social","doc":"","ref":"Bonfire.Social.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Social","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Social.declared_extension/0","doc":"","ref":"Bonfire.Social.html#declared_extension/0"},{"type":"function","title":"Bonfire.Social.federate_outgoing?/1","doc":"Checks if outgoing federation is enabled for the given subject.","ref":"Bonfire.Social.html#federate_outgoing?/1"},{"type":"function","title":"Parameters - Bonfire.Social.federate_outgoing?/1","doc":"- subject: The subject to check for federation capability (optional).","ref":"Bonfire.Social.html#federate_outgoing?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.federate_outgoing?/1","doc":"iex> Bonfire.Social.federate_outgoing?()\n true\n\n iex> Bonfire.Social.federate_outgoing?(user)\n false","ref":"Bonfire.Social.html#federate_outgoing?/1-examples"},{"type":"function","title":"Bonfire.Social.federating?/1","doc":"Checks if federation is generally enabled for the given subject.","ref":"Bonfire.Social.html#federating?/1"},{"type":"function","title":"Parameters - Bonfire.Social.federating?/1","doc":"- subject: The subject to check for federation capability (optional).","ref":"Bonfire.Social.html#federating?/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.federating?/1","doc":"iex> Bonfire.Social.federating?()\n true\n\n iex> Bonfire.Social.federating?(user)\n true","ref":"Bonfire.Social.html#federating?/1-examples"},{"type":"function","title":"Bonfire.Social.is_local?/2","doc":"Determines if the given thing is local to the current instance.","ref":"Bonfire.Social.html#is_local?/2"},{"type":"function","title":"Parameters - Bonfire.Social.is_local?/2","doc":"- thing: The object to check for locality.\n - opts: Additional options for the check (optional).","ref":"Bonfire.Social.html#is_local?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.is_local?/2","doc":"iex> Bonfire.Social.is_local?(local_user)\n true\n\n iex> Bonfire.Social.is_local?(remote_user)\n false","ref":"Bonfire.Social.html#is_local?/2-examples"},{"type":"function","title":"Bonfire.Social.mailer/0","doc":"Returns the configured mailer module.","ref":"Bonfire.Social.html#mailer/0"},{"type":"function","title":"Bonfire.Social.many/3","doc":"Executes a query and returns results based on the specified options.\n\nThis function can return query results in various formats, including raw query,\nstream, or paginated results.","ref":"Bonfire.Social.html#many/3"},{"type":"function","title":"Parameters - Bonfire.Social.many/3","doc":"- query: The Ecto query to execute.\n - paginate?: Boolean indicating whether to paginate results.\n - opts: Additional options for query execution.","ref":"Bonfire.Social.html#many/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.many/3","doc":"iex> query = from(u in User, where: u.age > 18)\n iex> Bonfire.Social.many(query, false, return: :query)\n #Ecto.Query<...>\n\n iex> Bonfire.Social.many(query, true, after: \"1\")\n %{entries: [%User{}, ...], page_info: %{...}}","ref":"Bonfire.Social.html#many/3-examples"},{"type":"function","title":"Bonfire.Social.maybe_federate/5","doc":"Attempts to federate an activity based on the given parameters.\n\nThis function handles various patterns of activities and objects, attempting to\nfederate them according to the specified verb and options.","ref":"Bonfire.Social.html#maybe_federate/5"},{"type":"function","title":"Parameters - Bonfire.Social.maybe_federate/5","doc":"- subject: The subject initiating the federation.\n - verb: The verb describing the activity (e.g., :create, :delete).\n - object: The object to be federated.\n - activity: The associated activity data (optional).\n - opts: Additional options for federation.","ref":"Bonfire.Social.html#maybe_federate/5-parameters"},{"type":"function","title":"Examples - Bonfire.Social.maybe_federate/5","doc":"iex> subject = %User{id: 1}\n iex> object = %Post{id: 2, content: \"Hello, world!\"}\n iex> Bonfire.Social.maybe_federate(subject, :create, object)\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.html#maybe_federate/5-examples"},{"type":"function","title":"Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"Federates an activity (if enabled) and wraps it with additional metadata.\n\nThis function attempts to federate an activity and, if successful, merges the\nfederated activity information with the original object.","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"- subject: The subject initiating the federation.\n - object: The object to be federated.\n - opts: Optional parameters for federation.","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.maybe_federate_and_gift_wrap_activity/3","doc":"iex> subject = %User{id: 1}\n iex> object = %Post{id: 2, content: \"Hello, world!\"}\n iex> {:ok, wrapped_object} = Bonfire.Social.maybe_federate_and_gift_wrap_activity(subject, object)\n iex> Map.has_key?(wrapped_object, :activity)\n true","ref":"Bonfire.Social.html#maybe_federate_and_gift_wrap_activity/3-examples"},{"type":"function","title":"Bonfire.Social.repo/0","doc":"Returns the configured repository module.","ref":"Bonfire.Social.html#repo/0"},{"type":"function","title":"Examples - Bonfire.Social.repo/0","doc":"iex> Bonfire.Social.repo()\n Bonfire.Common.Repo","ref":"Bonfire.Social.html#repo/0-examples"},{"type":"module","title":"Bonfire.Social.APActivities","doc":"A special type of activity object that stores federated JSON data as-is.\n\nThis module is used for any object type that isn't recognized or isn't implemented by an extension.\nIt provides functionality to handle ActivityPub activities, particularly for receiving and creating activities.","ref":"Bonfire.Social.APActivities.html"},{"type":"function","title":"Bonfire.Social.APActivities.ap_receive_activity/3","doc":"Receives and processes an ActivityPub activity.\n\nThis function is used to handle incoming federated activities.","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.APActivities.ap_receive_activity/3","doc":"- creator: The character (user) associated with the activity.\n - activity: The ActivityPub activity data.\n - object: The object associated with the activity.","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.APActivities.ap_receive_activity/3","doc":"iex> creator = %Character{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Create\"}}\n iex> object = %{data: %{\"type\" => \"Note\", \"content\" => \"Hello, fediverse!\"}}\n iex> Bonfire.Social.APActivities.ap_receive_activity(creator, activity, object)\n {:ok, %APActivity{}}","ref":"Bonfire.Social.APActivities.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.APActivities.create/4","doc":"Creates an `APActivity` from the given character, activity, and object.\n\nThis function handles various patterns of input data to create an APActivity.","ref":"Bonfire.Social.APActivities.html#create/4"},{"type":"function","title":"Parameters - Bonfire.Social.APActivities.create/4","doc":"- character: The character (user) creating the activity.\n - activity: The activity data.\n - object: The object associated with the activity.\n - public: A boolean indicating whether the activity is public (optional).","ref":"Bonfire.Social.APActivities.html#create/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.APActivities.create/4","doc":"iex> character = %Character{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Create\", \"object\" => %{\"content\" => \"Hello, world!\"}}}\n iex> object = %{data: %{\"type\" => \"Note\"}}\n iex> Bonfire.Social.APActivities.create(character, activity, object)\n {:ok, %APActivity{}}\n\n iex> Bonfire.Social.APActivities.create(character, activity, object, true)\n {:ok, %APActivity{}}","ref":"Bonfire.Social.APActivities.html#create/4-examples"},{"type":"module","title":"Bonfire.Social.Activities","doc":"Helpers to create or query (though that's usually done through `Bonfire.Social.FeedActivities`) activities, preload relevant associations, and otherwise massage activity-related data.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.Activity`, which has these fields:\n- id: primary key (which when the verb is Create usually matches the related Object) \n- subject: references the who (eg. a user)\n- verb: what kind of action (eg. references Like or Follow in `Bonfire.Data.AccessControl.Verb`)\n- object: references the what (eg. a specific post)","ref":"Bonfire.Social.Activities.html"},{"type":"function","title":"Bonfire.Social.Activities.activity_preloads/2","doc":"Applies preloads to a query or or post-loads to object(s) with the specified options. See `activity_preloads/3` for what preload options you can specify.","ref":"Bonfire.Social.Activities.html#activity_preloads/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_preloads/2","doc":"iex> activity_preloads(query, preload: [])\n # Query with applied activity preloads","ref":"Bonfire.Social.Activities.html#activity_preloads/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_preloads/3","doc":"Applies preloads to a query or or post-loads to object(s) with the specified preloads and options.","ref":"Bonfire.Social.Activities.html#activity_preloads/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_preloads/3","doc":"> activity_preloads(query, [], [])\n # Original query, with no extra joins/preloads\n\n > activity_preloads(object, [], [])\n # Original object, with no extra assocs preloads\n\n > activity_preloads(object_or_query, [:with_creator], [])\n # Object or query with extra assocs preloads\n\n > activity_preloads(object_or_query, [:feed, :with_reply_to, :with_media, :with_object_more, :maybe_with_labelled])\n # Object or query several extra assoc preloads\n\n Other possible preloads:\n :default\n :all\n :feed\n :feed_postload\n :feed_metadata\n :feed_by_subject\n :feed_by_creator\n :notifications\n :object_with_creator\n :posts\n :posts_with_thread\n :posts_with_reply_to\n :with_creator\n :with_subject\n :with_verb\n :with_object\n :with_object_posts\n :with_object_more\n :with_replied\n :with_thread_name\n :with_parent\n :with_reply_to\n :with_seen\n :with_media\n :per_media\n :tags\n :maybe_with_labelled","ref":"Bonfire.Social.Activities.html#activity_preloads/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_under_object/1","doc":"Processes and structures activity data within an object.","ref":"Bonfire.Social.Activities.html#activity_under_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.activity_under_object/1","doc":"iex> activity_under_object(%{activity: %{id: 2, object: %{id: 1}}})\n %{id: 1, activity: %{id: 2}}","ref":"Bonfire.Social.Activities.html#activity_under_object/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.activity_under_object/2","doc":"","ref":"Bonfire.Social.Activities.html#activity_under_object/2"},{"type":"function","title":"Bonfire.Social.Activities.activity_with_object_from_assigns/1","doc":"","ref":"Bonfire.Social.Activities.html#activity_with_object_from_assigns/1"},{"type":"function","title":"Bonfire.Social.Activities.all_verb_names/0","doc":"Outputs the names of all object verbs for localization, for the purpose of adding to the localisation strings, as long as the output is piped through to localise_strings/1 at compile time.","ref":"Bonfire.Social.Activities.html#all_verb_names/0"},{"type":"function","title":"Bonfire.Social.Activities.all_verb_names_extra/0","doc":"Retrieves additional verb names with various formats for localization.","ref":"Bonfire.Social.Activities.html#all_verb_names_extra/0"},{"type":"function","title":"Bonfire.Social.Activities.as_permitted_for/3","doc":"Filters a query to include only permitted objects.","ref":"Bonfire.Social.Activities.html#as_permitted_for/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.as_permitted_for/3","doc":"> as_permitted_for(query, [])\n # Filtered query","ref":"Bonfire.Social.Activities.html#as_permitted_for/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.build_assoc/3","doc":"","ref":"Bonfire.Social.Activities.html#build_assoc/3"},{"type":"function","title":"Bonfire.Social.Activities.build_assoc/4","doc":"","ref":"Bonfire.Social.Activities.html#build_assoc/4"},{"type":"function","title":"Bonfire.Social.Activities.by_subject_verb_object_q/3","doc":"","ref":"Bonfire.Social.Activities.html#by_subject_verb_object_q/3"},{"type":"function","title":"Bonfire.Social.Activities.cast/4","doc":"Casts a changeset with the provided verb, creator and options.","ref":"Bonfire.Social.Activities.html#cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.cast/4","doc":"> cast(changeset, :like, %User{}, feed_ids: [])\n # Changeset with associations set","ref":"Bonfire.Social.Activities.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.count_total/0","doc":"Counts the total number of activities.","ref":"Bonfire.Social.Activities.html#count_total/0"},{"type":"function","title":"Bonfire.Social.Activities.create/4","doc":"Create an Activity.\nNOTE: you will usually want to use `cast/3` instead or maybe `Objects.publish/5`","ref":"Bonfire.Social.Activities.html#create/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.create/4","doc":"> create(%User{id: \"1\"}, :like, %Post{id: \"1\"})\n {:ok, %Activity{}}","ref":"Bonfire.Social.Activities.html#create/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete/1","doc":"Deletes activities by ID or struct, or using specific filters.","ref":"Bonfire.Social.Activities.html#delete/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete/1","doc":"> delete(activity)\n # Number of deleted activities\n \n > delete(\"1\")\n # Number of deleted activities\n\n > delete([id: \"1\"])\n # Number of deleted activities","ref":"Bonfire.Social.Activities.html#delete/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete_by_object/1","doc":"Deletes an activity by object ID.","ref":"Bonfire.Social.Activities.html#delete_by_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete_by_object/1","doc":"iex> delete_by_object(\"1\")\n # Number of deleted objects","ref":"Bonfire.Social.Activities.html#delete_by_object/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.delete_by_subject_verb_object/3","doc":"Deletes an activity by subject, verb, and object.","ref":"Bonfire.Social.Activities.html#delete_by_subject_verb_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Activities.delete_by_subject_verb_object/3","doc":"> delete_by_subject_verb_object(%User{id: \"1\"}, :like, %Post{id: \"1\"})\n # Number of deleted activities","ref":"Bonfire.Social.Activities.html#delete_by_subject_verb_object/3-examples"},{"type":"function","title":"Bonfire.Social.Activities.fetch_cursor_value_fun/2","doc":"Retrieves the cursor value for pagination based on field or data structure.","ref":"Bonfire.Social.Activities.html#fetch_cursor_value_fun/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.fetch_cursor_value_fun/2","doc":"> fetch_cursor_value_fun(%{nested_replies_count: 5}, :num_replies)\n # returns the cursor value based on the number of replies","ref":"Bonfire.Social.Activities.html#fetch_cursor_value_fun/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.get/2","doc":"Gets an activity by its ID.","ref":"Bonfire.Social.Activities.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.get/2","doc":"iex> get(\"activity_id\", [])","ref":"Bonfire.Social.Activities.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.load_object/2","doc":"Loads an object based on its ID or pointer.","ref":"Bonfire.Social.Activities.html#load_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.load_object/2","doc":"> load_object(\"object_id\")","ref":"Bonfire.Social.Activities.html#load_object/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_join_creator/2","doc":"Optionally joins the creator.\n\nPerforms a query optimization: only includes the creator if different from the subject or current user.\n\nIf `exclude_user_ids` is empty, the creator is always included. Otherwise, it is included only if it is different from the users in `exclude_user_ids`.","ref":"Bonfire.Social.Activities.html#maybe_join_creator/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.maybe_join_creator/2","doc":"iex> maybe_join_creator(query, [])\n # returns query with creator preloaded if different from the subject\n\n iex> maybe_join_creator(query, [1, 2, 3])\n # returns query with creator included only if creator.id not in [1, 2, 3]","ref":"Bonfire.Social.Activities.html#maybe_join_creator/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_join_subject/2","doc":"Optimizes the query to optionally include the subject data.\n\nIf `exclude_user_ids` is empty, the subject is always included. Otherwise, it is included only if it is different from the users in `exclude_user_ids`.","ref":"Bonfire.Social.Activities.html#maybe_join_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.maybe_join_subject/2","doc":"iex> maybe_join_subject(query, [])\n # returns query with subject preloaded\n\n iex> maybe_join_subject(query, [1, 2, 3])\n # returns query with subject included only if subject.id not in [1, 2, 3]","ref":"Bonfire.Social.Activities.html#maybe_join_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.maybe_remove_for_deleters_feeds/1","doc":"","ref":"Bonfire.Social.Activities.html#maybe_remove_for_deleters_feeds/1"},{"type":"function","title":"Bonfire.Social.Activities.maybe_with_labelled/0","doc":"","ref":"Bonfire.Social.Activities.html#maybe_with_labelled/0"},{"type":"function","title":"Bonfire.Social.Activities.object_from_activity/1","doc":"Retrieves or constructs the object from an activity.","ref":"Bonfire.Social.Activities.html#object_from_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_from_activity/1","doc":"iex> object_from_activity(%{object: %{id: 1}})\n %{id: 1}","ref":"Bonfire.Social.Activities.html#object_from_activity/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_preload_activity/2","doc":"Preloads the activity for an object and verb.","ref":"Bonfire.Social.Activities.html#object_preload_activity/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_preload_activity/2","doc":"> object_preload_activity(%Post{}, :like)\n # Object with preloaded activity","ref":"Bonfire.Social.Activities.html#object_preload_activity/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_preload_create_activity/1","doc":"Preloads the creation activity for an object.","ref":"Bonfire.Social.Activities.html#object_preload_create_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.object_preload_create_activity/1","doc":"> object_preload_create_activity(%Post{})\n # Object with preloaded creation activity","ref":"Bonfire.Social.Activities.html#object_preload_create_activity/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.object_under_activity/2","doc":"","ref":"Bonfire.Social.Activities.html#object_under_activity/2"},{"type":"function","title":"Bonfire.Social.Activities.order_cursor_fields/2","doc":"Provides cursor fields for ordering based on sort criteria.","ref":"Bonfire.Social.Activities.html#order_cursor_fields/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.order_cursor_fields/2","doc":"> order_cursor_fields(:num_likes, :asc)\n # returns cursor fields for ordering by number of likes in ascending order","ref":"Bonfire.Social.Activities.html#order_cursor_fields/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.order_pagination_opts/2","doc":"Provides pagination options for ordering.","ref":"Bonfire.Social.Activities.html#order_pagination_opts/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.order_pagination_opts/2","doc":"> order_pagination_opts(:num_likes, :desc)\n # returns pagination options for ordering by number of likes in descending order","ref":"Bonfire.Social.Activities.html#order_pagination_opts/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.put_assoc/3","doc":"","ref":"Bonfire.Social.Activities.html#put_assoc/3"},{"type":"function","title":"Bonfire.Social.Activities.put_assoc/4","doc":"","ref":"Bonfire.Social.Activities.html#put_assoc/4"},{"type":"function","title":"Bonfire.Social.Activities.query/2","doc":"Constructs a query based on filters and optional user context.","ref":"Bonfire.Social.Activities.html#query/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query/2","doc":"iex> query(filters)\n\n iex> query([my: :feed], [current_user: nil])","ref":"Bonfire.Social.Activities.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_module/0","doc":"","ref":"Bonfire.Social.Activities.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Activities.query_object_preload_activity/4","doc":"Preloads activity for objects in a query using the specified verb and object ID field.","ref":"Bonfire.Social.Activities.html#query_object_preload_activity/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_object_preload_activity/4","doc":"> query_object_preload_activity(query, :like, :post_id, [])\n # Query with preloaded activities","ref":"Bonfire.Social.Activities.html#query_object_preload_activity/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_object_preload_create_activity/2","doc":"Preloads creation activity for objects in a query.","ref":"Bonfire.Social.Activities.html#query_object_preload_create_activity/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_object_preload_create_activity/2","doc":"> query_object_preload_create_activity(query, [])\n # Query with preloaded creation activities","ref":"Bonfire.Social.Activities.html#query_object_preload_create_activity/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.query_order/4","doc":"Orders query results based on a specified field and sort order.","ref":"Bonfire.Social.Activities.html#query_order/4"},{"type":"function","title":"Examples - Bonfire.Social.Activities.query_order/4","doc":"> query_order(query, :num_replies, :asc)\n # returns the query ordered by number of replies in ascending order","ref":"Bonfire.Social.Activities.html#query_order/4-examples"},{"type":"function","title":"Bonfire.Social.Activities.read/2","doc":"Retrieves an activity based on a query and options.","ref":"Bonfire.Social.Activities.html#read/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.read/2","doc":"iex> read(query)\n # returns an activity based on the provided query\n\n iex> read(object_id)\n # returns an activity for the provided object ID (usually a create activity)","ref":"Bonfire.Social.Activities.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.read_query/2","doc":"Constructs a query for reading activities based on input.","ref":"Bonfire.Social.Activities.html#read_query/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.read_query/2","doc":"> read_query(query, opts)\n\n > read_query(object_id, opts)","ref":"Bonfire.Social.Activities.html#read_query/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.reply_to_as_permitted_for/3","doc":"","ref":"Bonfire.Social.Activities.html#reply_to_as_permitted_for/3"},{"type":"function","title":"Bonfire.Social.Activities.schema_module/0","doc":"","ref":"Bonfire.Social.Activities.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Activities.verb_congugate/1","doc":"","ref":"Bonfire.Social.Activities.html#verb_congugate/1"},{"type":"function","title":"Bonfire.Social.Activities.verb_display/1","doc":"Returns a localized and formatted display name for a verb.","ref":"Bonfire.Social.Activities.html#verb_display/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_display/1","doc":"iex> verb_display(\"create\")","ref":"Bonfire.Social.Activities.html#verb_display/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_id/1","doc":"Retrieves or constructs an ID for a verb based on its name or identifier.","ref":"Bonfire.Social.Activities.html#verb_id/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_id/1","doc":"iex> verb_id(:create)","ref":"Bonfire.Social.Activities.html#verb_id/1-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_maybe_modify/2","doc":"Optionally modifies the verb based on activity context.","ref":"Bonfire.Social.Activities.html#verb_maybe_modify/2"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_maybe_modify/2","doc":"iex> verb_maybe_modify(\"Create\", %{object: %{post_content: %{id: 1}}})\n \"Write\"","ref":"Bonfire.Social.Activities.html#verb_maybe_modify/2-examples"},{"type":"function","title":"Bonfire.Social.Activities.verb_name/1","doc":"Returns the name of a verb based on its slug or identifier.","ref":"Bonfire.Social.Activities.html#verb_name/1"},{"type":"function","title":"Examples - Bonfire.Social.Activities.verb_name/1","doc":"iex> verb_name(:create)\n \"Create\"","ref":"Bonfire.Social.Activities.html#verb_name/1-examples"},{"type":"module","title":"Bonfire.Social.Acts.Activity","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates an activity for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `verb` - indicates what kind of activity we're creating, default: `:create`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Activity.html"},{"type":"function","title":"Bonfire.Social.Acts.Activity.run/2","doc":"","ref":"Bonfire.Social.Acts.Activity.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Activity.UnderObject","doc":"","ref":"Bonfire.Social.Acts.Activity.UnderObject.html"},{"type":"function","title":"Bonfire.Social.Acts.Activity.UnderObject.run/2","doc":"","ref":"Bonfire.Social.Acts.Activity.UnderObject.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.AntiSpam","doc":"An Act (as specified by `Bonfire.Epics`) that marks the sensitivity level of a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.AntiSpam.html"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.all_text_content/2","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#all_text_content/2"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.check!/3","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#check!/3"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.run/2","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#run/2"},{"type":"function","title":"Bonfire.Social.Acts.AntiSpam.spam?/3","doc":"","ref":"Bonfire.Social.Acts.AntiSpam.html#spam?/3"},{"type":"module","title":"Bonfire.Social.Acts.Federate","doc":"An Act (as specified by `Bonfire.Epics`) that translates an object (eg. a post) or changeset into some jobs for the AP publish worker. Handles creation, update and delete.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `ap_on` - key in assigns to find the AP object, default: `:ap_object`\n * `action` - indicates what kind of action we're federating, default: `:insert`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Federate.html"},{"type":"function","title":"Bonfire.Social.Acts.Federate.run/2","doc":"","ref":"Bonfire.Social.Acts.Federate.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Feeds","doc":"NOT USED - Finds a list of appropriate feeds into which to post.\n\nEpic Options:\n * `:current_user` - current user. required.\n * `:boundary` - preset string or custom boundaries. default: nil\n\nAct Options:\n * `:changeset` - key in assigns to find changeset, required","ref":"Bonfire.Social.Acts.Feeds.html"},{"type":"function","title":"Bonfire.Social.Acts.Feeds.run/2","doc":"","ref":"Bonfire.Social.Acts.Feeds.html#run/2"},{"type":"function","title":"Bonfire.Social.Acts.Feeds.thread_id/1","doc":"","ref":"Bonfire.Social.Acts.Feeds.html#thread_id/1"},{"type":"module","title":"Bonfire.Social.Acts.LivePush","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates an activity for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `feeds` - key\n * `notify_feeds` - key","ref":"Bonfire.Social.Acts.LivePush.html"},{"type":"function","title":"Bonfire.Social.Acts.LivePush.run/2","doc":"","ref":"Bonfire.Social.Acts.LivePush.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Objects.Delete","doc":"Delete something + specified associations with a changeset","ref":"Bonfire.Social.Acts.Objects.Delete.html"},{"type":"module","title":"Bonfire.Social.Acts.PostContents","doc":"An Act (as specified by `Bonfire.Epics`) that translates creates a the post contents for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.PostContents.html"},{"type":"function","title":"Bonfire.Social.Acts.PostContents.run/2","doc":"","ref":"Bonfire.Social.Acts.PostContents.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Sensitivity","doc":"An Act (as specified by `Bonfire.Epics`) that marks the sensitivity level of a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Sensitivity.html"},{"type":"function","title":"Bonfire.Social.Acts.Sensitivity.run/2","doc":"","ref":"Bonfire.Social.Acts.Sensitivity.html#run/2"},{"type":"module","title":"Bonfire.Social.Acts.Threaded","doc":"An Act (as specified by `Bonfire.Epics`) that sets the thread and/or reply_to for a object (eg. post) or changeset.\n\nAct Options:\n * `on` - key in assigns to find the object, default: `:post`\n * `current_user` - self explanatory","ref":"Bonfire.Social.Acts.Threaded.html"},{"type":"function","title":"Bonfire.Social.Acts.Threaded.run/2","doc":"","ref":"Bonfire.Social.Acts.Threaded.html#run/2"},{"type":"module","title":"Bonfire.Social.Answers","doc":"Answers are just another kind of `Bonfire.Social.Pins`, please refer to that module.","ref":"Bonfire.Social.Answers.html"},{"type":"module","title":"Bonfire.Social.Bookmarks","doc":"Mutate or query bookmarks (similar to likes but only visible to the creator of the bookmark)\n\nBookmarks are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Bookmarks.html"},{"type":"function","title":"Bonfire.Social.Bookmarks.bookmark/3","doc":"Bookmarks an object for a user.","ref":"Bonfire.Social.Bookmarks.html#bookmark/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.bookmark/3","doc":"iex> Bonfire.Social.Bookmarks.bookmark(user, object)\n {:ok, %Bonfire.Data.Social.Bookmark{}}","ref":"Bonfire.Social.Bookmarks.html#bookmark/3-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.bookmarked?/2","doc":"Checks if a user has bookmarked an object.","ref":"Bonfire.Social.Bookmarks.html#bookmarked?/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.bookmarked?/2","doc":"iex> Bonfire.Social.Bookmarks.bookmarked?(user, object)\n true","ref":"Bonfire.Social.Bookmarks.html#bookmarked?/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.by_bookmarked/2","doc":"Retrieves bookmark(er)s for an object.","ref":"Bonfire.Social.Bookmarks.html#by_bookmarked/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.by_bookmarked/2","doc":"iex> Bonfire.Social.Bookmarks.by_bookmarked(object)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#by_bookmarked/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.by_bookmarker/2","doc":"Retrieves bookmarked objects by a subject.","ref":"Bonfire.Social.Bookmarks.html#by_bookmarker/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.by_bookmarker/2","doc":"iex> Bonfire.Social.Bookmarks.by_bookmarker(user)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#by_bookmarker/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.count/2","doc":"Counts bookmarks based on filters and options.","ref":"Bonfire.Social.Bookmarks.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.count/2","doc":"iex> Bonfire.Social.Bookmarks.count([subject: user_id], [])\n 5\n\n iex> Bonfire.Social.Bookmarks.count(user, object)\n 1\n\n iex> Bonfire.Social.Bookmarks.count(object, [])\n 10","ref":"Bonfire.Social.Bookmarks.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.get/3","doc":"Retrieves a bookmark by subject and object.","ref":"Bonfire.Social.Bookmarks.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.get/3","doc":"iex> Bonfire.Social.Bookmarks.get(user, object)\n {:ok, %Bonfire.Data.Social.Bookmark{}}","ref":"Bonfire.Social.Bookmarks.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.get!/3","doc":"Retrieves a bookmark edge, raising an error if not found.","ref":"Bonfire.Social.Bookmarks.html#get!/3"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_by/2","doc":"Lists bookmarks by a specific user.","ref":"Bonfire.Social.Bookmarks.html#list_by/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_by/2","doc":"iex> Bonfire.Social.Bookmarks.list_by(user_id, current_user: me)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_my/1","doc":"Lists the current user's bookmarks.","ref":"Bonfire.Social.Bookmarks.html#list_my/1"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_my/1","doc":"iex> Bonfire.Social.Bookmarks.list_my(current_user: me)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.list_of/2","doc":"Lists bookmark(er)s of a specific object or objects.","ref":"Bonfire.Social.Bookmarks.html#list_of/2"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.list_of/2","doc":"iex> Bonfire.Social.Bookmarks.list_of(object_id)\n [%Bonfire.Data.Social.Bookmark{}, ...]","ref":"Bonfire.Social.Bookmarks.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Bookmarks.query/2","doc":"","ref":"Bonfire.Social.Bookmarks.html#query/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.query_module/0","doc":"","ref":"Bonfire.Social.Bookmarks.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Bookmarks.schema_module/0","doc":"","ref":"Bonfire.Social.Bookmarks.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Bookmarks.unbookmark/3","doc":"Removes a bookmark from an object for a user, if one exists","ref":"Bonfire.Social.Bookmarks.html#unbookmark/3"},{"type":"function","title":"Examples - Bonfire.Social.Bookmarks.unbookmark/3","doc":"iex> Bonfire.Social.Bookmarks.unbookmark(user, object)\n :ok","ref":"Bonfire.Social.Bookmarks.html#unbookmark/3-examples"},{"type":"module","title":"Bonfire.Social.Bookmarks.LiveHandler","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.bookmarker_count/1","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#bookmarker_count/1"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.do_bookmark/3","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#do_bookmark/3"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Bookmarks.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Bookmarks.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Bookmarks.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Boosts","doc":"Mutate, query, and federate boosts (re-sharing an activity or object).\n\nBoosts are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Boosts.html"},{"type":"function","title":"Bonfire.Social.Boosts.ap_publish_activity/3","doc":"Publishes a federated activity for a boost action.","ref":"Bonfire.Social.Boosts.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.ap_publish_activity/3","doc":"iex> Bonfire.Social.Boosts.ap_publish_activity(subject, :create, boost)\n {:ok, _activity}","ref":"Bonfire.Social.Boosts.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.ap_receive_activity/3","doc":"Receives and processes a federated boost activity.","ref":"Bonfire.Social.Boosts.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.ap_receive_activity/3","doc":"iex> Bonfire.Social.Boosts.ap_receive_activity(creator, activity, object)\n {:ok, _boost}","ref":"Bonfire.Social.Boosts.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.boost/3","doc":"Boosts an object for a user.","ref":"Bonfire.Social.Boosts.html#boost/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.boost/3","doc":"iex> Bonfire.Social.Boosts.boost(user, object)\n {:ok, %Bonfire.Data.Social.Boost{}}","ref":"Bonfire.Social.Boosts.html#boost/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.boosted?/2","doc":"Checks if a user has boosted an object.","ref":"Bonfire.Social.Boosts.html#boosted?/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.boosted?/2","doc":"iex> Bonfire.Social.Boosts.boosted?(user, object)\n true","ref":"Bonfire.Social.Boosts.html#boosted?/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.count/2","doc":"Counts boosts based on filters and options.","ref":"Bonfire.Social.Boosts.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.count/2","doc":"iex> Bonfire.Social.Boosts.count([subject: user_id], [])\n 5 # user made 5 boosts, across all objects\n\n iex> Bonfire.Social.Boosts.count(user, object)\n 3 # user boosted object 3 times\n\n iex> Bonfire.Social.Boosts.count(object, [])\n 10 # object was boosted 5 times, across all users","ref":"Bonfire.Social.Boosts.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.date_last_boosted/2","doc":"Gets the date of the latest boost by a user for an object.","ref":"Bonfire.Social.Boosts.html#date_last_boosted/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.date_last_boosted/2","doc":"iex> Bonfire.Social.Boosts.date_last_boosted(user, object)\n ~U[2023-07-29 12:34:56Z]","ref":"Bonfire.Social.Boosts.html#date_last_boosted/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.federation_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.get/3","doc":"Retrieves a boost edge by subject and object.","ref":"Bonfire.Social.Boosts.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.get/3","doc":"iex> Bonfire.Social.Boosts.get(subject, object)\n {:ok, %Bonfire.Data.Social.Boost{}}","ref":"Bonfire.Social.Boosts.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Boosts.get!/3","doc":"Retrieves a boost edge, raising an error if not found.","ref":"Bonfire.Social.Boosts.html#get!/3"},{"type":"function","title":"Bonfire.Social.Boosts.list_by/2","doc":"Lists boosts by a specific user.","ref":"Bonfire.Social.Boosts.html#list_by/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_by/2","doc":"iex> Bonfire.Social.Boosts.list_by(user_id)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_my/1","doc":"Lists boosts by the current user.","ref":"Bonfire.Social.Boosts.html#list_my/1"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_my/1","doc":"iex> Bonfire.Social.Boosts.list_my(current_user: me)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_of/2","doc":"Lists boosts of a specific object.","ref":"Bonfire.Social.Boosts.html#list_of/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_of/2","doc":"iex> Bonfire.Social.Boosts.list_of(object_id)\n [%Bonfire.Data.Social.Boost{}, ...]","ref":"Bonfire.Social.Boosts.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.list_paginated/2","doc":"Lists boosts with pagination.","ref":"Bonfire.Social.Boosts.html#list_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.list_paginated/2","doc":"iex> Bonfire.Social.Boosts.list_paginated([subject: user_id], [limit: 10])\n %{edges: [%Bonfire.Data.Social.Boost{}, ...], page_info: %{...}}","ref":"Bonfire.Social.Boosts.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.Boosts.maybe_boost/3","doc":"","ref":"Bonfire.Social.Boosts.html#maybe_boost/3"},{"type":"function","title":"Bonfire.Social.Boosts.query/2","doc":"","ref":"Bonfire.Social.Boosts.html#query/2"},{"type":"function","title":"Bonfire.Social.Boosts.query_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.schema_module/0","doc":"","ref":"Bonfire.Social.Boosts.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Boosts.unboost/3","doc":"Removes a boost from an object for a user, if one exists","ref":"Bonfire.Social.Boosts.html#unboost/3"},{"type":"function","title":"Examples - Bonfire.Social.Boosts.unboost/3","doc":"iex> Bonfire.Social.Boosts.unboost(user, object)\n {:ok, _}","ref":"Bonfire.Social.Boosts.html#unboost/3-examples"},{"type":"module","title":"Bonfire.Social.Boosts.LiveHandler","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.do_boost/3","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#do_boost/3"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Boosts.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Boosts.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Boosts.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Edges","doc":"Shared helpers for modules that implemented Edges to mutate or query them, preload relevant associations, etc.\n\nThis is a shared [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Edges.Edge`, which has these fields:\n- id: primary key which matches the related Activity \n- subject: the who (eg. a user)\n- table: what kind of action (eg. references Like or Follow in `Needle.Table` ...)\n- object: the what (eg. a specific post)","ref":"Bonfire.Social.Edges.html"},{"type":"function","title":"Bonfire.Social.Edges.changeset/5","doc":"Prepares a full changeset for the given schema, subject, verb, object, and options.","ref":"Bonfire.Social.Edges.html#changeset/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset/5","doc":"iex> changeset(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.changeset_base/4","doc":"Prepares a basic schema, with the schema type as top-level and an Egde assoc\n\niex> changeset_base(Like, %User{id: 1}, %Post{id: 2}, [])\n %Ecto.Changeset{}\n\niex> changeset_base(Follow, %User{id: 1}, %User{id: 2}, [])\n %Ecto.Changeset{}\n\niex> changeset_base({Request, Follow}, %User{id: 1}, %User{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_base/4"},{"type":"function","title":"Bonfire.Social.Edges.changeset_base_with_creator/4","doc":"Prepares a changeset with creator but no caretaker, which avoids the edge being deleted when subject is deleted.","ref":"Bonfire.Social.Edges.html#changeset_base_with_creator/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset_base_with_creator/4","doc":"iex> changeset_base_with_creator(MySchema, %User{id: 1}, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_base_with_creator/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.changeset_extra/5","doc":"Prepares a changeset with Acls, Activities and FeedActivities","ref":"Bonfire.Social.Edges.html#changeset_extra/5"},{"type":"function","title":"Bonfire.Social.Edges.changeset_without_caretaker/5","doc":"Prepares a changeset with creator but no caretaker, which avoids the edge being deleted when subject is deleted. Also includes Acls, Activities and FeedActivities.","ref":"Bonfire.Social.Edges.html#changeset_without_caretaker/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.changeset_without_caretaker/5","doc":"iex> changeset_without_caretaker(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Edges.html#changeset_without_caretaker/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.count/3","doc":"Counts the edges for the given type, filters or object, and options.","ref":"Bonfire.Social.Edges.html#count/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.count/3","doc":"> count(:like, %Post{id: 2}, [])\n 42","ref":"Bonfire.Social.Edges.html#count/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.count_for_subject/4","doc":"Counts the edges for the given type, subject, object, and options.","ref":"Bonfire.Social.Edges.html#count_for_subject/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.count_for_subject/4","doc":"> count_for_subject(:like, %User{id: 1}, %Post{id: 2}, [])\n 42","ref":"Bonfire.Social.Edges.html#count_for_subject/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_both/3","doc":"Deletes edges by subject, type, and object","ref":"Bonfire.Social.Edges.html#delete_by_both/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_both/3","doc":"iex> delete_by_both(%User{id: 1}, MySchema, %User{id: 2})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_both/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_object/1","doc":"Deletes edges where the given user is the object.","ref":"Bonfire.Social.Edges.html#delete_by_object/1"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_object/1","doc":"iex> delete_by_object(%User{id: 1})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_object/1-examples"},{"type":"function","title":"Bonfire.Social.Edges.delete_by_subject/1","doc":"Deletes edges where the given user is the subject.","ref":"Bonfire.Social.Edges.html#delete_by_subject/1"},{"type":"function","title":"Examples - Bonfire.Social.Edges.delete_by_subject/1","doc":"iex> delete_by_subject(%User{id: 1})\n :ok","ref":"Bonfire.Social.Edges.html#delete_by_subject/1-examples"},{"type":"function","title":"Bonfire.Social.Edges.edge_module_query/2","doc":"","ref":"Bonfire.Social.Edges.html#edge_module_query/2"},{"type":"function","title":"Bonfire.Social.Edges.exists?/4","doc":"Checks if an edge exists with the given schema/context, subject, and object.","ref":"Bonfire.Social.Edges.html#exists?/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.exists?/4","doc":"> exists?(MySchema, %User{id: 1}, %Post{id: 2}, [])\n true","ref":"Bonfire.Social.Edges.html#exists?/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.filters_from_opts/1","doc":"TODOC","ref":"Bonfire.Social.Edges.html#filters_from_opts/1"},{"type":"function","title":"Bonfire.Social.Edges.get/4","doc":"Retrieves the edge with either:\n- a schema/context, subject, and object(s)\n- a schema/context, filters, and options","ref":"Bonfire.Social.Edges.html#get/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.get/4","doc":"> get(MySchema, %User{id: 1}, %Post{id: 2})\n\n > get(MySchema, [%{subject: %User{id: 1}}], [])","ref":"Bonfire.Social.Edges.html#get/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.get!/4","doc":"","ref":"Bonfire.Social.Edges.html#get!/4"},{"type":"function","title":"Bonfire.Social.Edges.insert/3","doc":"Inserts a changeset with optional subject and object.","ref":"Bonfire.Social.Edges.html#insert/3"},{"type":"function","title":"Examples - Bonfire.Social.Edges.insert/3","doc":"iex> insert(%Changeset{}, %User{id: 1}, %Post{id: 2})\n {:ok, %Edge{}}","ref":"Bonfire.Social.Edges.html#insert/3-examples"},{"type":"function","title":"Bonfire.Social.Edges.insert/5","doc":"Inserts a new edge with the given schema, subject, verb, and object.","ref":"Bonfire.Social.Edges.html#insert/5"},{"type":"function","title":"Examples - Bonfire.Social.Edges.insert/5","doc":"> insert(MySchema, %User{id: 1}, :like, %Post{id: 2}, [])\n {:ok, %Edge{}}","ref":"Bonfire.Social.Edges.html#insert/5-examples"},{"type":"function","title":"Bonfire.Social.Edges.last/4","doc":"Retrieves the last edge of a given type, subject, and object from the database.","ref":"Bonfire.Social.Edges.html#last/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.last/4","doc":"iex> last(MySchema, %User{id: 1}, %Post{id: 2}, [])","ref":"Bonfire.Social.Edges.html#last/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.last_date/4","doc":"Retrieves the date of the last edge of a given type, subject, and object from the database.","ref":"Bonfire.Social.Edges.html#last_date/4"},{"type":"function","title":"Examples - Bonfire.Social.Edges.last_date/4","doc":"> last_date(:like, %User{id: 1}, %Post{id: 2}, [])\n ~N[2023-07-25 12:34:56]","ref":"Bonfire.Social.Edges.html#last_date/4-examples"},{"type":"function","title":"Bonfire.Social.Edges.put_edge_assoc/3","doc":"","ref":"Bonfire.Social.Edges.html#put_edge_assoc/3"},{"type":"function","title":"Bonfire.Social.Edges.put_edge_assoc/4","doc":"","ref":"Bonfire.Social.Edges.html#put_edge_assoc/4"},{"type":"function","title":"Bonfire.Social.Edges.query/2","doc":"TODOC","ref":"Bonfire.Social.Edges.html#query/2"},{"type":"function","title":"Bonfire.Social.Edges.query_parent/3","doc":"TODOC","ref":"Bonfire.Social.Edges.html#query_parent/3"},{"type":"module","title":"Bonfire.Social.Fake","doc":"","ref":"Bonfire.Social.Fake.html"},{"type":"function","title":"Bonfire.Social.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Social.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Social.FeedActivities","doc":"Helpers to create or query a feed's activities.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.FeedPublish`, which has two foreign fields:\n- id (of the activity, see `Bonfire.Social.Activities`)\n- feed (see `Bonfire.Social.Feeds`)","ref":"Bonfire.Social.FeedActivities.html"},{"type":"function","title":"Bonfire.Social.FeedActivities.cast/2","doc":"Casts the changeset to publish an activity to the given feed IDs.","ref":"Bonfire.Social.FeedActivities.html#cast/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.cast/2","doc":"> cast(changeset, feed_ids)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#cast/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.cast/3","doc":"Casts the changeset to publish an activity to the given creator and feed IDs.","ref":"Bonfire.Social.FeedActivities.html#cast/3"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.cast/3","doc":"> cast(changeset, creator, opts)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#cast/3-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count/2","doc":"Returns the count of items in a feed based on given filters and options.","ref":"Bonfire.Social.FeedActivities.html#count/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.count/2","doc":"iex> count(filters, current_user: me)\n 10","ref":"Bonfire.Social.FeedActivities.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count_subjects/2","doc":"Returns the count of distinct subjects in a feed based on given filters and options.","ref":"Bonfire.Social.FeedActivities.html#count_subjects/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.count_subjects/2","doc":"iex> count_subjects(filters, opts)\n 3","ref":"Bonfire.Social.FeedActivities.html#count_subjects/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.count_total/0","doc":"Returns the total count of activities in feeds.","ref":"Bonfire.Social.FeedActivities.html#count_total/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.delete/1","doc":"Remove activities from feeds, using specific filters","ref":"Bonfire.Social.FeedActivities.html#delete/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.delete/1","doc":"iex> filters = [object_id: \"123\"]\n iex> Bonfire.Social.FeedActivities.delete(filters)\n {5, nil}","ref":"Bonfire.Social.FeedActivities.html#delete/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.delete/2","doc":"Remove one or more activities from all feeds","ref":"Bonfire.Social.FeedActivities.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.delete/2","doc":"iex> Bonfire.Social.FeedActivities.delete(\"123\", :object_id)\n {1, nil}","ref":"Bonfire.Social.FeedActivities.html#delete/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.exclude_object_types/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#exclude_object_types/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed/2","doc":"Gets a feed by id or ids or a thing/things containing an id/ids.","ref":"Bonfire.Social.FeedActivities.html#feed/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed/2","doc":"iex> Bonfire.Social.FeedActivities.feed(\"feed123\", [])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> Bonfire.Social.FeedActivities.feed(:explore, [])\n %{edges: [%{activity: %{}}], page_info: %{}}","ref":"Bonfire.Social.FeedActivities.html#feed/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_contains?/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_contains?/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_contains_single?/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_contains_single?/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_ids_and_opts/2","doc":"Gets feed ids and options for the given feed or list of feeds.","ref":"Bonfire.Social.FeedActivities.html#feed_ids_and_opts/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_ids_and_opts/2","doc":"> feed_ids_and_opts(feed_name, opts)\n {feed_ids, opts}\n\n > feed_ids_and_opts({feed_name, feed_id}, opts)\n\n iex> feed_ids_and_opts(:my, [current_user: me])\n {[\"feed_id1\", \"feed_id2\"], [exclude_verbs: [:flag, :boost, :follow]]}\n\n iex> feed_ids_and_opts({:notifications, \"feed_id3\"}, [current_user: me])\n {\"feed_id3\", [skip_boundary_check: :admins, include_flags: true, exclude_verbs: false, skip_dedup: true, preload: [:notifications]]}","ref":"Bonfire.Social.FeedActivities.html#feed_ids_and_opts/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_many_paginated/2","doc":"Returns paginated results for the given query.","ref":"Bonfire.Social.FeedActivities.html#feed_many_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_many_paginated/2","doc":"> feed_many_paginated(query, opts)\n %{edges: edges, page_info: page_info}","ref":"Bonfire.Social.FeedActivities.html#feed_many_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_name/2","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_name/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_paginated/2","doc":"Returns a page of feed activities (reverse chronological) + pagination metadata \n\nTODO: consolidate with `feed/2`","ref":"Bonfire.Social.FeedActivities.html#feed_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feed_paginated/2","doc":"iex> feed_paginated([], [])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> query = Ecto.Query.from(f in FeedPublish)\n iex> Bonfire.Social.FeedActivities.feed_paginated([], base_query: query)","ref":"Bonfire.Social.FeedActivities.html#feed_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.feed_with_object/3","doc":"","ref":"Bonfire.Social.FeedActivities.html#feed_with_object/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.feeds_for_activity/1","doc":"Gets a list of feed ids this activity was published to from the database.\n\nCurrently only used by the ActivityPub integration.","ref":"Bonfire.Social.FeedActivities.html#feeds_for_activity/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.feeds_for_activity/1","doc":"iex> feeds_for_activity(%{id: id})\n [feed_id1, feed_id2]\n\n iex> feeds_for_activity(id)\n [feed_id1, feed_id2]\n\n iex> feeds_for_activity(activity)\n []","ref":"Bonfire.Social.FeedActivities.html#feeds_for_activity/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.filters_from_opts/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#filters_from_opts/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.get_feed_ids/1","doc":"Computes the feed ids for `get_feed_publishes/2`.\n\nOptions:\n* `:inbox` - list of users/characters whose inbox we should attempt to insert into.\n* `:outbox` - list of users/characters whose outbox we should attempt to insert into.\n* `:notifications` - list of users/characters whose notifications we should attempt to insert into.\n* `:feeds` - list of ids (or objects containing IDs) of feeds to post to.","ref":"Bonfire.Social.FeedActivities.html#get_feed_ids/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.get_feed_ids/1","doc":"iex> options = [outbox: [%{id: \"author123\"}], inbox: [%{id: \"mention987\"}], notifications: [%{id: \"reply654\"}], feeds: [\"feed456\"]]\n iex> Bonfire.Social.FeedActivities.get_feed_ids(options)\n [\"inbox_feed_id_for_user123\", \"feed456\"]","ref":"Bonfire.Social.FeedActivities.html#get_feed_ids/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.get_feed_publishes/1","doc":"Creates the underlying data for `put_feed_publishes/2`.\n\nOptions: see `get_feed_ids/1`","ref":"Bonfire.Social.FeedActivities.html#get_feed_publishes/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.get_feed_publishes/1","doc":"iex> options = [feeds: [\"feed123\", \"feed456\"]]\n iex> Bonfire.Social.FeedActivities.get_feed_publishes(options)\n [%{feed_id: \"feed123\"}, %{feed_id: \"feed456\"}]","ref":"Bonfire.Social.FeedActivities.html#get_feed_publishes/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.mark_all_seen/2","doc":"Marks all unseen items in a feed as seen for the current user.","ref":"Bonfire.Social.FeedActivities.html#mark_all_seen/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.mark_all_seen/2","doc":"iex> mark_all_seen(feed_id, current_user: me)\n {:ok, number_of_marked_items}","ref":"Bonfire.Social.FeedActivities.html#mark_all_seen/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.maybe_feed_publish/5","doc":"Creates a new local activity or takes an existing one and publishes to specified feeds","ref":"Bonfire.Social.FeedActivities.html#maybe_feed_publish/5"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.maybe_feed_publish/5","doc":"iex> subject = %{id: \"user123\"}\n iex> verb = :create\n iex> object = %{id: \"post456\"}\n iex> feeds = [\"feed789\"]\n iex> opts = []\n iex> Bonfire.Social.FeedActivities.maybe_feed_publish(subject, verb, object, feeds, opts)\n {:ok, %Bonfire.Data.Social.Activity{}}","ref":"Bonfire.Social.FeedActivities.html#maybe_feed_publish/5-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.my_feed/2","doc":"Gets a user's home feed, a combination of all feeds the user is subscribed to.","ref":"Bonfire.Social.FeedActivities.html#my_feed/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.my_feed/2","doc":"iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: \"user123\"}])\n %{edges: [%{activity: %{}}], page_info: %{}}\n\n iex> Bonfire.Social.FeedActivities.my_feed([current_user: %{id: \"user123\"}], [\"feed_id1\", \"feed_id2\"])\n %{edges: [%{activity: %{}}], page_info: %{}}","ref":"Bonfire.Social.FeedActivities.html#my_feed/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.publish/4","doc":"Creates a new local activity and publishes to appropriate feeds\nTODO: make this re-use the changeset-based code like in Epics instead of duplicating logic (currently it is only used in VF extension anyway)","ref":"Bonfire.Social.FeedActivities.html#publish/4"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.publish/4","doc":"iex> subject = %{id: \"user123\"}\n iex> verb = :create\n iex> object = %{id: \"post456\"}\n iex> Bonfire.Social.FeedActivities.publish(subject, verb, object, [])\n {:ok, %Bonfire.Data.Social.Activity{}}","ref":"Bonfire.Social.FeedActivities.html#publish/4-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.put_feed_publishes/2","doc":"Arranges for an insert changeset to also publish to feeds related to some objects.\n\nOptions: see `get_feed_ids/1`","ref":"Bonfire.Social.FeedActivities.html#put_feed_publishes/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.put_feed_publishes/2","doc":"iex> changeset = %Ecto.Changeset{}\n iex> options = [feeds: [\"feed123\", \"feed456\"]]\n iex> Bonfire.Social.FeedActivities.put_feed_publishes(changeset, options)\n %Ecto.Changeset{}","ref":"Bonfire.Social.FeedActivities.html#put_feed_publishes/2-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.query/3","doc":"Return a boundarised query for a feed","ref":"Bonfire.Social.FeedActivities.html#query/3"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_extras_boundarised/2","doc":"add assocs needed in timelines/feeds","ref":"Bonfire.Social.FeedActivities.html#query_extras_boundarised/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_module/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#query_module/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.query_object_extras_boundarised/2","doc":"add assocs needed in lists of objects","ref":"Bonfire.Social.FeedActivities.html#query_object_extras_boundarised/2"},{"type":"function","title":"Bonfire.Social.FeedActivities.schema_module/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.skip_verbs_default/0","doc":"","ref":"Bonfire.Social.FeedActivities.html#skip_verbs_default/0"},{"type":"function","title":"Bonfire.Social.FeedActivities.the_object/1","doc":"","ref":"Bonfire.Social.FeedActivities.html#the_object/1"},{"type":"function","title":"Bonfire.Social.FeedActivities.to_feed_options/1","doc":"Converts socket, assigns, or options to feed options.","ref":"Bonfire.Social.FeedActivities.html#to_feed_options/1"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.to_feed_options/1","doc":"> assigns = %{exclude_verbs: [:flag, :boost]}\n > to_feed_options(assigns)\n [exclude_verbs: [:flag, :boost, :follow]]","ref":"Bonfire.Social.FeedActivities.html#to_feed_options/1-examples"},{"type":"function","title":"Bonfire.Social.FeedActivities.unseen_count/2","doc":"Returns the count of unseen items in a feed for the current user.","ref":"Bonfire.Social.FeedActivities.html#unseen_count/2"},{"type":"function","title":"Examples - Bonfire.Social.FeedActivities.unseen_count/2","doc":"iex> unseen_count(feed_id, current_user: me)\n 5","ref":"Bonfire.Social.FeedActivities.html#unseen_count/2-examples"},{"type":"module","title":"Bonfire.Social.Feeds","doc":"Helpers to create or query (though that's usually done through `Bonfire.Social.FeedActivities`) feeds.\n\nThis is the [context](https://hexdocs.pm/phoenix/contexts.html) for `Bonfire.Data.Social.Feed`, a virtual schema with just one field:\n- id","ref":"Bonfire.Social.Feeds.html"},{"type":"function","title":"Bonfire.Social.Feeds.admin_notifications/1","doc":"","ref":"Bonfire.Social.Feeds.html#admin_notifications/1"},{"type":"function","title":"Bonfire.Social.Feeds.admins_notifications/0","doc":"Retrieves the notifications feed IDs for all admins.","ref":"Bonfire.Social.Feeds.html#admins_notifications/0"},{"type":"function","title":"Bonfire.Social.Feeds.admins_notifications/1","doc":"Retrieves the notifications feed IDs for the provided admin(s).","ref":"Bonfire.Social.Feeds.html#admins_notifications/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.admins_notifications/1","doc":"","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-examples"},{"type":"function","title":"For an admin: - Bonfire.Social.Feeds.admins_notifications/1","doc":"> Bonfire.Social.Feeds.admin_notifications(admin)\n # Notifications feed ID for the admin","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-for-an-admin"},{"type":"function","title":"For a list of admins: - Bonfire.Social.Feeds.admins_notifications/1","doc":"> Bonfire.Social.Feeds.admins_notifications([admin1, admin2])\n # List of notifications feed IDs for the admins","ref":"Bonfire.Social.Feeds.html#admins_notifications/1-for-a-list-of-admins"},{"type":"function","title":"Bonfire.Social.Feeds.feed_id/2","doc":"Gets the feed ID for a given feed name and subject.","ref":"Bonfire.Social.Feeds.html#feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_id/2-examples"},{"type":"function","title":"For a character: - Bonfire.Social.Feeds.feed_id/2","doc":"> Bonfire.Social.Feeds.feed_id(:notifications, character)\n # Feed ID for notifications of the character","ref":"Bonfire.Social.Feeds.html#feed_id/2-for-a-character"},{"type":"function","title":"For a binary feed name: - Bonfire.Social.Feeds.feed_id/2","doc":"> Bonfire.Social.Feeds.feed_id(\"notifications\", subject)\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#feed_id/2-for-a-binary-feed-name"},{"type":"function","title":"Bonfire.Social.Feeds.feed_id!/2","doc":"Gets the feed ID for a given feed name and subject, raising an error if not found.","ref":"Bonfire.Social.Feeds.html#feed_id!/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_id!/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_id!/2-examples"},{"type":"function","title":"For a valid feed: - Bonfire.Social.Feeds.feed_id!/2","doc":"> Bonfire.Social.Feeds.feed_id!(:notifications, subject)\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#feed_id!/2-for-a-valid-feed"},{"type":"function","title":"For an invalid feed: - Bonfire.Social.Feeds.feed_id!/2","doc":"> Bonfire.Social.Feeds.feed_id!(:invalid, subject)\n ** (RuntimeError) Expected feed name and user or character, got :invalid","ref":"Bonfire.Social.Feeds.html#feed_id!/2-for-an-invalid-feed"},{"type":"function","title":"Bonfire.Social.Feeds.feed_ids/2","doc":"Retrieves a list of feed IDs based on the feed name and subjects.","ref":"Bonfire.Social.Feeds.html#feed_ids/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_ids/2","doc":"","ref":"Bonfire.Social.Feeds.html#feed_ids/2-examples"},{"type":"function","title":"For a list of subjects: - Bonfire.Social.Feeds.feed_ids/2","doc":"> Bonfire.Social.Feeds.feed_ids(:notifications, [subject1, subject2])\n # List of notification feed IDs for the subjects","ref":"Bonfire.Social.Feeds.html#feed_ids/2-for-a-list-of-subjects"},{"type":"function","title":"For a single subject: - Bonfire.Social.Feeds.feed_ids/2","doc":"> Bonfire.Social.Feeds.feed_ids(:notifications, subject)\n [feed_id]","ref":"Bonfire.Social.Feeds.html#feed_ids/2-for-a-single-subject"},{"type":"function","title":"Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"Determines the feed IDs to publish based on the provided parameters.\n\nTODO: de-duplicate `feed_ids_to_publish/4` and `target_feeds/3`","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-examples"},{"type":"function","title":"When called with the `\"admins\"` boundary: - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"iex> Bonfire.Social.Feeds.feed_ids_to_publish(nil, \"admins\", nil)\n # List of admin feed IDS","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-when-called-with-the-admins-boundary"},{"type":"function","title":"When called with a different boundary and some optional feeds: - Bonfire.Social.Feeds.feed_ids_to_publish/4","doc":"> Bonfire.Social.Feeds.feed_ids_to_publish(me, \"public\", %{reply_to: true}, [some_feed_id])\n # List of feed IDs for the provided boundary","ref":"Bonfire.Social.Feeds.html#feed_ids_to_publish/4-when-called-with-a-different-boundary-and-some-optional-feeds"},{"type":"function","title":"Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"Gets the inbox feed ID of the creator of the given object.","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1-examples"},{"type":"function","title":"For an object: - Bonfire.Social.Feeds.inbox_of_obj_creator/1","doc":"> Bonfire.Social.Feeds.inbox_of_obj_creator(object)\n # Inbox feed ID of the object's creator","ref":"Bonfire.Social.Feeds.html#inbox_of_obj_creator/1-for-an-object"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_create_feed/2","doc":"Creates a feed for the given subject if it doesn't already exist.","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-examples"},{"type":"function","title":"For a new feed: - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"> Bonfire.Social.Feeds.maybe_create_feed(:notifications, subject)\n {:ok, feed_id}","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-for-a-new-feed"},{"type":"function","title":"For an existing feed: - Bonfire.Social.Feeds.maybe_create_feed/2","doc":"> Bonfire.Social.Feeds.maybe_create_feed(:notifications, existing_subject)\n {:ok, existing_feed_id}","ref":"Bonfire.Social.Feeds.html#maybe_create_feed/2-for-an-existing-feed"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"Checks if a creator notification should be sent for a subject.","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-examples"},{"type":"function","title":"When creator is different: - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"> Bonfire.Social.Feeds.maybe_creator_notification(subject, other_creator)\n [{:notifications, other_creator}]","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-when-creator-is-different"},{"type":"function","title":"When creator is the same: - Bonfire.Social.Feeds.maybe_creator_notification/3","doc":"> Bonfire.Social.Feeds.maybe_creator_notification(subject, subject)\n []","ref":"Bonfire.Social.Feeds.html#maybe_creator_notification/3-when-creator-is-the-same"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"Retrieves custom feeds if specified in the options.","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1-examples"},{"type":"function","title":"With custom feeds specified: - Bonfire.Social.Feeds.maybe_custom_feeds/1","doc":"iex> Bonfire.Social.Feeds.maybe_custom_feeds(to_feeds: [custom_feed_id])\n [custom_feed_id]","ref":"Bonfire.Social.Feeds.html#maybe_custom_feeds/1-with-custom-feeds-specified"},{"type":"function","title":"Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"Returns the feed ID of the outbox depending on the boundary.","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-examples"},{"type":"function","title":"When the boundary is `\"public\"`: - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, \"public\")\n # Feed ID of the outbox","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-when-the-boundary-is-public"},{"type":"function","title":"When the boundary is `\"mentions\"` or `\"admins\"`: - Bonfire.Social.Feeds.maybe_my_outbox_feed_id/2","doc":"> Bonfire.Social.Feeds.maybe_my_outbox_feed_id(me, \"mentions\")\n nil","ref":"Bonfire.Social.Feeds.html#maybe_my_outbox_feed_id/2-when-the-boundary-is-mentions-or-admins"},{"type":"function","title":"Bonfire.Social.Feeds.my_feed_id/2","doc":"Retrieves the feed ID for a given type and subject.","ref":"Bonfire.Social.Feeds.html#my_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.my_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#my_feed_id/2-examples"},{"type":"function","title":"For a user: - Bonfire.Social.Feeds.my_feed_id/2","doc":"> Bonfire.Social.Feeds.my_feed_id(:notifications, user)\n # Feed ID for notifications of the user","ref":"Bonfire.Social.Feeds.html#my_feed_id/2-for-a-user"},{"type":"function","title":"Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"Generates the home feed IDs for a user, including extra feeds if specified.","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-examples"},{"type":"function","title":"With socket options and extra feeds: - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"> Bonfire.Social.Feeds.my_home_feed_ids(socket_or_opts, [extra_feed_id])\n # List of home feed IDs including extra feeds","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-with-socket-options-and-extra-feeds"},{"type":"function","title":"Without socket options: - Bonfire.Social.Feeds.my_home_feed_ids/2","doc":"> Bonfire.Social.Feeds.my_home_feed_ids(_, [extra_feed_id])\n # List of home feed IDs including extra feeds","ref":"Bonfire.Social.Feeds.html#my_home_feed_ids/2-without-socket-options"},{"type":"function","title":"Bonfire.Social.Feeds.named_feed_id/2","doc":"Gets the feed ID for a named feed.","ref":"Bonfire.Social.Feeds.html#named_feed_id/2"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.named_feed_id/2","doc":"","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-examples"},{"type":"function","title":"For an existing named feed: - Bonfire.Social.Feeds.named_feed_id/2","doc":"iex> Bonfire.Social.Feeds.named_feed_id(:notifications, [])\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-for-an-existing-named-feed"},{"type":"function","title":"For a binary name: - Bonfire.Social.Feeds.named_feed_id/2","doc":"iex> Bonfire.Social.Feeds.named_feed_id(\"notifications\", [])\n # Feed ID for notifications","ref":"Bonfire.Social.Feeds.html#named_feed_id/2-for-a-binary-name"},{"type":"function","title":"Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"Generates a list of notification feed IDs based on mentions and replies.","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-examples"},{"type":"function","title":"When there are mentions and a reply to creator: - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, \"public\", [\"mention1\"], \"creator_id\")\n # List of notification feed IDs","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-when-there-are-mentions-and-a-reply-to-creator"},{"type":"function","title":"When no mentions and no reply to creator: - Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds/5","doc":"> Bonfire.Social.Feeds.reply_and_or_mentions_notifications_feeds(me, \"local\", [], nil)\n # List of notification feed IDs for local boundary","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_notifications_feeds/5-when-no-mentions-and-no-reply-to-creator"},{"type":"function","title":"Bonfire.Social.Feeds.reply_and_or_mentions_to_notify/5","doc":"","ref":"Bonfire.Social.Feeds.html#reply_and_or_mentions_to_notify/5"},{"type":"function","title":"Bonfire.Social.Feeds.schema_module/0","doc":"","ref":"Bonfire.Social.Feeds.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Feeds.target_feeds/3","doc":"Determines the target feeds for a given changeset, creator, and options.\n\nTODO: de-duplicate `feed_ids_to_publish/4` and `target_feeds/3`","ref":"Bonfire.Social.Feeds.html#target_feeds/3"},{"type":"function","title":"Examples - Bonfire.Social.Feeds.target_feeds/3","doc":"","ref":"Bonfire.Social.Feeds.html#target_feeds/3-examples"},{"type":"function","title":"When given a changeset: - Bonfire.Social.Feeds.target_feeds/3","doc":"> Bonfire.Social.Feeds.target_feeds(changeset, creator, opts)\n # List of target feed IDs based on the changeset","ref":"Bonfire.Social.Feeds.html#target_feeds/3-when-given-a-changeset"},{"type":"function","title":"When given an object: - Bonfire.Social.Feeds.target_feeds/3","doc":"> Bonfire.Social.Feeds.target_feeds(object, creator, opts)\n # List of target feed IDs based on the object","ref":"Bonfire.Social.Feeds.html#target_feeds/3-when-given-an-object"},{"type":"type","title":"Bonfire.Social.Feeds.feed_name/0","doc":"Names a predefined feed attached to a user","ref":"Bonfire.Social.Feeds.html#t:feed_name/0"},{"type":"module","title":"Bonfire.Social.Feeds.LiveHandler","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.actions_update_many/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#actions_update_many/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.activity_update_many/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#activity_update_many/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.assign_feed/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#assign_feed/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_assigns_maybe_async/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_assigns_maybe_async/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_assigns_non_live/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_assigns_non_live/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_default_assigns/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_default_assigns/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_extra_preloads_list/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_extra_preloads_list/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.feed_live_update_many_preloads?/0","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#feed_live_update_many_preloads?/0"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_info/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_info/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.insert_feed/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#insert_feed/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.load_user_feed_assigns/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#load_user_feed_assigns/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.load_user_feed_assigns/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#load_user_feed_assigns/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.object_preloads/0","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#object_preloads/0"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_feed/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_feed/4"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_fetch_assign_default/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_fetch_assign_default/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.paginate_opts/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#paginate_opts/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.preload_activity_and_object_assocs/3","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#preload_activity_and_object_assocs/3"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.remove_activity/1","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#remove_activity/1"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.reply_to_activity/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#reply_to_activity/2"},{"type":"macro","title":"Bonfire.Social.Feeds.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Feeds.LiveHandler.user_feed_assign_or_load_async/4","doc":"","ref":"Bonfire.Social.Feeds.LiveHandler.html#user_feed_assign_or_load_async/4"},{"type":"module","title":"Bonfire.Social.Flags","doc":"Flagging functionality\n\nThis module handles flagging (reporting an activity or object to moderators and/or admins). It includes creating, querying, and managing flags, as well as handling federation through ActivityPub.\n\nFlags are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Flags.html"},{"type":"function","title":"Bonfire.Social.Flags.ap_publish_activity/3","doc":"Publishes a flag activity to ActivityPub.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.ap_publish_activity/3","doc":"- `subject`: The subject (flagger) of the flag.\n- `_verb`: The verb associated with the flag (unused).\n- `flag`: The flag to publish.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.ap_publish_activity/3","doc":"The result of the ActivityPub publish operation.","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.ap_publish_activity/3","doc":"iex> subject = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flag = %Bonfire.Data.Social.Flag{}\n iex> Bonfire.Social.Flags.ap_publish_activity(subject, :flag, flag)\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Flags.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.ap_receive_activity/3","doc":"Receives a flag activity from ActivityPub for multiple objects.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.ap_receive_activity/3","doc":"- `creator`: The creator of the flag.\n- `activity`: The ActivityPub activity.\n- `object`: An object or list of objects to be flagged.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.ap_receive_activity/3","doc":"A tuple containing the result of the flag operation.","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.ap_receive_activity/3","doc":"iex> creator = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> activity = %{data: %{\"type\" => \"Flag\"}}\n iex> objects = [%{pointer_id: \"post456\"}, %{pointer_id: \"post789\"}]\n iex> Bonfire.Social.Flags.ap_receive_activity(creator, activity, objects)\n {:ok, [%Bonfire.Data.Social.Flag{}, %Bonfire.Data.Social.Flag{}]}","ref":"Bonfire.Social.Flags.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.by_flagged/1","doc":"Retrieves flags of a specific flagged object.","ref":"Bonfire.Social.Flags.html#by_flagged/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.by_flagged/1","doc":"- `object`: The object to query flags for.","ref":"Bonfire.Social.Flags.html#by_flagged/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.by_flagged/1","doc":"A list of flags for the given object.","ref":"Bonfire.Social.Flags.html#by_flagged/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.by_flagged/1","doc":"iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.by_flagged(object)\n [%Bonfire.Data.Social.Flag{}, ...]","ref":"Bonfire.Social.Flags.html#by_flagged/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.by_flagger/1","doc":"Retrieves flags created by a specific user.","ref":"Bonfire.Social.Flags.html#by_flagger/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.by_flagger/1","doc":"- `subject`: The flagger to query flags for.","ref":"Bonfire.Social.Flags.html#by_flagger/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.by_flagger/1","doc":"A list of flags created by the subject.","ref":"Bonfire.Social.Flags.html#by_flagger/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.by_flagger/1","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> Bonfire.Social.Flags.by_flagger(flagger)\n [%Bonfire.Data.Social.Flag{}, ...]","ref":"Bonfire.Social.Flags.html#by_flagger/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.federation_module/0","doc":"","ref":"Bonfire.Social.Flags.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Flags.flag/3","doc":"Records a flag.","ref":"Bonfire.Social.Flags.html#flag/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.flag/3","doc":"- `flagger`: The user creating the flag.\n- `flagged`: The object being flagged.\n- `opts`: Additional options (optional).","ref":"Bonfire.Social.Flags.html#flag/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.flag/3","doc":"A tuple containing the created flag or an error.","ref":"Bonfire.Social.Flags.html#flag/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.flag/3","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flagged = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.flag(flagger, flagged)\n {:ok, %Bonfire.Data.Social.Flag{}}","ref":"Bonfire.Social.Flags.html#flag/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.flagged?/2","doc":"Checks if a user has flagged an object.","ref":"Bonfire.Social.Flags.html#flagged?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.flagged?/2","doc":"- `user`: The user to check.\n- `object`: The object to check.","ref":"Bonfire.Social.Flags.html#flagged?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.flagged?/2","doc":"Boolean indicating whether the user has flagged the object.","ref":"Bonfire.Social.Flags.html#flagged?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.flagged?/2","doc":"iex> user = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.flagged?(user, object)\n false","ref":"Bonfire.Social.Flags.html#flagged?/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.get/3","doc":"Retrieves a flag by subject and object.","ref":"Bonfire.Social.Flags.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.get/3","doc":"- `subject`: The subject (flagger) of the flag.\n- `object`: The object being flagged.\n- `opts`: Additional options (optional).","ref":"Bonfire.Social.Flags.html#get/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.get/3","doc":"The flag if found, otherwise an error tuple.","ref":"Bonfire.Social.Flags.html#get/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.get/3","doc":"iex> Bonfire.Social.Flags.get(subject, object)\n {:ok, %Bonfire.Data.Social.Flag{}}","ref":"Bonfire.Social.Flags.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Flags.get!/3","doc":"Retrieves a flag by subject and object, raising an error if not found.","ref":"Bonfire.Social.Flags.html#get!/3"},{"type":"function","title":"Bonfire.Social.Flags.instance_moderators/0","doc":"Retrieves instance moderators.","ref":"Bonfire.Social.Flags.html#instance_moderators/0"},{"type":"function","title":"Returns - Bonfire.Social.Flags.instance_moderators/0","doc":"A list of instance moderators.","ref":"Bonfire.Social.Flags.html#instance_moderators/0-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.instance_moderators/0","doc":"iex> Bonfire.Social.Flags.instance_moderators()\n [%Bonfire.Data.Identity.User{}, ...]","ref":"Bonfire.Social.Flags.html#instance_moderators/0-examples"},{"type":"function","title":"Bonfire.Social.Flags.list/1","doc":"Lists flags based on given options.","ref":"Bonfire.Social.Flags.html#list/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list/1","doc":"A paginated list of flags.","ref":"Bonfire.Social.Flags.html#list/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list/1","doc":"iex> Bonfire.Social.Flags.list(scope: :instance)\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_by/2","doc":"Lists flags created by a specific user.","ref":"Bonfire.Social.Flags.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_by/2","doc":"- `by_user`: The user or user ID to filter flags by.\n- `opts`: Options for filtering and pagination (optional).","ref":"Bonfire.Social.Flags.html#list_by/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_by/2","doc":"A paginated list of flags created by the specified user.","ref":"Bonfire.Social.Flags.html#list_by/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_by/2","doc":"iex> Bonfire.Social.Flags.list_by(\"user123\")\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_my/1","doc":"Lists flags created by the current user.","ref":"Bonfire.Social.Flags.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_my/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list_my/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_my/1","doc":"A paginated list of flags created by the current user.","ref":"Bonfire.Social.Flags.html#list_my/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_my/1","doc":"iex> Bonfire.Social.Flags.list_my(current_user: %Bonfire.Data.Identity.User{id: \"user123\"})\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_of/2","doc":"Lists flags for a specific object.","ref":"Bonfire.Social.Flags.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_of/2","doc":"- `object`: The object or object ID to filter flags by.\n- `opts`: Options for filtering and pagination (optional).","ref":"Bonfire.Social.Flags.html#list_of/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_of/2","doc":"A paginated list of flags for the specified object.","ref":"Bonfire.Social.Flags.html#list_of/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_of/2","doc":"iex> Bonfire.Social.Flags.list_of(\"post456\")\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{}, ...]}","ref":"Bonfire.Social.Flags.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Flags.list_paginated/2","doc":"","ref":"Bonfire.Social.Flags.html#list_paginated/2"},{"type":"function","title":"Bonfire.Social.Flags.list_preloaded/1","doc":"Lists flags with preloaded associations.","ref":"Bonfire.Social.Flags.html#list_preloaded/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.list_preloaded/1","doc":"- `opts`: Options for filtering and pagination.","ref":"Bonfire.Social.Flags.html#list_preloaded/1-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.list_preloaded/1","doc":"A paginated list of flags with preloaded associations.","ref":"Bonfire.Social.Flags.html#list_preloaded/1-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.list_preloaded/1","doc":"iex> Bonfire.Social.Flags.list_preloaded(scope: :instance)\n %{page_info: %{}, edges: [%Bonfire.Data.Social.Flag{object: %{created: %{creator: %{}}}}, ...]}","ref":"Bonfire.Social.Flags.html#list_preloaded/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.moderators/1","doc":"Retrieves moderators for a given object.","ref":"Bonfire.Social.Flags.html#moderators/1"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.moderators/1","doc":"- `object`: The object to find moderators for.","ref":"Bonfire.Social.Flags.html#moderators/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Flags.moderators/1","doc":"iex> object = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.moderators(object)","ref":"Bonfire.Social.Flags.html#moderators/1-examples"},{"type":"function","title":"Bonfire.Social.Flags.query/2","doc":"","ref":"Bonfire.Social.Flags.html#query/2"},{"type":"function","title":"Bonfire.Social.Flags.query_module/0","doc":"","ref":"Bonfire.Social.Flags.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Flags.schema_module/0","doc":"","ref":"Bonfire.Social.Flags.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Flags.unflag/2","doc":"Removes a flag created by a specific user on an object, if one exists.","ref":"Bonfire.Social.Flags.html#unflag/2"},{"type":"function","title":"Parameters - Bonfire.Social.Flags.unflag/2","doc":"- `flagger`: The user who created the flag.\n- `flagged`: The flagged object or ID.","ref":"Bonfire.Social.Flags.html#unflag/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Flags.unflag/2","doc":"The result of the unflag operation.","ref":"Bonfire.Social.Flags.html#unflag/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Flags.unflag/2","doc":"iex> flagger = %Bonfire.Data.Identity.User{id: \"user123\"}\n iex> flagged = %Bonfire.Data.Social.Post{id: \"post456\"}\n iex> Bonfire.Social.Flags.unflag(flagger, flagged)\n :ok","ref":"Bonfire.Social.Flags.html#unflag/2-examples"},{"type":"module","title":"Bonfire.Social.Flags.LiveHandler","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Flags.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Flags.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Flags.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Graph","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Following\n- Follow Requests\n- Social graph analysis","ref":"Bonfire.Social.Graph.html"},{"type":"module","title":"Handy commands - Bonfire.Social.Graph","doc":"","ref":"Bonfire.Social.Graph.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Social.Graph","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.Graph.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Social.Graph.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Social.Graph.html#child_spec/1"},{"type":"function","title":"Bonfire.Social.Graph.graph_add/3","doc":"Adds a relationship to the graph.","ref":"Bonfire.Social.Graph.html#graph_add/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_add/3","doc":"iex> Bonfire.Social.Graph.graph_add(\"subject_id\", \"object_id\", \"type\")\n :ok","ref":"Bonfire.Social.Graph.html#graph_add/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_clear/0","doc":"Clears the graph database by deleting all nodes and relationships. Use with care!","ref":"Bonfire.Social.Graph.html#graph_clear/0"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_clear/0","doc":"iex> Bonfire.Social.Graph.graph_clear()\n :ok","ref":"Bonfire.Social.Graph.html#graph_clear/0-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_conn/0","doc":"Retrieves the graph DB connection.","ref":"Bonfire.Social.Graph.html#graph_conn/0"},{"type":"function","title":"Bonfire.Social.Graph.graph_distance/2","doc":"Calculates the distance between two nodes in the graph.","ref":"Bonfire.Social.Graph.html#graph_distance/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_distance/2","doc":"iex> Bonfire.Social.Graph.graph_distance(\"subject_id\", \"object_id\")\n {:ok, length}","ref":"Bonfire.Social.Graph.html#graph_distance/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_distances/1","doc":"Retrieves distances from a given subject to all other nodes.","ref":"Bonfire.Social.Graph.html#graph_distances/1"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_distances/1","doc":"iex> Bonfire.Social.Graph.graph_distances(\"subject_id\")\n [{id, length}]","ref":"Bonfire.Social.Graph.html#graph_distances/1-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_query/2","doc":"Executes a query on the graph database.","ref":"Bonfire.Social.Graph.html#graph_query/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_query/2","doc":"iex> Bonfire.Social.Graph.graph_query(\"MATCH (n) RETURN n\")\n {:ok, result}","ref":"Bonfire.Social.Graph.html#graph_query/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.graph_remove/3","doc":"Removes a relationship from the graph.","ref":"Bonfire.Social.Graph.html#graph_remove/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.graph_remove/3","doc":"iex> Bonfire.Social.Graph.graph_remove(\"subject_id\", \"object_id\", \"type\")\n :ok","ref":"Bonfire.Social.Graph.html#graph_remove/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.init/1","doc":"Initializes the GenServer and calls `init_and_load/0`","ref":"Bonfire.Social.Graph.html#init/1"},{"type":"function","title":"Bonfire.Social.Graph.init_and_load/0","doc":"Initializes the graph DB and calls `load_from_db/0`","ref":"Bonfire.Social.Graph.html#init_and_load/0"},{"type":"function","title":"Bonfire.Social.Graph.load_from_db/0","doc":"Loads follows from the SQL DB and stores them the in-memory graph DB.","ref":"Bonfire.Social.Graph.html#load_from_db/0"},{"type":"function","title":"Bonfire.Social.Graph.maybe_applications/0","doc":"Retrieves the possible applications to be started based on configuration.\n\nReturns a list of OTP applications (including the `Bolt.Sips` Neo4j driver to connect to the graph database) or an empty list if disabled.","ref":"Bonfire.Social.Graph.html#maybe_applications/0"},{"type":"function","title":"Bonfire.Social.Graph.start_link/1","doc":"Starts the GenServer link.","ref":"Bonfire.Social.Graph.html#start_link/1"},{"type":"module","title":"Bonfire.Social.Graph.Aliases","doc":"Implements aliases (i.e. \"also known as\") for characters in Bonfire.\n\nThis module provides functionality for managing aliases, including adding,\nremoving, and querying aliases. It also implements ActivityPub federation\nfor the \"Move\" activity.","ref":"Bonfire.Social.Graph.Aliases.html"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.add/3","doc":"Adds an alias to a user, linking it to a another character.","ref":"Bonfire.Social.Graph.Aliases.html#add/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.add/3","doc":"iex> Bonfire.Social.Graph.Aliases.add(user, target)\n {:ok, %Alias{}}","ref":"Bonfire.Social.Graph.Aliases.html#add/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_by_object/2","doc":"Retrieves all aliases for a given object (i.e target).","ref":"Bonfire.Social.Graph.Aliases.html#all_by_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_by_object/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_by_object(object)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_by_subject/2","doc":"Retrieves all aliases for a given subject.","ref":"Bonfire.Social.Graph.Aliases.html#all_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_by_subject/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_by_subject(user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_objects_by_subject/2","doc":"Retrieves all aliased objects for a given subject.","ref":"Bonfire.Social.Graph.Aliases.html#all_objects_by_subject/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_objects_by_subject/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_objects_by_subject(user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.all_subjects_by_object/2","doc":"Retrieves all alias subjects for a given object (i.e target).","ref":"Bonfire.Social.Graph.Aliases.html#all_subjects_by_object/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.all_subjects_by_object/2","doc":"iex> Bonfire.Social.Graph.Aliases.all_subjects_by_object(object)\n [%Subject{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#all_subjects_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.also_known_as?/2","doc":"Checks if a local user is also known as the target.","ref":"Bonfire.Social.Graph.Aliases.html#also_known_as?/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.also_known_as?/2","doc":"iex> Bonfire.Social.Graph.Aliases.also_known_as?(\"http://example.com/user\", target)\n true\n\n iex> Bonfire.Social.Graph.Aliases.also_known_as?(%User{}, target)\n true","ref":"Bonfire.Social.Graph.Aliases.html#also_known_as?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a move operation.","ref":"Bonfire.Social.Graph.Aliases.html#ap_publish_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.ap_publish_activity/3","doc":"iex> Bonfire.Social.Graph.Aliases.ap_publish_activity(subject, :move, target)","ref":"Bonfire.Social.Graph.Aliases.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.ap_receive_activity/3","doc":"Processes an incoming ActivityPub Move activity.","ref":"Bonfire.Social.Graph.Aliases.html#ap_receive_activity/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.ap_receive_activity/3","doc":"iex> Bonfire.Social.Graph.Aliases.ap_receive_activity(subject, activity, origin_object)\n {:ok, :moved}","ref":"Bonfire.Social.Graph.Aliases.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.exists?/2","doc":"Checks if an alias relationship exists between a subject and a target.","ref":"Bonfire.Social.Graph.Aliases.html#exists?/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.exists?/2","doc":"iex> Bonfire.Social.Graph.Aliases.exists?(subject, target)\n true","ref":"Bonfire.Social.Graph.Aliases.html#exists?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.federation_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.get/3","doc":"Retrieves an alias between a subject and an object, if one exists","ref":"Bonfire.Social.Graph.Aliases.html#get/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.get/3","doc":"iex> Bonfire.Social.Graph.Aliases.get(subject, object)\n {:ok, %Alias{}}","ref":"Bonfire.Social.Graph.Aliases.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.get!/3","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#get!/3"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_aliased/2","doc":"Lists entities who aliased a a given user.","ref":"Bonfire.Social.Graph.Aliases.html#list_aliased/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_aliased/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_aliased(user)\n [%AliasedEntity{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_aliased/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_aliases/2","doc":"Lists aliases for a given user.","ref":"Bonfire.Social.Graph.Aliases.html#list_aliases/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_aliases/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_aliases(user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_aliases/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_my_aliased/2","doc":"Lists entities who aliased the current user.","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliased/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_my_aliased/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_my_aliased(current_user)\n [%AliasedEntity{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliased/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.list_my_aliases/2","doc":"Lists aliases for the current user.","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliases/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.list_my_aliases/2","doc":"iex> Bonfire.Social.Graph.Aliases.list_my_aliases(current_user)\n [%Alias{}, ...]","ref":"Bonfire.Social.Graph.Aliases.html#list_my_aliases/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.move/2","doc":"Initiates a move operation for migrating a local user to another instance.","ref":"Bonfire.Social.Graph.Aliases.html#move/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.move/2","doc":"iex> Bonfire.Social.Graph.Aliases.move(subject, target)\n {:ok, :moved}","ref":"Bonfire.Social.Graph.Aliases.html#move/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.query/2","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#query/2"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.query_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.remove/2","doc":"Removes an alias relationship between a user and a target.","ref":"Bonfire.Social.Graph.Aliases.html#remove/2"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Aliases.remove/2","doc":"iex> Bonfire.Social.Graph.Aliases.remove(user, target)","ref":"Bonfire.Social.Graph.Aliases.html#remove/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.schema_module/0","doc":"","ref":"Bonfire.Social.Graph.Aliases.html#schema_module/0"},{"type":"module","title":"Bonfire.Social.Graph.Aliases.LiveHandler","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Graph.Aliases.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Graph.Aliases.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Graph.Aliases.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Graph.Fake","doc":"","ref":"Bonfire.Social.Graph.Fake.html"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_incoming_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_incoming_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_outgoing_follow!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_outgoing_follow!/0"},{"type":"function","title":"Bonfire.Social.Graph.Fake.fake_remote_user!/0","doc":"","ref":"Bonfire.Social.Graph.Fake.html#fake_remote_user!/0"},{"type":"module","title":"Bonfire.Social.Graph.Follows","doc":"Module for handling follow relationships in the Bonfire social graph.","ref":"Bonfire.Social.Graph.Follows.html"},{"type":"function","title":"Bonfire.Social.Graph.Follows.accept/2","doc":"Accepts a follow request, publishes to feeds and federates.","ref":"Bonfire.Social.Graph.Follows.html#accept/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.accept/2","doc":"- `request`: A `Request` struct or its ID\n- `opts`: Additional options including the current user","ref":"Bonfire.Social.Graph.Follows.html#accept/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.accept/2","doc":"`{:ok, follow}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#accept/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.accept/2","doc":"iex> Bonfire.Social.Graph.Follows.accept(request, current_user: acceptor)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#accept/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.accept_from/2","doc":"Accepts a follow request, publishes to feeds and federates.","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.accept_from/2","doc":"- `subject`: The requester\n- `opts`: Additional options including the current user","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.accept_from/2","doc":"`{:ok, follow}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.accept_from/2","doc":"iex> Bonfire.Social.Graph.Follows.accept_from(requester, current_user: acceptor)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#accept_from/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_by_object/2","doc":"Lists all follows for an object.","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"- `user`: The object whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"List of follows.","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_by_object/2","doc":"iex> Bonfire.Social.Graph.Follows.all_by_object(user)\n [%Follow{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"Lists all follows by a subject.","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"- `user`: The user whose follows to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"List of follows.","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_by_subject/2","doc":"iex> Bonfire.Social.Graph.Follows.all_by_subject(user)\n [%Follow{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"Lists all followed outboxes for a user.","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"- `user`: The user whose followed outboxes to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"List of followed outbox IDs.","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_followed_outboxes/2","doc":"iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user)\n [\"outbox_id_1\", ...]\n\n iex> Bonfire.Social.Graph.Follows.all_followed_outboxes(user, include_followed_categories: true)\n [\"outbox_id_1\", \"category_outbox_id_1\", ...]","ref":"Bonfire.Social.Graph.Follows.html#all_followed_outboxes/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"Lists all objects followed by a subject.","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"- `user`: The user whose followed objects to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_objects_by_subject/2","doc":"iex> Bonfire.Social.Graph.Follows.all_objects_by_subject(user)\n [%FollowedObject{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_objects_by_subject/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"Lists all subjects following an object.","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"- `user`: The object whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"List of follower subjects.","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.all_subjects_by_object/2","doc":"iex> Bonfire.Social.Graph.Follows.all_subjects_by_object(user)\n [%FollowerSubject{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#all_subjects_by_object/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a follow-related action.","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"- `subject`: The subject of the activity\n- `verb`: The verb of the activity (e.g., :delete)\n- `follow`: The follow object or ID","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"`{:ok, activity}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ap_publish_activity/3","doc":"iex> Bonfire.Social.Graph.Follows.ap_publish_activity(user, :delete, follow)\n {:ok, %ActivityPub.Activity{}}","ref":"Bonfire.Social.Graph.Follows.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"Receives and processes an ActivityPub activity related to follows.","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"- `follower`: The follower\n- `activity`: The ActivityPub activity\n- `object`: The object of the activity","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"`{:ok, result}` on success, `{:ignore, reason}` on failure or when ignored.","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ap_receive_activity/3","doc":"iex> Bonfire.Social.Graph.Follows.ap_receive_activity(follower, activity, object)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.federation_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.follow/3","doc":"Follows someone or something. In case of success, publishes to feeds and federates.\n\nIf the user is not permitted to follow the object, or the object is\na remote actor, it will instead send a request to follow.","ref":"Bonfire.Social.Graph.Follows.html#follow/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.follow/3","doc":"- `user`: The user who wants to follow\n- `object`: The object to be followed\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#follow/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.follow/3","doc":"`{:ok, result}` on success, `{:error, reason}` on failure.","ref":"Bonfire.Social.Graph.Follows.html#follow/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.follow/3","doc":"iex> Bonfire.Social.Graph.Follows.follow(me, user2)\n {:ok, %Follow{}}\n\n iex> Bonfire.Social.Graph.Follows.follow(me, user3)\n {:ok, %Request{}}","ref":"Bonfire.Social.Graph.Follows.html#follow/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.following?/2","doc":"Checks if a subject is following an object.","ref":"Bonfire.Social.Graph.Follows.html#following?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.following?/2","doc":"- `subject`: The subject (follower)\n- `object`: The object (followed)","ref":"Bonfire.Social.Graph.Follows.html#following?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.following?/2","doc":"Boolean indicating if the subject is following the object.","ref":"Bonfire.Social.Graph.Follows.html#following?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.following?/2","doc":"iex> Bonfire.Social.Graph.Follows.following?(user, profile)\n true","ref":"Bonfire.Social.Graph.Follows.html#following?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.get/3","doc":"Gets a follow relationship between a subject and an object, if one exists.","ref":"Bonfire.Social.Graph.Follows.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.get/3","doc":"- `subject`: The subject (follower)\n- `object`: The object (followed)\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#get/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.get/3","doc":"`{:ok, follow}` if found, `{:error, :not_found}` otherwise.","ref":"Bonfire.Social.Graph.Follows.html#get/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.get/3","doc":"iex> Bonfire.Social.Graph.Follows.get(user, profile)\n {:ok, %Follow{}}","ref":"Bonfire.Social.Graph.Follows.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.get!/3","doc":"Gets a follow relationship between a subject and an object, raising an error if not found.","ref":"Bonfire.Social.Graph.Follows.html#get!/3"},{"type":"function","title":"Bonfire.Social.Graph.Follows.ignore/2","doc":"Ignores a follow request.","ref":"Bonfire.Social.Graph.Follows.html#ignore/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.ignore/2","doc":"- `request`: The request to ignore\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.ignore/2","doc":"Result of the ignore operation.","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.ignore/2","doc":"iex> Bonfire.Social.Graph.Follows.ignore(request, current_user: user)\n {:ok, ignored_request}","ref":"Bonfire.Social.Graph.Follows.html#ignore/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_followed/2","doc":"Lists followed objects for a given user.","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_followed/2","doc":"- `user`: The user whose followed objects to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_followed/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_followed/2","doc":"iex> Bonfire.Social.Graph.Follows.list_followed(user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_followed/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_followers/2","doc":"Lists followers for a given user.","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_followers/2","doc":"- `user`: The user whose followers to list\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_followers/2","doc":"List of followers.","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_followers/2","doc":"iex> Bonfire.Social.Graph.Follows.list_followers(user)\n [%User{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_followers/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"Lists followed objects for the current user.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"- `current_user`: The current user\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"List of followed objects.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_my_followed/2","doc":"iex> Bonfire.Social.Graph.Follows.list_my_followed(current_user)\n [%Object{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_my_followed/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"Lists followers for the current user.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"- `current_user`: The current user\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"List of followers.","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.list_my_followers/2","doc":"iex> Bonfire.Social.Graph.Follows.list_my_followers(current_user)\n [%User{}, ...]","ref":"Bonfire.Social.Graph.Follows.html#list_my_followers/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.query/2","doc":"Queries follows based on filters and options.","ref":"Bonfire.Social.Graph.Follows.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.query/2","doc":"- `filters`: List of filters to apply to the query\n- `opts`: Additional query options","ref":"Bonfire.Social.Graph.Follows.html#query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.query/2","doc":"An Ecto query for follows.","ref":"Bonfire.Social.Graph.Follows.html#query/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.query/2","doc":"iex> Bonfire.Social.Graph.Follows.query([my: :object], current_user: user)\n # following\n\n iex> Bonfire.Social.Graph.Follows.query([my: :followers], current_user: user)\n # followers","ref":"Bonfire.Social.Graph.Follows.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.query_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.requested?/2","doc":"Checks if a follow request has been made.","ref":"Bonfire.Social.Graph.Follows.html#requested?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.requested?/2","doc":"- `subject`: The subject (requester)\n- `object`: The object (requested)","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.requested?/2","doc":"Boolean indicating if a follow request exists.","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.requested?/2","doc":"iex> Bonfire.Social.Graph.Follows.requested?(user, profile)\n true","ref":"Bonfire.Social.Graph.Follows.html#requested?/2-examples"},{"type":"function","title":"Bonfire.Social.Graph.Follows.schema_module/0","doc":"","ref":"Bonfire.Social.Graph.Follows.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Graph.Follows.unfollow/3","doc":"Unfollows someone or something.","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3"},{"type":"function","title":"Parameters - Bonfire.Social.Graph.Follows.unfollow/3","doc":"- `user`: The user who wants to unfollow\n- `object`: The object to be unfollowed\n- `opts`: Additional options","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Graph.Follows.unfollow/3","doc":"Result of the unfollow operation.","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-returns"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Follows.unfollow/3","doc":"iex> Bonfire.Social.Graph.Follows.unfollow(me, user2)\n {:ok, deleted_follow}","ref":"Bonfire.Social.Graph.Follows.html#unfollow/3-examples"},{"type":"module","title":"Bonfire.Social.Graph.Follows.LiveHandler","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Graph.Follows.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Graph.Follows.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Graph.Follows.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.Graph.Import","doc":"","ref":"Bonfire.Social.Graph.Import.html"},{"type":"function","title":"Bonfire.Social.Graph.Import.import_from_csv_file/3","doc":"Import follows, ghosts, silences, or blocks from a CSV file.","ref":"Bonfire.Social.Graph.Import.html#import_from_csv_file/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.import_from_csv_file/3","doc":"iex> import_from_csv_file(:follows, scope, \"path/to/file.csv\")","ref":"Bonfire.Social.Graph.Import.html#import_from_csv_file/3-examples"},{"type":"function","title":"Bonfire.Social.Graph.Import.perform/1","doc":"Perform the queued job based on the operation and scope.","ref":"Bonfire.Social.Graph.Import.html#perform/1"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.perform/1","doc":"iex> perform(%{args: %{\"op\" => \"follows_import\", \"user_id\" => \"user1\", \"identifier\" => \"id1\"}})\n :ok\n\n iex> perform(%{args: %{\"op\" => \"blocks_import\", \"user_id\" => \"instance_wide\", \"identifier\" => \"id1\"}})\n :ok","ref":"Bonfire.Social.Graph.Import.html#perform/1-examples"},{"type":"function","title":"Bonfire.Social.Graph.Import.perform/3","doc":"Perform an import operation for the scope.","ref":"Bonfire.Social.Graph.Import.html#perform/3"},{"type":"function","title":"Examples - Bonfire.Social.Graph.Import.perform/3","doc":"iex> perform(\"follows_import\", scope, \"identifier\")","ref":"Bonfire.Social.Graph.Import.html#perform/3-examples"},{"type":"module","title":"Bonfire.Social.Graph.Integration","doc":"","ref":"Bonfire.Social.Graph.Integration.html"},{"type":"function","title":"Bonfire.Social.Graph.Integration.declared_extension/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#declared_extension/0"},{"type":"function","title":"Bonfire.Social.Graph.Integration.mailer/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#mailer/0"},{"type":"function","title":"Bonfire.Social.Graph.Integration.repo/0","doc":"","ref":"Bonfire.Social.Graph.Integration.html#repo/0"},{"type":"module","title":"Bonfire.Social.Likes","doc":"Mutate, query, and federate likes (indicating appreciation for an activity or object).\n\nThis module provides functionality to manage and query likes, including creating, deleting, and listing likes.\nIt also handles federation of likes using ActivityPub.\n\nLikes are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Likes.html"},{"type":"function","title":"Bonfire.Social.Likes.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a like.","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.ap_publish_activity/3","doc":"- subject: The subject of the like activity.\n - verb: The verb of the activity (:delete or other).\n - like: The like object.","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.ap_publish_activity/3","doc":"iex> Bonfire.Social.Likes.ap_publish_activity(%User{id: \"user123\"}, :create, %Like{})\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Likes.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.ap_receive_activity/3","doc":"Receives and processes an ActivityPub like activity.","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.ap_receive_activity/3","doc":"- liker: The user performing the like action.\n - activity: The ActivityPub activity data.\n - object: The object being liked.","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.ap_receive_activity/3","doc":"iex> activity = %{data: %{\"type\" => \"Like\"}}\n iex> object = %ActivityPub.Object{}\n iex> Bonfire.Social.Likes.ap_receive_activity(%User{id: \"user123\"}, activity, object)\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#ap_receive_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.by_liked/2","doc":"Lists likes for a specific object.","ref":"Bonfire.Social.Likes.html#by_liked/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.by_liked/2","doc":"- object: The object that was liked.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#by_liked/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.by_liked/2","doc":"iex> Bonfire.Social.Likes.by_liked(%Post{id: \"post456\"})\n [%Like{}, ...]","ref":"Bonfire.Social.Likes.html#by_liked/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.by_liker/2","doc":"Lists likes created by a specific subject.","ref":"Bonfire.Social.Likes.html#by_liker/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.by_liker/2","doc":"- subject: The subject (usually a user) who created the likes.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#by_liker/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.by_liker/2","doc":"iex> Bonfire.Social.Likes.by_liker(%User{id: \"user123\"})\n [%Like{}, ...]","ref":"Bonfire.Social.Likes.html#by_liker/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.count/2","doc":"Counts likes based on filters or for a specific user-object pair.","ref":"Bonfire.Social.Likes.html#count/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.count/2","doc":"- filters: A list of filters to apply when counting likes.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#count/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.count/2","doc":"iex> Bonfire.Social.Likes.count([object: %Post{id: \"post456\"}])\n 5\n\n iex> Bonfire.Social.Likes.count(%User{id: \"user123\"}, %Post{id: \"post456\"})\n 1","ref":"Bonfire.Social.Likes.html#count/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.do_like/3","doc":"","ref":"Bonfire.Social.Likes.html#do_like/3"},{"type":"function","title":"Bonfire.Social.Likes.federation_module/0","doc":"","ref":"Bonfire.Social.Likes.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Likes.get/3","doc":"Retrieves a Like edge between a subject and an object.","ref":"Bonfire.Social.Likes.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.get/3","doc":"- subject: The subject (usually a user) of the Like edge.\n - object: The object that was liked.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.get/3","doc":"iex> Bonfire.Social.Likes.get(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.get!/3","doc":"Similar to `get/3`, but raises an error if the Like edge is not found.","ref":"Bonfire.Social.Likes.html#get!/3"},{"type":"function","title":"Bonfire.Social.Likes.get_or_create_emoji/2","doc":"","ref":"Bonfire.Social.Likes.html#get_or_create_emoji/2"},{"type":"function","title":"Bonfire.Social.Likes.like/3","doc":"Records a like for an object.","ref":"Bonfire.Social.Likes.html#like/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.like/3","doc":"- liker: The user creating the like.\n - object: The object to be liked.\n - opts: Additional options for creating the like (optional).","ref":"Bonfire.Social.Likes.html#like/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.like/3","doc":"iex> Bonfire.Social.Likes.like(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Like{}}","ref":"Bonfire.Social.Likes.html#like/3-examples"},{"type":"function","title":"Bonfire.Social.Likes.liked?/2","doc":"Checks if a user has liked an object.","ref":"Bonfire.Social.Likes.html#liked?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.liked?/2","doc":"- user: The user to check.\n - object: The object to check for likes.","ref":"Bonfire.Social.Likes.html#liked?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.liked?/2","doc":"iex> Bonfire.Social.Likes.liked?(%User{id: \"user123\"}, %Post{id: \"post456\"})\n true","ref":"Bonfire.Social.Likes.html#liked?/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_by/2","doc":"Lists likes created by a specific user.","ref":"Bonfire.Social.Likes.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_by/2","doc":"- by_user: The user whose likes to list.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#list_by/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_by/2","doc":"iex> Bonfire.Social.Likes.list_by(%User{id: \"user123\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_my/1","doc":"List the current user's likes.","ref":"Bonfire.Social.Likes.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_my/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#list_my/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_my/1","doc":"iex> Bonfire.Social.Likes.list_my(current_user: %User{id: \"user123\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_of/2","doc":"Lists likers of a specific object or objects.","ref":"Bonfire.Social.Likes.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.list_of/2","doc":"- object: The object or objects to find likers for.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Likes.html#list_of/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.list_of/2","doc":"iex> Bonfire.Social.Likes.list_of(%Post{id: \"post456\"})\n %{edges: [%Like{}, ...], page_info: %{}}","ref":"Bonfire.Social.Likes.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.list_paginated/2","doc":"","ref":"Bonfire.Social.Likes.html#list_paginated/2"},{"type":"function","title":"Bonfire.Social.Likes.query/2","doc":"Creates a query for Like edges based on the given filters and options.","ref":"Bonfire.Social.Likes.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.query/2","doc":"- filters: A keyword list of filters to apply to the query.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Likes.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.query/2","doc":"iex> filters = [subject: %User{id: \"user123\"}]\n iex> opts = [limit: 10]\n iex> Bonfire.Social.Likes.query(filters, opts)\n #Ecto.Query<...>","ref":"Bonfire.Social.Likes.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Likes.query_module/0","doc":"","ref":"Bonfire.Social.Likes.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Likes.schema_module/0","doc":"","ref":"Bonfire.Social.Likes.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Likes.unlike/3","doc":"Removes a like for an object.","ref":"Bonfire.Social.Likes.html#unlike/3"},{"type":"function","title":"Parameters - Bonfire.Social.Likes.unlike/3","doc":"- liker: The user removing the like.\n - object: The object to be unliked.\n - opts: Additional options (optional).","ref":"Bonfire.Social.Likes.html#unlike/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Likes.unlike/3","doc":"iex> Bonfire.Social.Likes.unlike(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, nil}","ref":"Bonfire.Social.Likes.html#unlike/3-examples"},{"type":"module","title":"Bonfire.Social.Likes.LiveHandler","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.do_like/3","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#do_like/3"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.liker_count/1","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#liker_count/1"},{"type":"macro","title":"Bonfire.Social.Likes.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.update_many/2","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#update_many/2"},{"type":"function","title":"Bonfire.Social.Likes.LiveHandler.update_many_opts/1","doc":"","ref":"Bonfire.Social.Likes.LiveHandler.html#update_many_opts/1"},{"type":"module","title":"Bonfire.Social.LivePush","doc":"Handles pushing activities (via PubSub and/or email) to active feeds and notifications","ref":"Bonfire.Social.LivePush.html"},{"type":"function","title":"Bonfire.Social.LivePush.hide_activity/2","doc":"","ref":"Bonfire.Social.LivePush.html#hide_activity/2"},{"type":"function","title":"Bonfire.Social.LivePush.notify/2","doc":"","ref":"Bonfire.Social.LivePush.html#notify/2"},{"type":"function","title":"Bonfire.Social.LivePush.notify/4","doc":"","ref":"Bonfire.Social.LivePush.html#notify/4"},{"type":"function","title":"Bonfire.Social.LivePush.notify_of_message/4","doc":"","ref":"Bonfire.Social.LivePush.html#notify_of_message/4"},{"type":"function","title":"Bonfire.Social.LivePush.notify_users/4","doc":"Sends a notification about an activity to a list of users, excluding the author/subject","ref":"Bonfire.Social.LivePush.html#notify_users/4"},{"type":"function","title":"Bonfire.Social.LivePush.prepare_activity/2","doc":"","ref":"Bonfire.Social.LivePush.html#prepare_activity/2"},{"type":"function","title":"Bonfire.Social.LivePush.push_activity/3","doc":"Receives an activity with a nested object, or vice versa, uses PubSub to pushes to feeds and optionally notifications","ref":"Bonfire.Social.LivePush.html#push_activity/3"},{"type":"function","title":"Bonfire.Social.LivePush.push_activity_object/4","doc":"Receives an activity *and* object, uses PubSub to pushes to feeds and optionally notifications, and returns an Activity.","ref":"Bonfire.Social.LivePush.html#push_activity_object/4"},{"type":"module","title":"Bonfire.Social.Objects","doc":"Generic helpers for querying and mutating objects.\n\nThis module provides functions for working with social objects, including:\n- Casting common associations when creating objects\n- Reading and querying objects\n- Deleting objects\n- Publishing and setting boundaries\n- Handling ActivityPub federation","ref":"Bonfire.Social.Objects.html"},{"type":"function","title":"Bonfire.Social.Objects.ap_maybe_delete/2","doc":"","ref":"Bonfire.Social.Objects.html#ap_maybe_delete/2"},{"type":"function","title":"Bonfire.Social.Objects.ap_receive_activity/3","doc":"","ref":"Bonfire.Social.Objects.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Social.Objects.as_permitted_for/3","doc":"","ref":"Bonfire.Social.Objects.html#as_permitted_for/3"},{"type":"function","title":"Bonfire.Social.Objects.care_closures/1","doc":"Retrieves care closures for the given IDs.","ref":"Bonfire.Social.Objects.html#care_closures/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.care_closures/1","doc":"- `ids`: A list of IDs to find care closures for.","ref":"Bonfire.Social.Objects.html#care_closures/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.care_closures/1","doc":"iex> care_closures([\"id1\", \"id2\"])","ref":"Bonfire.Social.Objects.html#care_closures/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.care_taken/1","doc":"Retrieves a list of objects that are taken care of by the given caretaker IDs.","ref":"Bonfire.Social.Objects.html#care_taken/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.care_taken/1","doc":"- `ids`: A list of caretaker IDs.","ref":"Bonfire.Social.Objects.html#care_taken/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.care_taken/1","doc":"iex> care_taken([\"caretaker1\", \"caretaker2\"])\n [%Object{}, %Object{}]","ref":"Bonfire.Social.Objects.html#care_taken/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast/4","doc":"Casts various attributes for an object changeset.\n\nHandles casting:\n- Creator\n- Caretaker\n- Threaded replies (when present)\n- Tags/Mentions (when present)\n- ACLs\n- Activity","ref":"Bonfire.Social.Objects.html#cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast/4","doc":"iex> cast(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_acl/3","doc":"","ref":"Bonfire.Social.Objects.html#cast_acl/3"},{"type":"function","title":"Bonfire.Social.Objects.cast_basic/4","doc":"Casts basic attributes for an object changeset.\n\nHandles casting:\n- Creator\n- Caretaker\n- ACLs","ref":"Bonfire.Social.Objects.html#cast_basic/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_basic/4","doc":"iex> cast_basic(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_basic/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_caretaker/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_caretaker/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_creator/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_creator/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_creator_caretaker/2","doc":"","ref":"Bonfire.Social.Objects.html#cast_creator_caretaker/2"},{"type":"function","title":"Bonfire.Social.Objects.cast_mini/4","doc":"Casts minimal attributes for an object changeset.\n\nHandles casting:\n- ACLs","ref":"Bonfire.Social.Objects.html#cast_mini/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_mini/4","doc":"iex> cast_mini(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_mini/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_publish/4","doc":"Casts attributes for publishing an object.\n\nHandles casting:\n- ACLs\n- Activity\n- Feed Publishes","ref":"Bonfire.Social.Objects.html#cast_publish/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_publish/4","doc":"iex> cast_publish(changeset, %{}, user, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Objects.html#cast_publish/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.cast_sensitivity/2","doc":"Casts the object sensitivity on a changeset.","ref":"Bonfire.Social.Objects.html#cast_sensitivity/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.cast_sensitivity/2","doc":"iex> cast_sensitivity(%Changeset{}, true)\n %Changeset{}","ref":"Bonfire.Social.Objects.html#cast_sensitivity/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.changeset_named/2","doc":"","ref":"Bonfire.Social.Objects.html#changeset_named/2"},{"type":"function","title":"Bonfire.Social.Objects.delete/2","doc":"Deletes an object if the current users (provided in opts) has permission to, along with related associations (such as mixins).","ref":"Bonfire.Social.Objects.html#delete/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.delete/2","doc":"iex> delete(%Object{}, current_user: me)\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#delete/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.delete_apply_error/2","doc":"","ref":"Bonfire.Social.Objects.html#delete_apply_error/2"},{"type":"function","title":"Bonfire.Social.Objects.delete_caretaken/1","doc":"Deletes objects that are taken care of by the given main object(s).\n\nThis function recursively deletes caretakers and their objects, except for the original object (i.e if Alice is a user who takes care of some posts but also a group that in turn takes care of some posts or boosts, it will delete all of those except Alice herself).","ref":"Bonfire.Social.Objects.html#delete_caretaken/1"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.delete_caretaken/1","doc":"- `main`: The main object or list of objects to start the deletion from.","ref":"Bonfire.Social.Objects.html#delete_caretaken/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.delete_caretaken/1","doc":"iex> delete_caretaken(%Object{id: \"main_id\"})\n {:ok, [%Object{}, %Object{}]}","ref":"Bonfire.Social.Objects.html#delete_caretaken/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.do_delete/2","doc":"","ref":"Bonfire.Social.Objects.html#do_delete/2"},{"type":"function","title":"Bonfire.Social.Objects.federation_module/0","doc":"","ref":"Bonfire.Social.Objects.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Objects.filter/3","doc":"","ref":"Bonfire.Social.Objects.html#filter/3"},{"type":"function","title":"Bonfire.Social.Objects.list_paginated/2","doc":"Lists objects in a paginated manner.","ref":"Bonfire.Social.Objects.html#list_paginated/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.list_paginated/2","doc":"iex> list_paginated([type: :post], [])\n %Page{}","ref":"Bonfire.Social.Objects.html#list_paginated/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.list_query/2","doc":"","ref":"Bonfire.Social.Objects.html#list_query/2"},{"type":"function","title":"Bonfire.Social.Objects.maybe_generic_delete/3","doc":"Attempts a generic deletion of an object, to be used when no specific delete function is defined for a schema.","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.maybe_generic_delete/3","doc":"- `type`: The type of the object to delete.\n- `object`: The object to delete.\n- `options`: A keyword list of options for the deletion.","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.maybe_generic_delete/3","doc":"iex> maybe_generic_delete(MyApp.SomeType, %MyApp.SomeType{}, [])\n {:ok, %MyApp.SomeType{}}","ref":"Bonfire.Social.Objects.html#maybe_generic_delete/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.maybe_preload_activity_object/2","doc":"","ref":"Bonfire.Social.Objects.html#maybe_preload_activity_object/2"},{"type":"function","title":"Bonfire.Social.Objects.object_creator/1","doc":"Gets the creator of an object (if preloaded)","ref":"Bonfire.Social.Objects.html#object_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.object_creator/1","doc":"iex> object_creator(%Object{})\n %User{}","ref":"Bonfire.Social.Objects.html#object_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.permalink/1","doc":"Gets the permalink for an object.","ref":"Bonfire.Social.Objects.html#permalink/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.permalink/1","doc":"iex> permalink(%{canonical_uri: \"https://example.com/object/123\"})\n \"https://example.com/object/123\"","ref":"Bonfire.Social.Objects.html#permalink/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.preload_creator/1","doc":"Preloads the creator for an object.","ref":"Bonfire.Social.Objects.html#preload_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.preload_creator/1","doc":"iex> preload_creator(%Object{})\n %Object{}","ref":"Bonfire.Social.Objects.html#preload_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.preload_reply_creator/1","doc":"Preloads the reply creator for an object.","ref":"Bonfire.Social.Objects.html#preload_reply_creator/1"},{"type":"function","title":"Examples - Bonfire.Social.Objects.preload_reply_creator/1","doc":"iex> preload_reply_creator(%Object{})\n %Object{replied: %{reply_to: ...}}","ref":"Bonfire.Social.Objects.html#preload_reply_creator/1-examples"},{"type":"function","title":"Bonfire.Social.Objects.publish/5","doc":"Publishes an object.","ref":"Bonfire.Social.Objects.html#publish/5"},{"type":"function","title":"Examples - Bonfire.Social.Objects.publish/5","doc":"iex> publish(%User{}, :create, %Object{}, [], __MODULE__)\n {:ok, %Activity{}}","ref":"Bonfire.Social.Objects.html#publish/5-examples"},{"type":"function","title":"Bonfire.Social.Objects.query_base/1","doc":"Returns a basic query over undeleted pointable objects in the system,\noptionally limited to one or more types.","ref":"Bonfire.Social.Objects.html#query_base/1"},{"type":"function","title":"Bonfire.Social.Objects.read/2","doc":"Reads an object by its ID.","ref":"Bonfire.Social.Objects.html#read/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.read/2","doc":"iex> read(\"123\", [])\n {:ok, %{id: \"123\", activity: %{}}}","ref":"Bonfire.Social.Objects.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Objects.reset_preset_boundary/5","doc":"Resets the preset boundary for an object.","ref":"Bonfire.Social.Objects.html#reset_preset_boundary/5"},{"type":"function","title":"Examples - Bonfire.Social.Objects.reset_preset_boundary/5","doc":"iex> reset_preset_boundary(%User{}, %Object{}, \"public\", [], __MODULE__)\n {:ok, %Boundary{}}","ref":"Bonfire.Social.Objects.html#reset_preset_boundary/5-examples"},{"type":"function","title":"Bonfire.Social.Objects.run_epic/3","doc":"Runs an epic for a given type and options.","ref":"Bonfire.Social.Objects.html#run_epic/3"},{"type":"function","title":"Parameters - Bonfire.Social.Objects.run_epic/3","doc":"- `type`: The type of epic to run.\n- `options`: A keyword list of options for the epic.\n- `on`: The key in the epic's assigns to return (default: `:object`).","ref":"Bonfire.Social.Objects.html#run_epic/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Objects.run_epic/3","doc":"iex> run_epic(:delete, [object: %Object{}])\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#run_epic/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_boundaries/4","doc":"Sets boundaries for an object.","ref":"Bonfire.Social.Objects.html#set_boundaries/4"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_boundaries/4","doc":"iex> set_boundaries(%User{}, %Object{}, [], __MODULE__)\n [boundary: \"public\", to_circles: [], to_feeds: []]","ref":"Bonfire.Social.Objects.html#set_boundaries/4-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_name/3","doc":"Sets the name/title of an object.","ref":"Bonfire.Social.Objects.html#set_name/3"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_name/3","doc":"iex> set_name(\"123\", \"New Name\", [])\n {:ok, %Object{id: \"123\", named: %{name: \"New Name\"}}}","ref":"Bonfire.Social.Objects.html#set_name/3-examples"},{"type":"function","title":"Bonfire.Social.Objects.set_sensitivity/2","doc":"Sets the sensitivity of an existing object.","ref":"Bonfire.Social.Objects.html#set_sensitivity/2"},{"type":"function","title":"Examples - Bonfire.Social.Objects.set_sensitivity/2","doc":"iex> set_sensitivity(%Object{sensitive: %{}}, true)\n {:ok, %Object{}}","ref":"Bonfire.Social.Objects.html#set_sensitivity/2-examples"},{"type":"module","title":"Bonfire.Social.Objects.LiveHandler","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.load_object_assigns/1","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#load_object_assigns/1"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.load_object_assigns/2","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#load_object_assigns/2"},{"type":"function","title":"Bonfire.Social.Objects.LiveHandler.not_found_fallback/3","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#not_found_fallback/3"},{"type":"macro","title":"Bonfire.Social.Objects.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Objects.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.Pins","doc":"Mutate or query pins (which make an activity or object appear at the beginning of feeds or other lists).\n\nThis module provides functionality to manage and query pins, including creating, deleting, and listing pins. \n\nPins are implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions)","ref":"Bonfire.Social.Pins.html"},{"type":"function","title":"Bonfire.Social.Pins.ap_publish_activity/3","doc":"Publishes an ActivityPub activity for a pin.","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.ap_publish_activity/3","doc":"- subject: The subject of the pin activity.\n - verb: The verb of the activity (not used - currently pins are federated out as likes)\n - pin: The `Pin` object.","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.ap_publish_activity/3","doc":"iex> Bonfire.Social.Pins.ap_publish_activity(%User{id: \"user123\"}, :create, %Pin{})\n {:ok, %ActivityPub.Object{}}","ref":"Bonfire.Social.Pins.html#ap_publish_activity/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.by_pinned/2","doc":"Lists pins of a specific object.","ref":"Bonfire.Social.Pins.html#by_pinned/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.by_pinned/2","doc":"- object: The object that was pinned.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#by_pinned/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.by_pinned/2","doc":"iex> Bonfire.Social.Pins.by_pinned(%Post{id: \"post456\"})\n [%Pin{}, ...]","ref":"Bonfire.Social.Pins.html#by_pinned/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.by_pinner/2","doc":"Lists pins by a specific subject.","ref":"Bonfire.Social.Pins.html#by_pinner/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.by_pinner/2","doc":"- subject: The subject (usually a user) who created the pins.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#by_pinner/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.by_pinner/2","doc":"iex> Bonfire.Social.Pins.by_pinner(%User{id: \"user123\"})\n [%Pin{}, ...]","ref":"Bonfire.Social.Pins.html#by_pinner/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.federation_module/0","doc":"","ref":"Bonfire.Social.Pins.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.Pins.get/3","doc":"Retrieves a Pin edge between a subject and an object.","ref":"Bonfire.Social.Pins.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.get/3","doc":"- subject: The subject (usually a user) of the Pin edge.\n - object: The object that was pinned.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.get/3","doc":"iex> Bonfire.Social.Pins.get(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Pin{}}","ref":"Bonfire.Social.Pins.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.get!/3","doc":"Similar to `get/3`, but raises an error if the Pin edge is not found.","ref":"Bonfire.Social.Pins.html#get!/3"},{"type":"function","title":"Bonfire.Social.Pins.list_by/2","doc":"Lists pins by a specific user.","ref":"Bonfire.Social.Pins.html#list_by/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_by/2","doc":"- by_user: The user whose pins to list.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#list_by/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_by/2","doc":"iex> Bonfire.Social.Pins.list_by(%User{id: \"user123\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_by/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_instance_pins/1","doc":"Lists pins for the instance.","ref":"Bonfire.Social.Pins.html#list_instance_pins/1"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_instance_pins/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Pins.html#list_instance_pins/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_instance_pins/1","doc":"iex> Bonfire.Social.Pins.list_instance_pins(limit: 10)\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_instance_pins/1-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_my/1","doc":"Lists pins for the current user.","ref":"Bonfire.Social.Pins.html#list_my/1"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_my/1","doc":"- opts: Additional options for the query.","ref":"Bonfire.Social.Pins.html#list_my/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_my/1","doc":"iex> Bonfire.Social.Pins.list_my(current_user: %User{id: \"user123\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_my/1-examples"},{"type":"function","title":"Bonfire.Social.Pins.list_of/2","doc":"Lists pinners of a specific object or objects.","ref":"Bonfire.Social.Pins.html#list_of/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.list_of/2","doc":"- object: The object or objects to find pinners for.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Pins.html#list_of/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.list_of/2","doc":"iex> Bonfire.Social.Pins.list_of(%Post{id: \"post456\"})\n %{edges: [%Pin{}, ...], page_info: %{}}","ref":"Bonfire.Social.Pins.html#list_of/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.pin/4","doc":"Creates a pin for an object.","ref":"Bonfire.Social.Pins.html#pin/4"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.pin/4","doc":"- pinner: The user creating the pin.\n - object: The object to be pinned.\n - scope: The scope of the pin (eg. `:instance`, optional).\n - opts: Additional options for creating the pin (optional).","ref":"Bonfire.Social.Pins.html#pin/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.pin/4","doc":"iex> Bonfire.Social.Pins.pin(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, %Pin{}}\n\n iex> Bonfire.Social.Pins.pin(%User{id: \"user123\"}, %Post{id: \"post456\"}, :instance)\n {:ok, %Pin{}}","ref":"Bonfire.Social.Pins.html#pin/4-examples"},{"type":"function","title":"Bonfire.Social.Pins.pinned?/2","doc":"Checks if an object is pinned by the instance.","ref":"Bonfire.Social.Pins.html#pinned?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.pinned?/2","doc":"- scope: The scope to check for pinning (eg. `:instance` or a user)\n - object: The object to check for pinning.","ref":"Bonfire.Social.Pins.html#pinned?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.pinned?/2","doc":"iex> Bonfire.Social.Pins.pinned?(:instance, %Post{id: \"post123\"})\n true\n\n iex> Bonfire.Social.Pins.pinned?(%User{id: \"user123\"}, %Post{id: \"post456\"})\n false","ref":"Bonfire.Social.Pins.html#pinned?/2-examples"},{"type":"function","title":"Bonfire.Social.Pins.query/2","doc":"","ref":"Bonfire.Social.Pins.html#query/2"},{"type":"function","title":"Bonfire.Social.Pins.query_module/0","doc":"","ref":"Bonfire.Social.Pins.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Pins.rank_pin/3","doc":"Sets the rank/position of a pin within a specific scope.","ref":"Bonfire.Social.Pins.html#rank_pin/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.rank_pin/3","doc":"- pin: The pin to be ranked.\n - scope: The scope for ranking (eg. `:instance`).\n - position: The desired position/rank for the pin.","ref":"Bonfire.Social.Pins.html#rank_pin/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.rank_pin/3","doc":"iex> Bonfire.Social.Pins.rank_pin(\"pin123\", :instance, 1)\n {:ok, %Bonfire.Data.Assort.Ranked{}}\n\n iex> Bonfire.Social.Pins.rank_pin(\"pin123\", %User{id: \"user456\"}, 2)\n {:ok, %Bonfire.Data.Assort.Ranked{}}","ref":"Bonfire.Social.Pins.html#rank_pin/3-examples"},{"type":"function","title":"Bonfire.Social.Pins.schema_module/0","doc":"","ref":"Bonfire.Social.Pins.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Pins.unpin/3","doc":"Removes a pin for an object.","ref":"Bonfire.Social.Pins.html#unpin/3"},{"type":"function","title":"Parameters - Bonfire.Social.Pins.unpin/3","doc":"- user: The user removing the pin.\n - object: The object to be unpinned.\n - scope: The scope of the pin (eg. `:instance`, optional).","ref":"Bonfire.Social.Pins.html#unpin/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Pins.unpin/3","doc":"iex> Bonfire.Social.Pins.unpin(%User{id: \"user123\"}, %Post{id: \"post456\"})\n {:ok, nil}\n\n iex> Bonfire.Social.Pins.unpin(%User{id: \"user123\"}, %Post{id: \"post456\"}, :instance)\n {:ok, nil}","ref":"Bonfire.Social.Pins.html#unpin/3-examples"},{"type":"module","title":"Bonfire.Social.Pins.LiveHandler","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Pins.LiveHandler.do_pin/3","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#do_pin/3"},{"type":"function","title":"Bonfire.Social.Pins.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#handle_event/3"},{"type":"macro","title":"Bonfire.Social.Pins.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Pins.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Social.PostContents","doc":"Query, manipulate, and federate post contents. See also `Bonfire.Social.Posts` for directly handling posts.\n\nContext for `Bonfire.Data.Social.PostContent` which has the following fields:\n- name (eg. title)\n- summary (eg. description)\n- html_body (NOTE: can also contain markdown or plaintext)","ref":"Bonfire.Social.PostContents.html"},{"type":"function","title":"Bonfire.Social.PostContents.all_text_content/1","doc":"","ref":"Bonfire.Social.PostContents.html#all_text_content/1"},{"type":"function","title":"Bonfire.Social.PostContents.ap_receive_activity/3","doc":"","ref":"Bonfire.Social.PostContents.html#ap_receive_activity/3"},{"type":"function","title":"Bonfire.Social.PostContents.ap_receive_attrs_prepare/4","doc":"","ref":"Bonfire.Social.PostContents.html#ap_receive_attrs_prepare/4"},{"type":"function","title":"Bonfire.Social.PostContents.base_query/0","doc":"Returns the base query for post contents.","ref":"Bonfire.Social.PostContents.html#base_query/0"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.base_query/0","doc":"iex> Bonfire.Social.PostContents.base_query()\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#base_query/0-examples"},{"type":"function","title":"Bonfire.Social.PostContents.cast/5","doc":"Given a changeset, post content attributes, creator, boundary and options, returns a changeset prepared with relevant attributes and associations.","ref":"Bonfire.Social.PostContents.html#cast/5"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.cast/5","doc":"iex> attrs = %{name: \"Test Post\", html_body: \"Content\"}\n iex> creator = %Bonfire.Data.Identity.User{id: \"01FXYZ123ABC\"}\n iex> boundary = \"public\"\n iex> opts = []\n iex> changeset = %Ecto.Changeset{}\n iex> Bonfire.Social.PostContents.cast(changeset, attrs, creator, boundary, opts)\n #Ecto.Changeset<...>","ref":"Bonfire.Social.PostContents.html#cast/5-examples"},{"type":"function","title":"Bonfire.Social.PostContents.changeset/2","doc":"Creates a changeset for a PostContent struct.","ref":"Bonfire.Social.PostContents.html#changeset/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.changeset/2","doc":"iex> attrs = %{name: \"Test Post\", html_body: \"Content\"}\n iex> Bonfire.Social.PostContents.changeset(%Bonfire.Data.Social.PostContent{}, attrs)\n #Ecto.Changeset<...>","ref":"Bonfire.Social.PostContents.html#changeset/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.diff/2","doc":"","ref":"Bonfire.Social.PostContents.html#diff/2"},{"type":"function","title":"Bonfire.Social.PostContents.edit/3","doc":"","ref":"Bonfire.Social.PostContents.html#edit/3"},{"type":"function","title":"Bonfire.Social.PostContents.editor_output_content_type/1","doc":"","ref":"Bonfire.Social.PostContents.html#editor_output_content_type/1"},{"type":"function","title":"Bonfire.Social.PostContents.federation_module/0","doc":"","ref":"Bonfire.Social.PostContents.html#federation_module/0"},{"type":"function","title":"Bonfire.Social.PostContents.get/2","doc":"Given a post content ID, returns the corresponding post content.","ref":"Bonfire.Social.PostContents.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.get/2","doc":"iex> Bonfire.Social.PostContents.get(\"01FXYZ123ABC\")\n %Bonfire.Data.Social.PostContent{id: \"01FXYZ123ABC\", ...}","ref":"Bonfire.Social.PostContents.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.get_versions/1","doc":"","ref":"Bonfire.Social.PostContents.html#get_versions/1"},{"type":"function","title":"Bonfire.Social.PostContents.get_versions_diffed/1","doc":"","ref":"Bonfire.Social.PostContents.html#get_versions_diffed/1"},{"type":"function","title":"Bonfire.Social.PostContents.indexing_object_format/1","doc":"","ref":"Bonfire.Social.PostContents.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Social.PostContents.maybe_detect_languages/2","doc":"","ref":"Bonfire.Social.PostContents.html#maybe_detect_languages/2"},{"type":"function","title":"Bonfire.Social.PostContents.maybe_prepare_contents/4","doc":"Given post content attributes, creator, boundary, and options, prepares the post contents for processing by detecting languages, mentions, hashtags, and urls.","ref":"Bonfire.Social.PostContents.html#maybe_prepare_contents/4"},{"type":"function","title":"Bonfire.Social.PostContents.merge_with_body_or_nil/2","doc":"","ref":"Bonfire.Social.PostContents.html#merge_with_body_or_nil/2"},{"type":"function","title":"Bonfire.Social.PostContents.no_known_output/2","doc":"","ref":"Bonfire.Social.PostContents.html#no_known_output/2"},{"type":"function","title":"Bonfire.Social.PostContents.one/2","doc":"Given a set of filters, returns a single post content matching those filters.","ref":"Bonfire.Social.PostContents.html#one/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.one/2","doc":"iex> Bonfire.Social.PostContents.one(%{name: \"Test Post\"})\n %Bonfire.Data.Social.PostContent{name: \"Test Post\", ...}","ref":"Bonfire.Social.PostContents.html#one/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.prepare_text/3","doc":"","ref":"Bonfire.Social.PostContents.html#prepare_text/3"},{"type":"function","title":"Bonfire.Social.PostContents.query/2","doc":"Given a set of filters, returns an Ecto.Query for matching post contents.","ref":"Bonfire.Social.PostContents.html#query/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.query/2","doc":"iex> Bonfire.Social.PostContents.query(%{name: \"Test Post\"})\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.PostContents.query_base/0","doc":"","ref":"Bonfire.Social.PostContents.html#query_base/0"},{"type":"function","title":"Bonfire.Social.PostContents.search_query/2","doc":"Performs a search query on post contents based on the given text.","ref":"Bonfire.Social.PostContents.html#search_query/2"},{"type":"function","title":"Examples - Bonfire.Social.PostContents.search_query/2","doc":"iex> Bonfire.Social.PostContents.search_query(\"test\", %{})\n #Ecto.Query","ref":"Bonfire.Social.PostContents.html#search_query/2-examples"},{"type":"module","title":"Bonfire.Social.Requests","doc":"Handles social requests (e.g. follows requests), including creating, accepting, ignoring, and managing requests.","ref":"Bonfire.Social.Requests.html"},{"type":"function","title":"Bonfire.Social.Requests.accept/2","doc":"Accepts a request.","ref":"Bonfire.Social.Requests.html#accept/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.accept/2","doc":"iex> accept(request, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#accept/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_by_object/3","doc":"Retrieves all requests by object.","ref":"Bonfire.Social.Requests.html#all_by_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_by_object/3","doc":"iex> all_by_object(user, type, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#all_by_object/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_by_subject/3","doc":"Retrieves all requests by subject.","ref":"Bonfire.Social.Requests.html#all_by_subject/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_by_subject/3","doc":"iex> all_by_subject(user, type, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#all_by_subject/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_objects_by_subject/3","doc":"Retrieves all request objects by subject.","ref":"Bonfire.Social.Requests.html#all_objects_by_subject/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_objects_by_subject/3","doc":"iex> all_objects_by_subject(user, type, opts)\n [object]","ref":"Bonfire.Social.Requests.html#all_objects_by_subject/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_requested_outboxes/3","doc":"Retrieves all requested outboxes by user and type.","ref":"Bonfire.Social.Requests.html#all_requested_outboxes/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_requested_outboxes/3","doc":"iex> all_requested_outboxes(user, type, opts)\n [outbox_id]","ref":"Bonfire.Social.Requests.html#all_requested_outboxes/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.all_subjects_by_object/3","doc":"Retrieves all subjects by object.","ref":"Bonfire.Social.Requests.html#all_subjects_by_object/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.all_subjects_by_object/3","doc":"iex> all_subjects_by_object(user, type, opts)\n [subject]","ref":"Bonfire.Social.Requests.html#all_subjects_by_object/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.ap_publish_activity/3","doc":"","ref":"Bonfire.Social.Requests.html#ap_publish_activity/3"},{"type":"function","title":"Bonfire.Social.Requests.exists?/4","doc":"Checks if a request exists.","ref":"Bonfire.Social.Requests.html#exists?/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.exists?/4","doc":"iex> exists?(subject, Follow, object, opts)\n true","ref":"Bonfire.Social.Requests.html#exists?/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.get/2","doc":"Retrieves a request by filters.","ref":"Bonfire.Social.Requests.html#get/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.get/2","doc":"iex> get(filters, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#get/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.get/4","doc":"Retrieves a request.","ref":"Bonfire.Social.Requests.html#get/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.get/4","doc":"iex> get(subject, Follow, object, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#get/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.get!/4","doc":"","ref":"Bonfire.Social.Requests.html#get!/4"},{"type":"function","title":"Bonfire.Social.Requests.ignore/2","doc":"Ignores a request.","ref":"Bonfire.Social.Requests.html#ignore/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.ignore/2","doc":"iex> ignore(request, opts)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#ignore/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_my_requested/1","doc":"Lists all requests made by the current user.","ref":"Bonfire.Social.Requests.html#list_my_requested/1"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_my_requested/1","doc":"iex> list_my_requested(opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#list_my_requested/1-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_my_requesters/1","doc":"Lists all requesters for the current user.","ref":"Bonfire.Social.Requests.html#list_my_requesters/1"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_my_requesters/1","doc":"iex> list_my_requesters(opts)\n [{:ok, requester}]","ref":"Bonfire.Social.Requests.html#list_my_requesters/1-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_requested/2","doc":"Lists all requests made by the given user.","ref":"Bonfire.Social.Requests.html#list_requested/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_requested/2","doc":"iex> list_requested(user, opts)\n [{:ok, request}]","ref":"Bonfire.Social.Requests.html#list_requested/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.list_requesters/2","doc":"Lists all requesters for the given user.","ref":"Bonfire.Social.Requests.html#list_requesters/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.list_requesters/2","doc":"iex> list_requesters(user, opts)\n [{:ok, requester}]","ref":"Bonfire.Social.Requests.html#list_requesters/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.many/2","doc":"","ref":"Bonfire.Social.Requests.html#many/2"},{"type":"function","title":"Bonfire.Social.Requests.query/3","doc":"Prepares a DB query based on filters and type.","ref":"Bonfire.Social.Requests.html#query/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.query/3","doc":"iex> query(filters, type, opts)\n {:ok, query}","ref":"Bonfire.Social.Requests.html#query/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.query_module/0","doc":"","ref":"Bonfire.Social.Requests.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Requests.request/4","doc":"Requests to do something, and federates it.","ref":"Bonfire.Social.Requests.html#request/4"},{"type":"function","title":"Examples - Bonfire.Social.Requests.request/4","doc":"iex> request(subject, Follow, object)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#request/4-examples"},{"type":"function","title":"Bonfire.Social.Requests.requested/2","doc":"Retrieves a request.","ref":"Bonfire.Social.Requests.html#requested/2"},{"type":"function","title":"Examples - Bonfire.Social.Requests.requested/2","doc":"iex> requested(request, current_user: me)\n {:ok, request}","ref":"Bonfire.Social.Requests.html#requested/2-examples"},{"type":"function","title":"Bonfire.Social.Requests.requested?/3","doc":"Checks if a request has been made.","ref":"Bonfire.Social.Requests.html#requested?/3"},{"type":"function","title":"Examples - Bonfire.Social.Requests.requested?/3","doc":"iex> requested?(subject, type, object)\n true","ref":"Bonfire.Social.Requests.html#requested?/3-examples"},{"type":"function","title":"Bonfire.Social.Requests.schema_module/0","doc":"","ref":"Bonfire.Social.Requests.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Requests.unrequest/3","doc":"","ref":"Bonfire.Social.Requests.html#unrequest/3"},{"type":"module","title":"Bonfire.Social.Seen","doc":"Track seen/unseen status of things (usually `Activities`).\n\nThis module implements functionality to manage the seen/unseen status of objects (similar to read/unread status in other apps, but only indicates that it was displayed in a feed or other listing for the user, not that they actually read it). \n\nSeen is implemented on top of the `Bonfire.Data.Edges.Edge` schema (see `Bonfire.Social.Edges` for shared functions).","ref":"Bonfire.Social.Seen.html"},{"type":"function","title":"Bonfire.Social.Seen.get/3","doc":"Retrieves a Seen edge between a subject and an object.","ref":"Bonfire.Social.Seen.html#get/3"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.get/3","doc":"- subject: The subject (usually a user) of the Seen edge.\n - object: The object that was seen.\n - opts: Additional options for the query (optional).","ref":"Bonfire.Social.Seen.html#get/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.get/3","doc":"iex> subject = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.get(subject, object)\n {:ok, %Seen{}}","ref":"Bonfire.Social.Seen.html#get/3-examples"},{"type":"function","title":"Bonfire.Social.Seen.get!/3","doc":"Similar to `get/3`, but raises an error if the Seen edge is not found.","ref":"Bonfire.Social.Seen.html#get!/3"},{"type":"function","title":"Bonfire.Social.Seen.mark_seen/2","doc":"Marks an object as seen by a user.","ref":"Bonfire.Social.Seen.html#mark_seen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.mark_seen/2","doc":"- subject: The user marking the object as seen.\n - object: The object(s) or ID(s) being marked as seen.","ref":"Bonfire.Social.Seen.html#mark_seen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.mark_seen/2","doc":"iex> user = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.mark_seen(user, object)\n {:ok, %Seen{}}\n\n iex> Bonfire.Social.Seen.mark_seen(user, \"456\")\n {:ok, %Seen{}}","ref":"Bonfire.Social.Seen.html#mark_seen/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.mark_unseen/2","doc":"Marks an object as unseen by a user.","ref":"Bonfire.Social.Seen.html#mark_unseen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.mark_unseen/2","doc":"- subject: The user marking the object as unseen.\n- object: The object or ID being marked as unseen.","ref":"Bonfire.Social.Seen.html#mark_unseen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.mark_unseen/2","doc":"iex> user = %User{id: \"user123\"}\niex> object = %Post{id: \"post456\"}\niex> Bonfire.Social.Seen.mark_unseen(user, object)\n{:ok, nil}\n\niex> Bonfire.Social.Seen.mark_unseen(user, \"456\")","ref":"Bonfire.Social.Seen.html#mark_unseen/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.query/2","doc":"Creates a query for Seen edges based on the given filters and options.","ref":"Bonfire.Social.Seen.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.query/2","doc":"- filters: A keyword list of filters to apply to the query.\n - opts: Additional options for the query.","ref":"Bonfire.Social.Seen.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.query/2","doc":"iex> filters = [subject: %User{id: \"123\"}]\n iex> opts = [limit: 10]\n iex> Bonfire.Social.Seen.query(filters, opts)\n #Ecto.Query<...>","ref":"Bonfire.Social.Seen.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Seen.query_module/0","doc":"","ref":"Bonfire.Social.Seen.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Seen.schema_module/0","doc":"","ref":"Bonfire.Social.Seen.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Seen.seen?/2","doc":"Checks if a user has seen an object.","ref":"Bonfire.Social.Seen.html#seen?/2"},{"type":"function","title":"Parameters - Bonfire.Social.Seen.seen?/2","doc":"- user: The user to check.\n - object: The object to check if seen.","ref":"Bonfire.Social.Seen.html#seen?/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Seen.seen?/2","doc":"iex> user = %User{id: \"user123\"}\n iex> object = %Post{id: \"post456\"}\n iex> Bonfire.Social.Seen.seen?(user, object)\n true","ref":"Bonfire.Social.Seen.html#seen?/2-examples"},{"type":"module","title":"Bonfire.Social.Tags","doc":"Helpers for tagging things. Mostly wrappers around functions in `Bonfire.Tag` and `Bonfire.Classify` extensions.\n\nThis module provides functionality for processing tags, handling categories, and auto-boosting content.","ref":"Bonfire.Social.Tags.html"},{"type":"function","title":"Bonfire.Social.Tags.auto_boost/2","doc":"Auto-boosts an object to some categories' feed.","ref":"Bonfire.Social.Tags.html#auto_boost/2"},{"type":"function","title":"Examples - Bonfire.Social.Tags.auto_boost/2","doc":"iex> auto_boost([%Bonfire.Classify.Category{id: \"123\"}], %Post{id: \"456\"})\n :ok","ref":"Bonfire.Social.Tags.html#auto_boost/2-examples"},{"type":"function","title":"Bonfire.Social.Tags.indexing_format_tags/1","doc":"","ref":"Bonfire.Social.Tags.html#indexing_format_tags/1"},{"type":"function","title":"Bonfire.Social.Tags.maybe_auto_boost/3","doc":"Attempts to auto-boost an object to categories, based on which ones a user has permission to publish to.","ref":"Bonfire.Social.Tags.html#maybe_auto_boost/3"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_auto_boost/3","doc":"iex> maybe_auto_boost(%User{}, [%Bonfire.Classify.Category{id: \"123\"}], %Post{id: \"456\"})\n :ok","ref":"Bonfire.Social.Tags.html#maybe_auto_boost/3-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_boostable_categories/2","doc":"Filters a list of categories, returning those that are auto-boostable for a user.","ref":"Bonfire.Social.Tags.html#maybe_boostable_categories/2"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_boostable_categories/2","doc":"iex> maybe_boostable_categories(%User{}, [%Bonfire.Classify.Category{id: \"123\"}])\n [%Bonfire.Classify.Category{id: \"123\", tree: nil}]","ref":"Bonfire.Social.Tags.html#maybe_boostable_categories/2-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_cast/4","doc":"Casts tags if the Bonfire.Tag module is enabled for the creator.","ref":"Bonfire.Social.Tags.html#maybe_cast/4"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_cast/4","doc":"iex> maybe_cast(%Ecto.Changeset{}, %{tags: [\"tag1\", \"tag2\"]}, %User{}, [])\n %Ecto.Changeset{}","ref":"Bonfire.Social.Tags.html#maybe_cast/4-examples"},{"type":"function","title":"Bonfire.Social.Tags.maybe_process/3","doc":"Processes text to extract mentions, hashtags, and URLs if the Bonfire.Tag module is enabled.","ref":"Bonfire.Social.Tags.html#maybe_process/3"},{"type":"function","title":"Examples - Bonfire.Social.Tags.maybe_process/3","doc":"iex> maybe_process(%User{}, \"Hello @user #hashtag https://example.com\", [])\n {:ok, %{text: \"Hello @user #hashtag https://example.com\", mentions: [], hashtags: [], urls: []}}","ref":"Bonfire.Social.Tags.html#maybe_process/3-examples"},{"type":"module","title":"Bonfire.Social.Threads","doc":"Handle mutating and querying discussion threads and replies.\n\nProvides functionality for managing threaded discussions, including creating replies, querying threads, and handling participants.\n\nIt is the context module for `Bonfire.Data.Social.Replied` which contains these fields:\n- id: object \n- reply_to: what object or activity are we replying to\n- thread: what discussion thread we're in, if any (usually same as the ID of the original object that started the thread)\n- direct_replies_count: number of direct replies to this object (automatically counted and updated)\n- nested_replies_count: number of nested replies to this object and any replies to it (automatically aggregated, counted and updated)\n- total_replies_count: direct replies + nested replies (automatically summed)\n- path: breadcrumbs leading from the `reply_to` all the way to the original object that started the thread. Powered by `EctoMaterializedPath`.","ref":"Bonfire.Social.Threads.html"},{"type":"function","title":"Bonfire.Social.Threads.ap_prepare/2","doc":"Prepares a thread or reply for federation with ActivityPub.","ref":"Bonfire.Social.Threads.html#ap_prepare/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.ap_prepare/2","doc":"- `object_or_thread_or_reply_to_id`: The object, thread, or reply ID\n- `key`: The key to use for preparation (`:thread_id` or `:reply_to_id`, default is `:thread_id`)","ref":"Bonfire.Social.Threads.html#ap_prepare/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.ap_prepare/2","doc":"iex> ap_prepare(\"thread_123\")\n \"https://example.com/ap/objects/thread_123\"","ref":"Bonfire.Social.Threads.html#ap_prepare/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.arrange_replies/2","doc":"Arranges replies. \n\nTODOC: how is it different than `arrange_replies_tree/2`?","ref":"Bonfire.Social.Threads.html#arrange_replies/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.arrange_replies/2","doc":"- `replies`: List of replies\n- `opts`: Arrangement options","ref":"Bonfire.Social.Threads.html#arrange_replies/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.arrange_replies/2","doc":"iex> arrange_replies([%{id: \"1\"}, %{id: \"2\", path: [\"1\"]}])\n %{\"1\" => %{id: \"1\", children: %{\"2\" => %{id: \"2\", path: [\"1\"]}}}}","ref":"Bonfire.Social.Threads.html#arrange_replies/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.arrange_replies_tree/2","doc":"Arranges replies into a tree structure.\n\nPowered by https://github.com/bonfire-networks/ecto_materialized_path","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.arrange_replies_tree/2","doc":"- `replies`: List of replies\n- `opts`: Arrangement options","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.arrange_replies_tree/2","doc":"iex> arrange_replies_tree([%{id: \"1\"}, %{id: \"2\", reply_to_id: \"1\"}])\n %{\"1\" => %{id: \"1\", direct_replies: [%{id: \"2\", reply_to_id: \"1\"}]}}","ref":"Bonfire.Social.Threads.html#arrange_replies_tree/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.base_query/0","doc":"","ref":"Bonfire.Social.Threads.html#base_query/0"},{"type":"function","title":"Bonfire.Social.Threads.cast/4","doc":"Casts a changeset with reply_to and threading info.\n\nIf it's not a reply or the user is not permitted to reply to the thing, a new thread will be created.","ref":"Bonfire.Social.Threads.html#cast/4"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.cast/4","doc":"- `changeset`: The changeset to be updated\n- `attrs`: Attributes for the reply\n- `user`: The user creating the reply\n- `_preset_or_custom_boundary`: Boundary setting (currently unused)","ref":"Bonfire.Social.Threads.html#cast/4-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.cast/4","doc":"iex> cast(changeset, %{reply_to_id: \"123\"}, user, nil)\n %Ecto.Changeset{}","ref":"Bonfire.Social.Threads.html#cast/4-examples"},{"type":"function","title":"Bonfire.Social.Threads.changeset/2","doc":"","ref":"Bonfire.Social.Threads.html#changeset/2"},{"type":"function","title":"Bonfire.Social.Threads.count_participants/2","doc":"Counts participants in a thread.","ref":"Bonfire.Social.Threads.html#count_participants/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.count_participants/2","doc":"- `thread_id`: The ID of the thread\n- `opts`: Additional options, should contain `current_user` to check for permission","ref":"Bonfire.Social.Threads.html#count_participants/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.count_participants/2","doc":"iex> count_participants(\"thread_123\")\n 5","ref":"Bonfire.Social.Threads.html#count_participants/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.create_parent_replied/3","doc":"Creates a parent replied record within a changeset.","ref":"Bonfire.Social.Threads.html#create_parent_replied/3"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.create_parent_replied/3","doc":"- `changeset` or `object`: The changeset to update\n- `replied`: The replied struct\n- `replied_attrs`: Attributes for the replied record","ref":"Bonfire.Social.Threads.html#create_parent_replied/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.create_parent_replied/3","doc":"iex> create_parent_replied(changeset, %Replied{}, %{id: \"789\", thread_id: \"456\"})\n %Ecto.Changeset{}","ref":"Bonfire.Social.Threads.html#create_parent_replied/3-examples"},{"type":"function","title":"Bonfire.Social.Threads.filter/3","doc":"Group per-thread","ref":"Bonfire.Social.Threads.html#filter/3"},{"type":"function","title":"Bonfire.Social.Threads.find_reply_to/2","doc":"Finds the object being replied to.","ref":"Bonfire.Social.Threads.html#find_reply_to/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.find_reply_to/2","doc":"- `attrs`: Attributes containing reply information\n- `user`: The user attempting to reply","ref":"Bonfire.Social.Threads.html#find_reply_to/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.find_reply_to/2","doc":"- `{:ok, reply}` if the reply object is found and the user has permission\n- `{:error, reason}` otherwise, where reason may be `:not_found` or `:not_permitted`","ref":"Bonfire.Social.Threads.html#find_reply_to/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.find_reply_to/2","doc":"iex> find_reply_to(%{reply_to_id: \"123\"}, user)\n {:ok, %{id: \"123\", ...}}","ref":"Bonfire.Social.Threads.html#find_reply_to/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.find_thread/2","doc":"Finds the thread for a reply.","ref":"Bonfire.Social.Threads.html#find_thread/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.find_thread/2","doc":"- `attrs`: Attributes containing thread information\n- `user`: The user attempting to access the thread","ref":"Bonfire.Social.Threads.html#find_thread/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.find_thread/2","doc":"iex> find_thread(%{thread_id: \"456\"}, user)\n {:ok, %{id: \"456\", ...}}","ref":"Bonfire.Social.Threads.html#find_thread/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.init_parent_replied/1","doc":"Initializes a parent replied record.","ref":"Bonfire.Social.Threads.html#init_parent_replied/1"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.init_parent_replied/1","doc":"- `replied_attrs`: Attributes for the replied record","ref":"Bonfire.Social.Threads.html#init_parent_replied/1-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.init_parent_replied/1","doc":"iex> init_parent_replied(%{id: \"789\", thread_id: \"456\"})\n {:ok, %Replied{}}","ref":"Bonfire.Social.Threads.html#init_parent_replied/1-examples"},{"type":"function","title":"Bonfire.Social.Threads.list_participants/3","doc":"Lists participants of a thread or individual object.","ref":"Bonfire.Social.Threads.html#list_participants/3"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.list_participants/3","doc":"- `activity_or_object`: The activity or object to list participants for\n- `thread_or_object_id`: Optional thread or object ID\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#list_participants/3-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.list_participants/3","doc":"iex> list_participants(activity, \"thread_123\", limit: 10)\n [%{id: \"user1\", ...}, %{id: \"user2\", ...}]","ref":"Bonfire.Social.Threads.html#list_participants/3-examples"},{"type":"function","title":"Bonfire.Social.Threads.list_replies/2","doc":"Lists replies in a thread.","ref":"Bonfire.Social.Threads.html#list_replies/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.list_replies/2","doc":"- `thread`: The thread or thread ID\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#list_replies/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.list_replies/2","doc":"iex> list_replies(\"thread_123\", limit: 10)\n %{edges: [%{id: \"reply1\", ...}, %{id: \"reply2\", ...}]}","ref":"Bonfire.Social.Threads.html#list_replies/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.mark_all_seen/2","doc":"Marks all unseen replies as seen.","ref":"Bonfire.Social.Threads.html#mark_all_seen/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.mark_all_seen/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#mark_all_seen/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.mark_all_seen/2","doc":"iex> mark_all_seen([thread_id: \"123\"], current_user: user)\n {:ok, [%{id: \"reply1\"}, %{id: \"reply2\"}]}","ref":"Bonfire.Social.Threads.html#mark_all_seen/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.maybe_re_order_result/2","doc":"re-order distinct threads after DISTINCT ON ordered them by thread_id - Note: does not support pagination","ref":"Bonfire.Social.Threads.html#maybe_re_order_result/2"},{"type":"function","title":"Bonfire.Social.Threads.maybe_with_pins/3","doc":"","ref":"Bonfire.Social.Threads.html#maybe_with_pins/3"},{"type":"function","title":"Bonfire.Social.Threads.query/2","doc":"Builds a query for thread replies.","ref":"Bonfire.Social.Threads.html#query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.query/2","doc":"- `filter`: Filter criteria (e.g., `[thread_id: \"123\"]`)\n- `opts`: Additional query options","ref":"Bonfire.Social.Threads.html#query/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.query/2","doc":"iex> query([thread_id: \"123\"], preload: [:posts])\n %Ecto.Query{}","ref":"Bonfire.Social.Threads.html#query/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.query_module/0","doc":"","ref":"Bonfire.Social.Threads.html#query_module/0"},{"type":"function","title":"Bonfire.Social.Threads.re_order_using_subquery/2","doc":"re-order distinct threads after DISTINCT ON ordered them by thread_id - Note: this results in (Ecto.QueryError) cannot preload associations in subquery in query","ref":"Bonfire.Social.Threads.html#re_order_using_subquery/2"},{"type":"function","title":"Bonfire.Social.Threads.read/2","doc":"Reads a thread by its ID.","ref":"Bonfire.Social.Threads.html#read/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.read/2","doc":"- `object_id`: The ID of the object to read\n- `opts`: should contain `current_user` to check for read permissions","ref":"Bonfire.Social.Threads.html#read/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.read/2","doc":"- `{:ok, object}` if the object is found and readable\n- `{:error, reason}` otherwise","ref":"Bonfire.Social.Threads.html#read/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.read/2","doc":"iex> read(\"123\", current_user: me)\n {:ok, %{id: \"123\", ...}}","ref":"Bonfire.Social.Threads.html#read/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.schema_module/0","doc":"","ref":"Bonfire.Social.Threads.html#schema_module/0"},{"type":"function","title":"Bonfire.Social.Threads.unseen_count/2","doc":"Counts unseen replies.","ref":"Bonfire.Social.Threads.html#unseen_count/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.unseen_count/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional options","ref":"Bonfire.Social.Threads.html#unseen_count/2-parameters"},{"type":"function","title":"Examples - Bonfire.Social.Threads.unseen_count/2","doc":"iex> unseen_count([thread_id: \"123\"], current_user: user)\n 5","ref":"Bonfire.Social.Threads.html#unseen_count/2-examples"},{"type":"function","title":"Bonfire.Social.Threads.unseen_query/2","doc":"Builds a query for unseen replies.","ref":"Bonfire.Social.Threads.html#unseen_query/2"},{"type":"function","title":"Parameters - Bonfire.Social.Threads.unseen_query/2","doc":"- `filters`: Filter criteria\n- `opts`: Additional query options","ref":"Bonfire.Social.Threads.html#unseen_query/2-parameters"},{"type":"function","title":"Returns - Bonfire.Social.Threads.unseen_query/2","doc":"- `{:ok, query}` if the query can be built\n- `{:error, reason}` otherwise","ref":"Bonfire.Social.Threads.html#unseen_query/2-returns"},{"type":"function","title":"Examples - Bonfire.Social.Threads.unseen_query/2","doc":"iex> unseen_query([thread_id: \"123\"], current_user: user)\n {:ok, %Ecto.Query{}}","ref":"Bonfire.Social.Threads.html#unseen_query/2-examples"},{"type":"module","title":"Bonfire.Social.Threads.LiveHandler","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_info/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_info/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.handle_params/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#handle_params/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.insert_comments/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#insert_comments/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.live_more/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#live_more/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread/1"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread_assigns/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread_assigns/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.load_thread_maybe_async/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#load_thread_maybe_async/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.max_depth/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#max_depth/1"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.maybe_subscribe/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#maybe_subscribe/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.reply/3","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#reply/3"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.send_thread_updates/4","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#send_thread_updates/4"},{"type":"macro","title":"Bonfire.Social.Threads.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#sigil_p/2"},{"type":"function","title":"Bonfire.Social.Threads.LiveHandler.thread_init/1","doc":"","ref":"Bonfire.Social.Threads.LiveHandler.html#thread_init/1"},{"type":"module","title":"Bonfire.Tag","doc":"An extension for [Bonfire](https://bonfire.cafe/) that handles tagging posts or other things:\n- @ mentions \n- #hashtags\n- others (e.g. with a Category from Bonfire.Classify or a location from Bonfire.Geolocate)","ref":"Bonfire.Tag.html"},{"type":"module","title":"Handy commands - Bonfire.Tag","doc":"","ref":"Bonfire.Tag.html#module-handy-commands"},{"type":"module","title":"Copyright and License - Bonfire.Tag","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Tag.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Tag.cast/4","doc":"For using on changesets (eg in epics)","ref":"Bonfire.Tag.html#cast/4"},{"type":"function","title":"Bonfire.Tag.context_module/0","doc":"","ref":"Bonfire.Tag.html#context_module/0"},{"type":"function","title":"Bonfire.Tag.find/2","doc":"","ref":"Bonfire.Tag.html#find/2"},{"type":"function","title":"Bonfire.Tag.format_tag/1","doc":"","ref":"Bonfire.Tag.html#format_tag/1"},{"type":"function","title":"Bonfire.Tag.format_tags/1","doc":"","ref":"Bonfire.Tag.html#format_tags/1"},{"type":"function","title":"Bonfire.Tag.get/2","doc":"","ref":"Bonfire.Tag.html#get/2"},{"type":"function","title":"Bonfire.Tag.get_hashtag/1","doc":"","ref":"Bonfire.Tag.html#get_hashtag/1"},{"type":"function","title":"Bonfire.Tag.get_hashtags_from_changeset/1","doc":"","ref":"Bonfire.Tag.html#get_hashtags_from_changeset/1"},{"type":"function","title":"Bonfire.Tag.get_mentions_from_changeset/1","doc":"","ref":"Bonfire.Tag.html#get_mentions_from_changeset/1"},{"type":"function","title":"Bonfire.Tag.get_or_create_hashtag/1","doc":"","ref":"Bonfire.Tag.html#get_or_create_hashtag/1"},{"type":"function","title":"Bonfire.Tag.indexing_object_format/1","doc":"","ref":"Bonfire.Tag.html#indexing_object_format/1"},{"type":"function","title":"Bonfire.Tag.indexing_object_format_name/1","doc":"","ref":"Bonfire.Tag.html#indexing_object_format_name/1"},{"type":"function","title":"Bonfire.Tag.list_trending/2","doc":"","ref":"Bonfire.Tag.html#list_trending/2"},{"type":"function","title":"Bonfire.Tag.list_trending_reset/2","doc":"","ref":"Bonfire.Tag.html#list_trending_reset/2"},{"type":"function","title":"Bonfire.Tag.list_trending_without_cache/2","doc":"","ref":"Bonfire.Tag.html#list_trending_without_cache/2"},{"type":"function","title":"Bonfire.Tag.many/2","doc":"Retrieves a list of tags by arbitrary filters.\nUsed by:\n* Various parts of the codebase that need to query for tags (inc. tests)","ref":"Bonfire.Tag.html#many/2"},{"type":"function","title":"Bonfire.Tag.maybe_find_tag/3","doc":"Try to find one (best-match) tag","ref":"Bonfire.Tag.html#maybe_find_tag/3"},{"type":"function","title":"Bonfire.Tag.maybe_find_tags/3","doc":"Search / autocomplete for tags by name","ref":"Bonfire.Tag.html#maybe_find_tags/3"},{"type":"function","title":"Bonfire.Tag.maybe_lookup_tag/2","doc":"Lookup a single for a tag by its name/username","ref":"Bonfire.Tag.html#maybe_lookup_tag/2"},{"type":"function","title":"Bonfire.Tag.maybe_put_tree_parent/3","doc":"","ref":"Bonfire.Tag.html#maybe_put_tree_parent/3"},{"type":"function","title":"Bonfire.Tag.maybe_tag/4","doc":"Maybe tag something","ref":"Bonfire.Tag.html#maybe_tag/4"},{"type":"function","title":"Bonfire.Tag.maybe_taxonomy_tag/2","doc":"","ref":"Bonfire.Tag.html#maybe_taxonomy_tag/2"},{"type":"function","title":"Bonfire.Tag.one/2","doc":"Retrieves a single tag by arbitrary filters.\nUsed by:\n* GraphQL Item queries\n* ActivityPub integration\n* Various parts of the codebase that need to query for tags (inc. tests)","ref":"Bonfire.Tag.html#one/2"},{"type":"function","title":"Bonfire.Tag.query_module/0","doc":"","ref":"Bonfire.Tag.html#query_module/0"},{"type":"function","title":"Bonfire.Tag.search_hashtag/2","doc":"","ref":"Bonfire.Tag.html#search_hashtag/2"},{"type":"function","title":"Bonfire.Tag.search_hashtag_query/2","doc":"","ref":"Bonfire.Tag.html#search_hashtag_query/2"},{"type":"function","title":"Bonfire.Tag.tag_ids/1","doc":"","ref":"Bonfire.Tag.html#tag_ids/1"},{"type":"function","title":"Bonfire.Tag.tag_something/4","doc":"tag existing thing with one or multiple Tags, Needle, or anything that can be made into a tag","ref":"Bonfire.Tag.html#tag_something/4"},{"type":"function","title":"Bonfire.Tag.tag_things_changeset/2","doc":"Add things (Pointer objects) to a tag. You usually want to add tags to a thing instead, see `thing_tags_changeset`","ref":"Bonfire.Tag.html#tag_things_changeset/2"},{"type":"function","title":"Bonfire.Tag.thing_tags_changeset/2","doc":"Add tags to a thing (any Pointer object which defines a many_to_many relation to tag). This function applies to your object schema but is here for convenience.","ref":"Bonfire.Tag.html#thing_tags_changeset/2"},{"type":"module","title":"Bonfire.Tag.Acts.Tag","doc":"An act that optionally tags an object. \n\nEpic Options:\n * ...\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Tag.Acts.Tag.html"},{"type":"function","title":"Bonfire.Tag.Acts.Tag.run/2","doc":"","ref":"Bonfire.Tag.Acts.Tag.html#run/2"},{"type":"module","title":"Bonfire.Tag.Autocomplete","doc":"Functions to lookup and autocomplete tag names","ref":"Bonfire.Tag.Autocomplete.html"},{"type":"function","title":"Bonfire.Tag.Autocomplete.api_tag_lookup/3","doc":"","ref":"Bonfire.Tag.Autocomplete.html#api_tag_lookup/3"},{"type":"function","title":"Bonfire.Tag.Autocomplete.api_tag_lookup_public/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#api_tag_lookup_public/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.filter_results/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#filter_results/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.find_all_tags/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#find_all_tags/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.maybe_find_tags/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#maybe_find_tags/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.maybe_search/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#maybe_search/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.prefix_index/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#prefix_index/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_or_lookup/3","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_or_lookup/3"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_prefix/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_prefix/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.search_type/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#search_type/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_add_field/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_add_field/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_hit_prepare/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_hit_prepare/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_lookup_public/4","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_lookup_public/4"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search_from_tags/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search_from_tags/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tag_search_from_text/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tag_search_from_text/2"},{"type":"function","title":"Bonfire.Tag.Autocomplete.tags_split/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#tags_split/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_all_prefixes/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_all_prefixes/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_prefixes/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_prefixes/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_tag_search/1","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_tag_search/1"},{"type":"function","title":"Bonfire.Tag.Autocomplete.try_tag_search/2","doc":"","ref":"Bonfire.Tag.Autocomplete.html#try_tag_search/2"},{"type":"module","title":"Bonfire.Tag.GraphQL.TagResolver","doc":"GraphQL tag/category queries","ref":"Bonfire.Tag.GraphQL.TagResolver.html"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.fetch_tag/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#fetch_tag/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.name/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#name/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.summary/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#summary/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag_prepare/3","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag_prepare/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tag_something/2","doc":"","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tag_something/2"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tagged_things_edges/3","doc":"Things associated with a Tag","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tagged_things_edges/3"},{"type":"function","title":"Bonfire.Tag.GraphQL.TagResolver.tags_edges/3","doc":"Tags associated with a Thing","ref":"Bonfire.Tag.GraphQL.TagResolver.html#tags_edges/3"},{"type":"module","title":"Bonfire.Tag.Hashtag","doc":"A virtual schema used for hashtags","ref":"Bonfire.Tag.Hashtag.html"},{"type":"function","title":"Bonfire.Tag.Hashtag.changeset/2","doc":"","ref":"Bonfire.Tag.Hashtag.html#changeset/2"},{"type":"function","title":"Bonfire.Tag.Hashtag.delete/2","doc":"","ref":"Bonfire.Tag.Hashtag.html#delete/2"},{"type":"function","title":"Bonfire.Tag.Hashtag.get/3","doc":"","ref":"Bonfire.Tag.Hashtag.html#get/3"},{"type":"function","title":"Bonfire.Tag.Hashtag.normalize_name/1","doc":"","ref":"Bonfire.Tag.Hashtag.html#normalize_name/1"},{"type":"function","title":"Bonfire.Tag.Hashtag.put/3","doc":"","ref":"Bonfire.Tag.Hashtag.html#put/3"},{"type":"module","title":"Bonfire.Tag.LiveHandler","doc":"","ref":"Bonfire.Tag.LiveHandler.html"},{"type":"function","title":"Bonfire.Tag.LiveHandler.declared_extension/0","doc":"","ref":"Bonfire.Tag.LiveHandler.html#declared_extension/0"},{"type":"function","title":"Bonfire.Tag.LiveHandler.handle_event/3","doc":"","ref":"Bonfire.Tag.LiveHandler.html#handle_event/3"},{"type":"function","title":"Bonfire.Tag.LiveHandler.maybe_tag/4","doc":"","ref":"Bonfire.Tag.LiveHandler.html#maybe_tag/4"},{"type":"macro","title":"Bonfire.Tag.LiveHandler.sigil_p/2","doc":"","ref":"Bonfire.Tag.LiveHandler.html#sigil_p/2"},{"type":"module","title":"Bonfire.Tag.Queries","doc":"Queries for `Bonfire.Tag`","ref":"Bonfire.Tag.Queries.html"},{"type":"function","title":"Bonfire.Tag.Queries.filter/2","doc":"Filter the query according to arbitrary criteria","ref":"Bonfire.Tag.Queries.html#filter/2"},{"type":"function","title":"Bonfire.Tag.Queries.join_to/3","doc":"","ref":"Bonfire.Tag.Queries.html#join_to/3"},{"type":"function","title":"Bonfire.Tag.Queries.list_trending/2","doc":"","ref":"Bonfire.Tag.Queries.html#list_trending/2"},{"type":"function","title":"Bonfire.Tag.Queries.queries/4","doc":"","ref":"Bonfire.Tag.Queries.html#queries/4"},{"type":"function","title":"Bonfire.Tag.Queries.query/1","doc":"","ref":"Bonfire.Tag.Queries.html#query/1"},{"type":"function","title":"Bonfire.Tag.Queries.query/2","doc":"","ref":"Bonfire.Tag.Queries.html#query/2"},{"type":"module","title":"Bonfire.Tag.Simulate","doc":"","ref":"Bonfire.Tag.Simulate.html"},{"type":"module","title":"Bonfire.Tag.Tagged","doc":"A mixin used for associating tags with an object","ref":"Bonfire.Tag.Tagged.html"},{"type":"function","title":"Bonfire.Tag.Tagged.all/0","doc":"","ref":"Bonfire.Tag.Tagged.html#all/0"},{"type":"function","title":"Bonfire.Tag.Tagged.changeset/2","doc":"","ref":"Bonfire.Tag.Tagged.html#changeset/2"},{"type":"function","title":"Bonfire.Tag.Tagged.delete/2","doc":"","ref":"Bonfire.Tag.Tagged.html#delete/2"},{"type":"function","title":"Bonfire.Tag.Tagged.get/3","doc":"","ref":"Bonfire.Tag.Tagged.html#get/3"},{"type":"function","title":"Bonfire.Tag.Tagged.latest/1","doc":"Get the latest tag added to a thing","ref":"Bonfire.Tag.Tagged.html#latest/1"},{"type":"function","title":"Bonfire.Tag.Tagged.put/3","doc":"","ref":"Bonfire.Tag.Tagged.html#put/3"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_tag/1","doc":"List the things tagged with a certain tag","ref":"Bonfire.Tag.Tagged.html#q_with_tag/1"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_thing/1","doc":"List the tags of a thing","ref":"Bonfire.Tag.Tagged.html#q_with_thing/1"},{"type":"function","title":"Bonfire.Tag.Tagged.q_with_type/1","doc":"List by type of tagged thing","ref":"Bonfire.Tag.Tagged.html#q_with_type/1"},{"type":"function","title":"Bonfire.Tag.Tagged.search_query/2","doc":"","ref":"Bonfire.Tag.Tagged.html#search_query/2"},{"type":"function","title":"Bonfire.Tag.Tagged.thing_tags_insert/2","doc":"","ref":"Bonfire.Tag.Tagged.html#thing_tags_insert/2"},{"type":"function","title":"Bonfire.Tag.Tagged.with_tag/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_tag/1"},{"type":"function","title":"Bonfire.Tag.Tagged.with_thing/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_thing/1"},{"type":"function","title":"Bonfire.Tag.Tagged.with_type/1","doc":"","ref":"Bonfire.Tag.Tagged.html#with_type/1"},{"type":"module","title":"Bonfire.Tag.TextContent.Formatter","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.linkify/2","doc":"Parses a text and replace plain text links with HTML. Returns a tuple with a result text, mentions, and hashtags.\n\nIf the 'safe_mention' option is given, only consecutive mentions at the start the post are actually mentioned.","ref":"Bonfire.Tag.TextContent.Formatter.html#linkify/2"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.nothing_handler/3","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#nothing_handler/3"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.tag_handler/4","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#tag_handler/4"},{"type":"function","title":"Bonfire.Tag.TextContent.Formatter.url_handler/3","doc":"","ref":"Bonfire.Tag.TextContent.Formatter.html#url_handler/3"},{"type":"module","title":"Bonfire.Tag.TextContent.Process","doc":"","ref":"Bonfire.Tag.TextContent.Process.html"},{"type":"function","title":"Bonfire.Tag.TextContent.Process.html_escape/2","doc":"","ref":"Bonfire.Tag.TextContent.Process.html#html_escape/2"},{"type":"function","title":"Bonfire.Tag.TextContent.Process.process/3","doc":"For use for things like a bio, where we want links but not to actually trigger mentions.","ref":"Bonfire.Tag.TextContent.Process.html#process/3"},{"type":"module","title":"Bonfire.Tag.Web.Routes","doc":"","ref":"Bonfire.Tag.Web.Routes.html"},{"type":"function","title":"Bonfire.Tag.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Tag.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Tags.Acts.AutoBoost","doc":"An act that optionally boosts an activity as a category. This is a way to auto-post in a category/group when tagged (and the author has permission).\n\nEpic Options:\n * ...\n\nAct Options:\n * `:on` - key to find changeset, required.","ref":"Bonfire.Tags.Acts.AutoBoost.html"},{"type":"function","title":"Bonfire.Tags.Acts.AutoBoost.run/2","doc":"","ref":"Bonfire.Tags.Acts.AutoBoost.html#run/2"},{"type":"module","title":"Bonfire.Telemetry","doc":"","ref":"Bonfire.Telemetry.html"},{"type":"function","title":"Bonfire.Telemetry.handle_event/4","doc":"","ref":"Bonfire.Telemetry.html#handle_event/4"},{"type":"function","title":"Bonfire.Telemetry.setup/2","doc":"","ref":"Bonfire.Telemetry.html#setup/2"},{"type":"function","title":"Bonfire.Telemetry.setup_oban/0","doc":"","ref":"Bonfire.Telemetry.html#setup_oban/0"},{"type":"function","title":"Bonfire.Telemetry.setup_opentelemetry/2","doc":"","ref":"Bonfire.Telemetry.html#setup_opentelemetry/2"},{"type":"module","title":"Bonfire.Telemetry.Metrics","doc":"","ref":"Bonfire.Telemetry.Metrics.html"},{"type":"function","title":"Bonfire.Telemetry.Metrics.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Telemetry.Metrics.html#child_spec/1"},{"type":"function","title":"Bonfire.Telemetry.Metrics.metrics/0","doc":"","ref":"Bonfire.Telemetry.Metrics.html#metrics/0"},{"type":"function","title":"Bonfire.Telemetry.Metrics.oban_worker_memory/0","doc":"","ref":"Bonfire.Telemetry.Metrics.html#oban_worker_memory/0"},{"type":"function","title":"Bonfire.Telemetry.Metrics.start_link/1","doc":"","ref":"Bonfire.Telemetry.Metrics.html#start_link/1"},{"type":"module","title":"Bonfire.Telemetry.Storage","doc":"","ref":"Bonfire.Telemetry.Storage.html"},{"type":"function","title":"Bonfire.Telemetry.Storage.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Bonfire.Telemetry.Storage.html#child_spec/1"},{"type":"function","title":"Bonfire.Telemetry.Storage.handle_event/4","doc":"","ref":"Bonfire.Telemetry.Storage.html#handle_event/4"},{"type":"function","title":"Bonfire.Telemetry.Storage.metrics_history/1","doc":"","ref":"Bonfire.Telemetry.Storage.html#metrics_history/1"},{"type":"function","title":"Bonfire.Telemetry.Storage.start_link/1","doc":"","ref":"Bonfire.Telemetry.Storage.html#start_link/1"},{"type":"module","title":"Bonfire.Telemetry.SystemMonitor","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.format_percent/1","doc":"Formats percent.","ref":"Bonfire.Telemetry.SystemMonitor.html#format_percent/1"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.handle_alarm/2","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#handle_alarm/2"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.handle_event/2","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#handle_event/2"},{"type":"function","title":"Bonfire.Telemetry.SystemMonitor.init/1","doc":"","ref":"Bonfire.Telemetry.SystemMonitor.html#init/1"},{"type":"module","title":"Bonfire.Testing","doc":"","ref":"Bonfire.Testing.html"},{"type":"function","title":"Bonfire.Testing.configure_start_test/1","doc":"","ref":"Bonfire.Testing.html#configure_start_test/1"},{"type":"module","title":"Bonfire.Testing.InsecurePW","doc":"","ref":"Bonfire.Testing.InsecurePW.html"},{"type":"function","title":"Bonfire.Testing.InsecurePW.no_user_verify/0","doc":"","ref":"Bonfire.Testing.InsecurePW.html#no_user_verify/0"},{"type":"module","title":"Bonfire.Upcycle","doc":"Upcycle supports a network of high school fablabs in Milwaukee that receive contributions of materials from organizations in the community and share these with each other. It is implemented as a UI for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows), which are both available as extensions for [Bonfire](https://bonfire.cafe/). Upcycle was initially created for [LearnDeep](https://learndeep.org/) by students at [MSOE](https://www.msoe.edu/), and is now being maintained by the Bonfire team.","ref":"Bonfire.Upcycle.html"},{"type":"module","title":"Set up - Bonfire.Upcycle","doc":"Upcycle is packaged as part of the `cooperation` flavour of Bonfire. Check out the development or deployment [docs](https://doc.bonfirenetworks.org/readme.html) to get started.","ref":"Bonfire.Upcycle.html#module-set-up"},{"type":"module","title":"Copyright and License - Bonfire.Upcycle","doc":"Copyright (c) 2022 all contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Upcycle.html#module-copyright-and-license"},{"type":"function","title":"Bonfire.Upcycle.format_date/1","doc":"","ref":"Bonfire.Upcycle.html#format_date/1"},{"type":"function","title":"Bonfire.Upcycle.involved?/2","doc":"","ref":"Bonfire.Upcycle.html#involved?/2"},{"type":"function","title":"Bonfire.Upcycle.mailer/0","doc":"","ref":"Bonfire.Upcycle.html#mailer/0"},{"type":"function","title":"Bonfire.Upcycle.remote_tag_id/0","doc":"","ref":"Bonfire.Upcycle.html#remote_tag_id/0"},{"type":"function","title":"Bonfire.Upcycle.remote_tag_prefix/0","doc":"","ref":"Bonfire.Upcycle.html#remote_tag_prefix/0"},{"type":"function","title":"Bonfire.Upcycle.units/0","doc":"","ref":"Bonfire.Upcycle.html#units/0"},{"type":"module","title":"Bonfire.Upcycle.IntentLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.IntentLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.IntentLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.MapLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.MapLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.MapLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.ResourceLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.ResourceLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.ResourceLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.HomeLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.InventoryLive.GraphQL.html#process/2"},{"type":"module","title":"Bonfire.Upcycle.Web.Routes","doc":"","ref":"Bonfire.Upcycle.Web.Routes.html"},{"type":"function","title":"Bonfire.Upcycle.Web.Routes.declare_routes/0","doc":"","ref":"Bonfire.Upcycle.Web.Routes.html#declare_routes/0"},{"type":"module","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.lookup_schema/1","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#lookup_schema/1"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.pipeline/1","doc":"Determine the remaining pipeline for an request with a pre-compiled\ndocument.\n\nUsually this can be changed simply by setting `@compilation_pipeline` in\nyour document provider. This may need to be overridden if your compilation\nphase is not a subset of the full pipeline.","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#pipeline/1"},{"type":"function","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.process/2","doc":"","ref":"Bonfire.Upcycle.Web.TransfersLive.GraphQL.html#process/2"},{"type":"module","title":"ActivityPub","doc":"ActivityPub Library for elixir.\n\n**WORK IN PROGRESS, TESTING FEDERATION WITH DIFFERENT IMPLEMENTATIONS IS UNDERWAY**","ref":"ActivityPub.html"},{"type":"module","title":"Installation - ActivityPub","doc":"1. Add this library to your dependencies in `mix.exs`\n\n```\ndefp deps do\n [...]\n {:activity_pub, git: \"https://github.com/bonfire-networks/activity_pub.git\", branch: \"stable\"} # branch can \"stable\", or \"develop\" for the bleeding edge\nend\n```\n\n2. Create an adapter module. To start, one created at\n `lib/my_app/adapter.ex` might look like\n\n```elixir\ndefmodule MyApp.Adapter do\n @moduledoc \"\"\"\n Adapter functions delegated from the `ActivityPub` Library\n \"\"\"\n\n @behaviour ActivityPub.Federator.Adapter\nend\n```\n\nNote that, due to the defined `@behavior`, Elixir will warn you that\nthe required functions\n\n * `base_url/0`\n * `get_actor_by_id/1`\n * `get_actor_by_username/1`\n * `get_follower_local_ids/1`\n * `get_following_local_ids/1`\n * `get_redirect_url/1`\n * `handle_activity/1`\n * `maybe_create_remote_actor/1`\n * `maybe_publish_object/2`\n * `update_local_actor/2`\n * `update_remote_actor/1`\n\nhave not yet been implemented though you will be able to start your\napp. Defining these allows `ActivityPub` to handle ActivityPub HTTP\nand database calls and operations. An example of an implemented\nadaptor can be found\n[here](https://github.com/bonfire-networks/bonfire_federate_activitypub/tree/main/lib/adapter\n\"Link to file hosted on GitHub\").\n\nThen set it in config\n\n```\nconfig :activity_pub, :adapter, MyApp.Adapter\n```\n\n3. Set your application repo in config\n\n```\nconfig :activity_pub, :repo, MyApp.Repo\n```\n\n4. Create a new ecto migration and call `ActivityPub.Migration.up/0` from it\n\n5. Inject AP routes to your router by adding `use ActivityPub.Web.Router` to your app's router module\n\n6. Copy the default AP config to your app's confix.exs\n\n```\nconfig :activity_pub, :mrf_simple,\n media_removal: [],\n media_nsfw: [],\n report_removal: [],\n accept: [],\n avatar_removal: [],\n banner_removal: []\n\nconfig :activity_pub, :instance,\n hostname: \"example.com\",\n federation_publisher_modules: [ActivityPub.Federator.APPublisher],\n federation_reachability_timeout_days: 7,\n federating: true,\n rewrite_policy: []\n\nconfig :activity_pub, :http,\n proxy_url: nil,\n user_agent: \"Your app name\",\n send_user_agent: true,\n adapter: [\n ssl_options: [\n # Workaround for remote server certificate chain issues\n partial_chain: &:hackney_connect.partial_chain/1,\n # We don't support TLS v1.3 yet\n versions: [:tlsv1, :\"tlsv1.1\", :\"tlsv1.2\"]\n ]\n ]\n ```\n\n7. Change the hostname value in the instance config block to your instance's hostname \n\n8. If you don't already have Oban set up, follow the [Oban installation intructions](https://hexdocs.pm/oban/installation.html#content) and add the AP queues:\n\n```\nconfig :my_app, Oban, queues: [federator_incoming: 50, federator_outgoing: 50, remote_fetcher: 20]\n```\n\nNow you should be able to compile and run your app and move over to integration.\n\n\nThis module is the entrypoint to the ActivityPub API for processing incoming and outgoing federated objects (normalising, saving the the Object storage, passing them to the adapter, and queueing outgoing activities to be pushed out).\n\nIn general, the functions in this module take object-like map.\nThat includes a struct as the input for actor parameters. Use the functions in the `ActivityPub.Actor` module (`ActivityPub.Actor.get_cached/1` for example) to retrieve those.","ref":"ActivityPub.html#module-installation"},{"type":"function","title":"ActivityPub.accept/1","doc":"Generates and federates an Accept activity via the data passed through `params`.","ref":"ActivityPub.html#accept/1"},{"type":"function","title":"ActivityPub.accept_activity/1","doc":"","ref":"ActivityPub.html#accept_activity/1"},{"type":"function","title":"ActivityPub.announce/1","doc":"","ref":"ActivityPub.html#announce/1"},{"type":"function","title":"ActivityPub.block/1","doc":"","ref":"ActivityPub.html#block/1"},{"type":"function","title":"ActivityPub.create/1","doc":"Generates and federates a Create activity via the data passed through `params`.","ref":"ActivityPub.html#create/1"},{"type":"function","title":"ActivityPub.delete/3","doc":"","ref":"ActivityPub.html#delete/3"},{"type":"function","title":"ActivityPub.flag/1","doc":"","ref":"ActivityPub.html#flag/1"},{"type":"function","title":"ActivityPub.follow/1","doc":"Generates and federates a Follow activity.\n\nNote: the follow should be reflected as a Follow on the host database side only after receiving an `Accept` activity in response (though you could register it as a Request if your app has that concept)","ref":"ActivityPub.html#follow/1"},{"type":"function","title":"ActivityPub.like/1","doc":"Record a Like","ref":"ActivityPub.html#like/1"},{"type":"function","title":"ActivityPub.move/4","doc":"","ref":"ActivityPub.html#move/4"},{"type":"function","title":"ActivityPub.reject/1","doc":"Generates and federates a Reject activity via the data passed through `params`.","ref":"ActivityPub.html#reject/1"},{"type":"function","title":"ActivityPub.unannounce/1","doc":"","ref":"ActivityPub.html#unannounce/1"},{"type":"function","title":"ActivityPub.unblock/1","doc":"","ref":"ActivityPub.html#unblock/1"},{"type":"function","title":"ActivityPub.unfollow/1","doc":"Generates and federates an Unfollow activity.","ref":"ActivityPub.html#unfollow/1"},{"type":"function","title":"ActivityPub.unlike/1","doc":"","ref":"ActivityPub.html#unlike/1"},{"type":"function","title":"ActivityPub.update/1","doc":"","ref":"ActivityPub.html#update/1"},{"type":"module","title":"ActivityPub.Actor","doc":"An ActivityPub Actor type and functions for dealing with actors.\n\nSee [4. Actors](https://www.w3.org/TR/activitypub/#actors) in the\nActivityPub specification for more information on Actors.","ref":"ActivityPub.Actor.html"},{"type":"function","title":"ActivityPub.Actor.actor?/1","doc":"","ref":"ActivityPub.Actor.html#actor?/1"},{"type":"function","title":"ActivityPub.Actor.actor_url/1","doc":"","ref":"ActivityPub.Actor.html#actor_url/1"},{"type":"function","title":"ActivityPub.Actor.also_known_as?/2","doc":"","ref":"ActivityPub.Actor.html#also_known_as?/2"},{"type":"function","title":"ActivityPub.Actor.check_actor_is_active/1","doc":"","ref":"ActivityPub.Actor.html#check_actor_is_active/1"},{"type":"function","title":"ActivityPub.Actor.deactivate/1","doc":"","ref":"ActivityPub.Actor.html#deactivate/1"},{"type":"function","title":"ActivityPub.Actor.delete/2","doc":"","ref":"ActivityPub.Actor.html#delete/2"},{"type":"function","title":"ActivityPub.Actor.fetch_by_username/2","doc":"Fetches a remote actor by username in `username@domain.tld` format","ref":"ActivityPub.Actor.html#fetch_by_username/2"},{"type":"function","title":"ActivityPub.Actor.format_remote_actor/1","doc":"","ref":"ActivityPub.Actor.html#format_remote_actor/1"},{"type":"function","title":"ActivityPub.Actor.format_username/1","doc":"","ref":"ActivityPub.Actor.html#format_username/1"},{"type":"function","title":"ActivityPub.Actor.format_username/2","doc":"","ref":"ActivityPub.Actor.html#format_username/2"},{"type":"function","title":"ActivityPub.Actor.get_cached/1","doc":"Fetches an actor given its AP ID / URI, or username@domain, or by a pointer id \n\nRemote actors are just checked if they exist in AP or adapter's database and are NOT fetched remotely if they don't.\n\nRemote actors are also automatically updated every X hours (defaults to 24h).","ref":"ActivityPub.Actor.html#get_cached/1"},{"type":"function","title":"ActivityPub.Actor.get_cached!/1","doc":"","ref":"ActivityPub.Actor.html#get_cached!/1"},{"type":"function","title":"ActivityPub.Actor.get_cached_or_fetch/1","doc":"Tries to get a local actor by username or tries to fetch it remotely if username is provided in `username@domain.tld` format.","ref":"ActivityPub.Actor.html#get_cached_or_fetch/1"},{"type":"function","title":"ActivityPub.Actor.get_external_followers/1","doc":"","ref":"ActivityPub.Actor.html#get_external_followers/1"},{"type":"function","title":"ActivityPub.Actor.get_followers/1","doc":"","ref":"ActivityPub.Actor.html#get_followers/1"},{"type":"function","title":"ActivityPub.Actor.get_followings/1","doc":"","ref":"ActivityPub.Actor.html#get_followings/1"},{"type":"function","title":"ActivityPub.Actor.get_non_cached/1","doc":"","ref":"ActivityPub.Actor.html#get_non_cached/1"},{"type":"function","title":"ActivityPub.Actor.invalidate_cache/1","doc":"","ref":"ActivityPub.Actor.html#invalidate_cache/1"},{"type":"function","title":"ActivityPub.Actor.maybe_create_actor_from_object/1","doc":"","ref":"ActivityPub.Actor.html#maybe_create_actor_from_object/1"},{"type":"function","title":"ActivityPub.Actor.reactivate/1","doc":"","ref":"ActivityPub.Actor.html#reactivate/1"},{"type":"function","title":"ActivityPub.Actor.save_actor_tombstone/2","doc":"","ref":"ActivityPub.Actor.html#save_actor_tombstone/2"},{"type":"function","title":"ActivityPub.Actor.set_cache/1","doc":"","ref":"ActivityPub.Actor.html#set_cache/1"},{"type":"function","title":"ActivityPub.Actor.swap_or_create_actor_tombstone/1","doc":"","ref":"ActivityPub.Actor.html#swap_or_create_actor_tombstone/1"},{"type":"function","title":"ActivityPub.Actor.update_actor/1","doc":"Updates an existing actor struct by its AP ID.","ref":"ActivityPub.Actor.html#update_actor/1"},{"type":"function","title":"ActivityPub.Actor.update_actor/2","doc":"","ref":"ActivityPub.Actor.html#update_actor/2"},{"type":"type","title":"ActivityPub.Actor.ap_id/0","doc":"The ActivityPub ID of an object, which must be a publicly-dereferencable URI,\nor `nil` if the object is anonymous.\n\nNote that since the URI must be publicly-dereferencable,\nyou should set this value to `ActivityPub.Federator.Adapter.base_url() <> ~p\"/pub/actors/#{username}\"`.\nThis path is defined in `ActivityPub.Web.Endpoint` and serves data provided\nby the functions in `ActivityPub.Federator.Adapter`.\n\nSee section [3.1 Object Identifiers](https://www.w3.org/TR/activitypub/#obj-id)\nin the ActivityPub spec for more information on the format.","ref":"ActivityPub.Actor.html#t:ap_id/0"},{"type":"type","title":"Examples - ActivityPub.Actor.ap_id/0","doc":"\"https://kenzoishii.example.com/\"\n\n \"http://localhost:4000/pub/actors/rosa\"","ref":"ActivityPub.Actor.html#t:ap_id/0-examples"},{"type":"type","title":"ActivityPub.Actor.id/0","doc":"Your app's internal ID for an `Actor`.","ref":"ActivityPub.Actor.html#t:id/0"},{"type":"type","title":"Examples - ActivityPub.Actor.id/0","doc":"\"c1688a22-4e9c-42d7-935b-1f17e1d0cf58\"\n\n \"1234\"","ref":"ActivityPub.Actor.html#t:id/0-examples"},{"type":"type","title":"ActivityPub.Actor.pointer/0","doc":"An association (by default a `Needle.Pointer`) that references an `Actor`.\n\nPointers consist of a table ID, referencing a database table,\nand a pointer ID, referencing a row in that table.\nTable and pointer IDs are both `Pointers.ULID` strings, which is UUID-like.","ref":"ActivityPub.Actor.html#t:pointer/0"},{"type":"type","title":"ActivityPub.Actor.pointer_id/0","doc":"A ULID ID (eg. using the `Needle.ULID`library) that links an `Actor` to its object in the app's database.","ref":"ActivityPub.Actor.html#t:pointer_id/0"},{"type":"type","title":"ActivityPub.Actor.t/0","doc":"An ActivityPub Actor.","ref":"ActivityPub.Actor.html#t:t/0"},{"type":"type","title":"ActivityPub.Actor.username/0","doc":"An `Actor`'s user name, used as part of its ActivityPub ID.","ref":"ActivityPub.Actor.html#t:username/0"},{"type":"type","title":"Examples - ActivityPub.Actor.username/0","doc":"\"alyssa\"\n\n \"ben\"","ref":"ActivityPub.Actor.html#t:username/0-examples"},{"type":"module","title":"ActivityPub.Config","doc":"","ref":"ActivityPub.Config.html"},{"type":"function","title":"ActivityPub.Config.actors_and_collections/0","doc":"","ref":"ActivityPub.Config.html#actors_and_collections/0"},{"type":"function","title":"ActivityPub.Config.collection_types/0","doc":"","ref":"ActivityPub.Config.html#collection_types/0"},{"type":"function","title":"ActivityPub.Config.delete/1","doc":"","ref":"ActivityPub.Config.html#delete/1"},{"type":"function","title":"ActivityPub.Config.env/0","doc":"","ref":"ActivityPub.Config.html#env/0"},{"type":"function","title":"ActivityPub.Config.federating?/0","doc":"","ref":"ActivityPub.Config.html#federating?/0"},{"type":"function","title":"ActivityPub.Config.get/1","doc":"","ref":"ActivityPub.Config.html#get/1"},{"type":"function","title":"ActivityPub.Config.get/2","doc":"","ref":"ActivityPub.Config.html#get/2"},{"type":"function","title":"ActivityPub.Config.get!/1","doc":"","ref":"ActivityPub.Config.html#get!/1"},{"type":"macro","title":"ActivityPub.Config.is_in/2","doc":"For matching against the above list in guards TODO: use runtime config","ref":"ActivityPub.Config.html#is_in/2"},{"type":"function","title":"ActivityPub.Config.public_uri/0","doc":"","ref":"ActivityPub.Config.html#public_uri/0"},{"type":"function","title":"ActivityPub.Config.public_uris/0","doc":"","ref":"ActivityPub.Config.html#public_uris/0"},{"type":"function","title":"ActivityPub.Config.put/2","doc":"","ref":"ActivityPub.Config.html#put/2"},{"type":"function","title":"ActivityPub.Config.supported_activity_types/0","doc":"","ref":"ActivityPub.Config.html#supported_activity_types/0"},{"type":"function","title":"ActivityPub.Config.supported_actor_types/0","doc":"","ref":"ActivityPub.Config.html#supported_actor_types/0"},{"type":"exception","title":"ActivityPub.Config.Error","doc":"","ref":"ActivityPub.Config.Error.html"},{"type":"module","title":"ActivityPub.Federator","doc":"","ref":"ActivityPub.Federator.html"},{"type":"function","title":"ActivityPub.Federator.perform/3","doc":"","ref":"ActivityPub.Federator.html#perform/3"},{"type":"function","title":"ActivityPub.Federator.publish/2","doc":"","ref":"ActivityPub.Federator.html#publish/2"},{"type":"module","title":"ActivityPub.Federator.APPublisher","doc":"","ref":"ActivityPub.Federator.APPublisher.html"},{"type":"function","title":"ActivityPub.Federator.APPublisher.determine_inbox/4","doc":"Determine a user inbox to use based on heuristics. These heuristics\nare based on an approximation of the ``sharedInbox`` rules in the\n[ActivityPub specification][ap-sharedinbox].\n\n [ap-sharedinbox]: https://www.w3.org/TR/activitypub/#shared-inbox-delivery","ref":"ActivityPub.Federator.APPublisher.html#determine_inbox/4"},{"type":"function","title":"ActivityPub.Federator.APPublisher.gather_webfinger_links/1","doc":"","ref":"ActivityPub.Federator.APPublisher.html#gather_webfinger_links/1"},{"type":"function","title":"ActivityPub.Federator.APPublisher.is_representable?/1","doc":"","ref":"ActivityPub.Federator.APPublisher.html#is_representable?/1"},{"type":"function","title":"ActivityPub.Federator.APPublisher.maybe_federate_to_search_index/2","doc":"If you put the URL of the shared inbox of an ActivityPub instance in the following env variable, all public content will be pushed there via AP federation for search indexing purposes: PUSH_ALL_PUBLIC_CONTENT_TO_INSTANCE\n#TODO: move to adapter","ref":"ActivityPub.Federator.APPublisher.html#maybe_federate_to_search_index/2"},{"type":"function","title":"ActivityPub.Federator.APPublisher.publish/3","doc":"","ref":"ActivityPub.Federator.APPublisher.html#publish/3"},{"type":"function","title":"ActivityPub.Federator.APPublisher.publish_one/1","doc":"Publish a single message to a peer. Takes a struct with the following\nparameters set:\n\n* `inbox`: the inbox to publish to\n* `json`: the JSON message body representing the ActivityPub message\n* `actor`: the actor which is signing the message\n* `id`: the ActivityStreams URI of the message","ref":"ActivityPub.Federator.APPublisher.html#publish_one/1"},{"type":"behaviour","title":"ActivityPub.Federator.Adapter","doc":"Contract for ActivityPub module adapters","ref":"ActivityPub.Federator.Adapter.html"},{"type":"function","title":"ActivityPub.Federator.Adapter.adapter/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#adapter/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.base_url/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#base_url/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.base_url/0","doc":"The base URL of the application serving `ActivityPub.Web.Endpoint`.","ref":"ActivityPub.Federator.Adapter.html#c:base_url/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.call_or/3","doc":"Run function from adapter if defined, otherwise return fallback value","ref":"ActivityPub.Federator.Adapter.html#call_or/3"},{"type":"function","title":"ActivityPub.Federator.Adapter.external_followers_for_activity/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#external_followers_for_activity/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.external_followers_for_activity/2","doc":"Compute and return a subset of followers that should receive a specific activity (optional)","ref":"ActivityPub.Federator.Adapter.html#c:external_followers_for_activity/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.federate_actor?/3","doc":"Whether this (local or remote) actor has federation enabled and/or is blocked on this instance\n\nactor: the actor to check (eg. Alice)\ndirection: :in or :out - whether we're dealing with incoming federation or outgoing (optional)\nby_actor: optionally another actor (eg. if Alice is sending something to Bob, this would be Bob)","ref":"ActivityPub.Federator.Adapter.html#federate_actor?/3"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_ap_id/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_ap_id/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_ap_id/1","doc":"Fetch an `Actor` by its full ActivityPub ID.","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_ap_id/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_id/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_id/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_id/1","doc":"Fetch an `Actor` by its ID in the host application database.","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_id/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_actor_by_username/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_actor_by_username/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_actor_by_username/1","doc":"Fetch an `Actor` given its preferred username","ref":"ActivityPub.Federator.Adapter.html#c:get_actor_by_username/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_follower_local_ids/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_follower_local_ids/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_follower_local_ids/1","doc":"Get the host application IDs for all `Actor`s following the given `Actor`.","ref":"ActivityPub.Federator.Adapter.html#c:get_follower_local_ids/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_following_local_ids/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_following_local_ids/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_following_local_ids/1","doc":"Get the host application IDs for all `Actor`s that the given `Actor` is following.","ref":"ActivityPub.Federator.Adapter.html#c:get_following_local_ids/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_locale/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_locale/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_locale/0","doc":"Get the default locale of the host application.","ref":"ActivityPub.Federator.Adapter.html#c:get_locale/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_or_create_service_actor/0","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_or_create_service_actor/0"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_or_create_service_actor/0","doc":"Creates an internal service actor by username, if missing.","ref":"ActivityPub.Federator.Adapter.html#c:get_or_create_service_actor/0"},{"type":"function","title":"ActivityPub.Federator.Adapter.get_redirect_url/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#get_redirect_url/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.get_redirect_url/1","doc":"Gets local url of an AP object to redirect in browser. Can take pointer id or an actor username.","ref":"ActivityPub.Federator.Adapter.html#c:get_redirect_url/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.handle_activity/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#handle_activity/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.handle_activity/1","doc":"Passes data to be handled by the host application","ref":"ActivityPub.Federator.Adapter.html#c:handle_activity/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_create_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_create_remote_actor/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.maybe_create_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:maybe_create_remote_actor/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_handle_activity/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_handle_activity/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.maybe_publish_object/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#maybe_publish_object/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.maybe_publish_object/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:maybe_publish_object/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_local_actor/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_local_actor/2"},{"type":"callback","title":"ActivityPub.Federator.Adapter.update_local_actor/2","doc":"Commit new fields to the host application database for the given `Actor`.","ref":"ActivityPub.Federator.Adapter.html#c:update_local_actor/2"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_remote_actor/1"},{"type":"callback","title":"ActivityPub.Federator.Adapter.update_remote_actor/1","doc":"","ref":"ActivityPub.Federator.Adapter.html#c:update_remote_actor/1"},{"type":"function","title":"ActivityPub.Federator.Adapter.update_remote_actor/2","doc":"","ref":"ActivityPub.Federator.Adapter.html#update_remote_actor/2"},{"type":"module","title":"ActivityPub.Federator.Fetcher","doc":"Handles fetching AS2 objects from remote instances.","ref":"ActivityPub.Federator.Fetcher.html"},{"type":"function","title":"ActivityPub.Federator.Fetcher.allowed_recursion?/2","doc":"Returns `true` if the distance to target object does not exceed max configured value.\nServes to prevent fetching of very long threads, especially useful on smaller instances.\nAddresses memory leaks on recursive replies fetching.\nApplies to fetching of both ancestor (reply-to) and child (reply) objects.","ref":"ActivityPub.Federator.Fetcher.html#allowed_recursion?/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.cache_fetch_error/1","doc":"","ref":"ActivityPub.Federator.Fetcher.html#cache_fetch_error/1"},{"type":"function","title":"ActivityPub.Federator.Fetcher.enqueue_fetch/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#enqueue_fetch/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_collection/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_collection/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_fresh_object_from_id/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_fresh_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_object_from_id/2","doc":"Checks if an object exists in the AP and Adapter databases and fetches and creates it if not.","ref":"ActivityPub.Federator.Fetcher.html#fetch_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_objects_from_id/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_objects_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_outbox/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_outbox/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_remote_object_from_id/2","doc":"Fetches an AS2 object from remote AP ID.","ref":"ActivityPub.Federator.Fetcher.html#fetch_remote_object_from_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_replies/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_replies/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.fetch_thread/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#fetch_thread/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.get_cached_object_or_fetch_ap_id/2","doc":"Checks if an object exists in the AP database and fetches it if not (but does not send to Adapter).","ref":"ActivityPub.Federator.Fetcher.html#get_cached_object_or_fetch_ap_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.get_cached_object_or_fetch_pointer_id/2","doc":"Checks if an object exists in the AP database and prepares it if not (local objects only).","ref":"ActivityPub.Federator.Fetcher.html#get_cached_object_or_fetch_pointer_id/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.maybe_fetch/2","doc":"Fetch a list of objects within recursion limits. Used for reply_to/context, and replies or similar collections.","ref":"ActivityPub.Federator.Fetcher.html#maybe_fetch/2"},{"type":"function","title":"ActivityPub.Federator.Fetcher.maybe_parse_header_url/2","doc":"","ref":"ActivityPub.Federator.Fetcher.html#maybe_parse_header_url/2"},{"type":"module","title":"ActivityPub.Federator.HTTP","doc":"Module for building and performing HTTP requests.","ref":"ActivityPub.Federator.HTTP.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.delete/4","doc":"Makes a DELETE request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#delete/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.get/3","doc":"Makes a GET request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#get/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.http_request/5","doc":"Builds and perform http request.\n\n# Arguments:\n`method` - :get, :post, :put, :delete\n`url`\n`body`\n`headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n`options` - custom, per-request middleware or adapter options\n\n# Returns:\n`{:ok, %Tesla.Env{}}` or `{:error, error}`","ref":"ActivityPub.Federator.HTTP.html#http_request/5"},{"type":"function","title":"ActivityPub.Federator.HTTP.post/4","doc":"Makes a POST request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#post/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.put/4","doc":"Makes a PUT request\n\nsee `ActivityPub.Federator.HTTP.http_request/5`","ref":"ActivityPub.Federator.HTTP.html#put/4"},{"type":"type","title":"ActivityPub.Federator.HTTP.t/0","doc":"","ref":"ActivityPub.Federator.HTTP.html#t:t/0"},{"type":"module","title":"ActivityPub.Federator.HTTP.Connection","doc":"Specifies connection options for HTTP requests","ref":"ActivityPub.Federator.HTTP.Connection.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.Connection.adapter_options/2","doc":"","ref":"ActivityPub.Federator.HTTP.Connection.html#adapter_options/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.Connection.new/1","doc":"","ref":"ActivityPub.Federator.HTTP.Connection.html#new/1"},{"type":"module","title":"ActivityPub.Federator.HTTP.RateLimit","doc":"Rate limit middleware for Tesla using Hammer\nBased on `TeslaExtra.RateLimit` and `TeslaExtra.RetryAfter`","ref":"ActivityPub.Federator.HTTP.RateLimit.html"},{"type":"module","title":"ActivityPub.Federator.HTTP.RequestBuilder","doc":"Helper functions for building HTTP requests","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.add_param/4","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#add_param/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.headers/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#headers/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.method/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#method/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.opts/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#opts/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.RequestBuilder.url/2","doc":"","ref":"ActivityPub.Federator.HTTP.RequestBuilder.html#url/2"},{"type":"module","title":"ActivityPub.Federator.HTTP.RetryAfter","doc":"Takes into account the Retry-After header returned by the server when the rate limit is exceeded.\n\nBased on `TeslaExtra.RetryAfter`","ref":"ActivityPub.Federator.HTTP.RetryAfter.html"},{"type":"module","title":"ActivityPub.Federator.HTTP.Tesla","doc":"","ref":"ActivityPub.Federator.HTTP.Tesla.html"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#delete/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#delete!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#get/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#get!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#head/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#head!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#options/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#options!/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#patch/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#patch!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#post/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#post!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#put/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"ActivityPub.Federator.HTTP.Tesla.html#put!/4"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.request/2","doc":"Perform a request.","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2"},{"type":"function","title":"Options - ActivityPub.Federator.HTTP.Tesla.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2-options"},{"type":"function","title":"Examples - ActivityPub.Federator.HTTP.Tesla.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#request/2-examples"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"ActivityPub.Federator.HTTP.Tesla.html#request!/2"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#trace/3"},{"type":"function","title":"ActivityPub.Federator.HTTP.Tesla.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"ActivityPub.Federator.HTTP.Tesla.html#trace!/3"},{"type":"type","title":"ActivityPub.Federator.HTTP.Tesla.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"ActivityPub.Federator.HTTP.Tesla.html#t:option/0"},{"type":"behaviour","title":"ActivityPub.Federator.Publisher","doc":"Defines the contract used by federation implementations to publish messages to\ntheir peers.\n# TODO: why not use `APPublisher` directly instead?","ref":"ActivityPub.Federator.Publisher.html"},{"type":"function","title":"ActivityPub.Federator.Publisher.enqueue_one/2","doc":"Enqueue publishing a single activity.","ref":"ActivityPub.Federator.Publisher.html#enqueue_one/2"},{"type":"function","title":"ActivityPub.Federator.Publisher.gather_webfinger_links/1","doc":"","ref":"ActivityPub.Federator.Publisher.html#gather_webfinger_links/1"},{"type":"callback","title":"ActivityPub.Federator.Publisher.gather_webfinger_links/1","doc":"Gathers links used by an outgoing federation module for WebFinger output.","ref":"ActivityPub.Federator.Publisher.html#c:gather_webfinger_links/1"},{"type":"callback","title":"ActivityPub.Federator.Publisher.is_representable?/1","doc":"Determine whether an activity can be relayed using the federation module.","ref":"ActivityPub.Federator.Publisher.html#c:is_representable?/1"},{"type":"function","title":"ActivityPub.Federator.Publisher.publish/2","doc":"","ref":"ActivityPub.Federator.Publisher.html#publish/2"},{"type":"callback","title":"ActivityPub.Federator.Publisher.publish/2","doc":"Relays an activity to all specified peers.","ref":"ActivityPub.Federator.Publisher.html#c:publish/2"},{"type":"callback","title":"ActivityPub.Federator.Publisher.publish_one/1","doc":"Relays an activity to a specified peer, determined by the parameters. The\nparameters used are controlled by the federation module.","ref":"ActivityPub.Federator.Publisher.html#c:publish_one/1"},{"type":"module","title":"ActivityPub.Federator.Transformer","doc":"This module normalises outgoing data to conform with AS2/AP specs\nand handles incoming objects and activities","ref":"ActivityPub.Federator.Transformer.html"},{"type":"function","title":"ActivityPub.Federator.Transformer.add_emoji_tags/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#add_emoji_tags/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_actor/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_actor/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_addressing/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_addressing/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_attachments/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_attachments/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_content_map/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_content_map/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_context/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_context/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_emoji/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_emoji/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_in_reply_to/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_in_reply_to/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_object/2","doc":"Modifies an incoming AP object (mastodon format) to our internal format.","ref":"ActivityPub.Federator.Transformer.html#fix_object/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_quote_url/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_quote_url/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_replies/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_replies/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_summary/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_summary/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_tag/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_tag/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.fix_url/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#fix_url/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.format_input/3","doc":"","ref":"ActivityPub.Federator.Transformer.html#format_input/3"},{"type":"function","title":"ActivityPub.Federator.Transformer.handle_incoming/2","doc":"Handles incoming data, inserts it into the database and triggers side effects if the data is a supported activity type.","ref":"ActivityPub.Federator.Transformer.html#handle_incoming/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.maybe_handle_other_activity/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#maybe_handle_other_activity/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.prepare_outgoing/1","doc":"Translates MN Entity to an AP compatible format","ref":"ActivityPub.Federator.Transformer.html#prepare_outgoing/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.preserve_privacy_of_outgoing/2","doc":"","ref":"ActivityPub.Federator.Transformer.html#preserve_privacy_of_outgoing/2"},{"type":"function","title":"ActivityPub.Federator.Transformer.replies/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#replies/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.set_replies/1","doc":"Serialized Mastodon-compatible `replies` collection containing _self-replies_.\nBased on Mastodon's ActivityPub::NoteSerializer#replies.","ref":"ActivityPub.Federator.Transformer.html#set_replies/1"},{"type":"function","title":"ActivityPub.Federator.Transformer.take_emoji_tags/1","doc":"","ref":"ActivityPub.Federator.Transformer.html#take_emoji_tags/1"},{"type":"module","title":"ActivityPub.Federator.WebFinger","doc":"Serves and fetches data (mainly actor URI) necessary for federation when only the username and host is known.","ref":"ActivityPub.Federator.WebFinger.html"},{"type":"function","title":"ActivityPub.Federator.WebFinger.base_url/1","doc":"","ref":"ActivityPub.Federator.WebFinger.html#base_url/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.finger/1","doc":"Fetches webfinger data for an account given in \"@username@domain.tld\" format.","ref":"ActivityPub.Federator.WebFinger.html#finger/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.output/1","doc":"Serves a webfinger response for the requested username.","ref":"ActivityPub.Federator.WebFinger.html#output/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.represent_user/1","doc":"Formats gathered data into a JRD format.","ref":"ActivityPub.Federator.WebFinger.html#represent_user/1"},{"type":"function","title":"ActivityPub.Federator.WebFinger.webfinger_from_json/1","doc":"","ref":"ActivityPub.Federator.WebFinger.html#webfinger_from_json/1"},{"type":"module","title":"ActivityPub.Federator.Worker","doc":"Helpers for workers to `use`","ref":"ActivityPub.Federator.Worker.html"},{"type":"function","title":"ActivityPub.Federator.Worker.worker_args/1","doc":"","ref":"ActivityPub.Federator.Worker.html#worker_args/1"},{"type":"module","title":"ActivityPub.Federator.Workers.PublisherWorker","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.PublisherWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.PublisherWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.PublisherWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Federator.Workers.ReceiverWorker","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.ReceiverWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.ReceiverWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.ReceiverWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html"},{"type":"function","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker.enqueue/3","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html#enqueue/3"},{"type":"function","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker.enqueueable/3","doc":"","ref":"ActivityPub.Federator.Workers.RemoteFetcherWorker.html#enqueueable/3"},{"type":"module","title":"ActivityPub.Fixtures","doc":"","ref":"ActivityPub.Fixtures.html"},{"type":"function","title":"ActivityPub.Fixtures.file/1","doc":"","ref":"ActivityPub.Fixtures.html#file/1"},{"type":"function","title":"ActivityPub.Fixtures.fixtures/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures/0"},{"type":"function","title":"ActivityPub.Fixtures.fixtures_generic/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures_generic/0"},{"type":"function","title":"ActivityPub.Fixtures.fixtures_get/0","doc":"","ref":"ActivityPub.Fixtures.html#fixtures_get/0"},{"type":"function","title":"ActivityPub.Fixtures.get/4","doc":"","ref":"ActivityPub.Fixtures.html#get/4"},{"type":"function","title":"ActivityPub.Fixtures.head/4","doc":"","ref":"ActivityPub.Fixtures.html#head/4"},{"type":"function","title":"ActivityPub.Fixtures.insert/1","doc":"","ref":"ActivityPub.Fixtures.html#insert/1"},{"type":"function","title":"ActivityPub.Fixtures.insert_all/0","doc":"","ref":"ActivityPub.Fixtures.html#insert_all/0"},{"type":"function","title":"ActivityPub.Fixtures.insert_file/1","doc":"","ref":"ActivityPub.Fixtures.html#insert_file/1"},{"type":"function","title":"ActivityPub.Fixtures.insert_json/1","doc":"","ref":"ActivityPub.Fixtures.html#insert_json/1"},{"type":"function","title":"ActivityPub.Fixtures.maybe_get_local/4","doc":"","ref":"ActivityPub.Fixtures.html#maybe_get_local/4"},{"type":"function","title":"ActivityPub.Fixtures.mock_global/1","doc":"","ref":"ActivityPub.Fixtures.html#mock_global/1"},{"type":"function","title":"ActivityPub.Fixtures.none/4","doc":"","ref":"ActivityPub.Fixtures.html#none/4"},{"type":"function","title":"ActivityPub.Fixtures.post/4","doc":"","ref":"ActivityPub.Fixtures.html#post/4"},{"type":"function","title":"ActivityPub.Fixtures.request/1","doc":"","ref":"ActivityPub.Fixtures.html#request/1"},{"type":"module","title":"ActivityPub.Instances","doc":"Instances context.","ref":"ActivityPub.Instances.html"},{"type":"function","title":"ActivityPub.Instances.filter_reachable/1","doc":"","ref":"ActivityPub.Instances.html#filter_reachable/1"},{"type":"function","title":"ActivityPub.Instances.host/1","doc":"","ref":"ActivityPub.Instances.html#host/1"},{"type":"function","title":"ActivityPub.Instances.reachability_datetime_threshold/0","doc":"","ref":"ActivityPub.Instances.html#reachability_datetime_threshold/0"},{"type":"function","title":"ActivityPub.Instances.reachable?/1","doc":"","ref":"ActivityPub.Instances.html#reachable?/1"},{"type":"function","title":"ActivityPub.Instances.scrape_nodeinfo/1","doc":"","ref":"ActivityPub.Instances.html#scrape_nodeinfo/1"},{"type":"function","title":"ActivityPub.Instances.set_consistently_unreachable/1","doc":"","ref":"ActivityPub.Instances.html#set_consistently_unreachable/1"},{"type":"function","title":"ActivityPub.Instances.set_reachable/1","doc":"","ref":"ActivityPub.Instances.html#set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.set_unreachable/2","doc":"","ref":"ActivityPub.Instances.html#set_unreachable/2"},{"type":"module","title":"ActivityPub.Instances.Instance","doc":"Instance.","ref":"ActivityPub.Instances.Instance.html"},{"type":"function","title":"ActivityPub.Instances.Instance.changeset/2","doc":"","ref":"ActivityPub.Instances.Instance.html#changeset/2"},{"type":"function","title":"ActivityPub.Instances.Instance.do_set_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#do_set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.filter_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#filter_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.host/1","doc":"","ref":"ActivityPub.Instances.Instance.html#host/1"},{"type":"function","title":"ActivityPub.Instances.Instance.reachable?/1","doc":"","ref":"ActivityPub.Instances.Instance.html#reachable?/1"},{"type":"function","title":"ActivityPub.Instances.Instance.set_reachable/1","doc":"","ref":"ActivityPub.Instances.Instance.html#set_reachable/1"},{"type":"function","title":"ActivityPub.Instances.Instance.set_unreachable/2","doc":"","ref":"ActivityPub.Instances.Instance.html#set_unreachable/2"},{"type":"behaviour","title":"ActivityPub.MRF","doc":"Message Rewrite Facility\n\n**WARNING: Due to how this app currently handles its configuration, MRF is only usable if you're building your own docker image.**\n\nThe Message Rewrite Facility (MRF) is a subsystem that is implemented as a series of hooks that allows the administrator to rewrite or discard messages.\n\nPossible uses include:\n\n- marking incoming messages with media from a given account or instance as sensitive\n- rejecting messages from a specific instance\n- rejecting reports (flags) from a specific instance\n- removing/unlisting messages from the public timelines\n- removing media from messages\n- sending only public messages to a specific instance\n\nThe MRF provides user-configurable policies. The default policy is `NoOpPolicy`, which disables the MRF functionality. Bonfire also includes an easy to use policy called `SimplePolicy` which maps messages matching certain pre-defined criterion to actions built into the policy module. It is possible to use multiple, active MRF policies at the same time.\n\n> See the docs of `ActivityPub.MRF.SimplePolicy` for details about how to use it.","ref":"ActivityPub.MRF.html"},{"type":"behaviour","title":"Use with Care - ActivityPub.MRF","doc":"The effects of MRF policies can be very drastic. It is important to use this functionality carefully. Always try to talk to an admin before writing an MRF policy concerning their instance.","ref":"ActivityPub.MRF.html#module-use-with-care"},{"type":"behaviour","title":"Writing your own MRF Policy - ActivityPub.MRF","doc":"As discussed above, the MRF system is a modular system that supports pluggable policies. This means that an admin may write a custom MRF policy in Elixir or any other language that runs on the Erlang VM, by specifying the module name in the `rewrite_policy` config setting.\n\nFor example, here is a sample policy module which rewrites all messages to \"new message content\":\n\n```elixir\n# This is a sample MRF policy which rewrites all Notes to have \"new message\n# content.\"\ndefmodule Site.RewritePolicy do\n @behavior ActivityPub.MRF\n\n # Catch messages which contain Note objects with actual data to filter.\n # Capture the object as `object`, the message content as `content` and the\n # entire activity itself as `activity`.\n @impl true\n def filter(%{\"type\" => \"Create\", \"object\" => %{\"type\" => \"Note\", \"content\" => content} = object} = message)\n when is_binary(content) do\n # Subject / CW is stored as summary instead of `name` like other AS2 objects\n # because of Mastodon doing it that way.\n summary = object[\"summary\"]\n\n # edits go here.\n content = \"new message content\"\n\n # Assemble the mutated object.\n object =\n object\n |> Map.put(\"content\", content)\n |> Map.put(\"summary\", summary)\n\n # Assemble the mutated activity.\n {:ok, Map.put(activity, \"object\", object)}\n end\n\n # Let all other messages through without modifying them.\n @impl true\n def filter(message), do: {:ok, message}\nend\n```\n\nIf you save this file as `lib/site/mrf/rewrite_policy.ex`, it will be included when you next rebuild Bonfire. You can enable it in the configuration like so:\n\n```\nconfig :activity_pub, :instance,\n rewrite_policy: [\n ActivityPub.MRF.SimplePolicy,\n Site.RewritePolicy\n ]\n```","ref":"ActivityPub.MRF.html#module-writing-your-own-mrf-policy"},{"type":"function","title":"ActivityPub.MRF.filter/2","doc":"","ref":"ActivityPub.MRF.html#filter/2"},{"type":"callback","title":"ActivityPub.MRF.filter/2","doc":"","ref":"ActivityPub.MRF.html#c:filter/2"},{"type":"function","title":"ActivityPub.MRF.filter/3","doc":"","ref":"ActivityPub.MRF.html#filter/3"},{"type":"function","title":"ActivityPub.MRF.get_policies/0","doc":"","ref":"ActivityPub.MRF.html#get_policies/0"},{"type":"function","title":"ActivityPub.MRF.subdomain_match?/2","doc":"","ref":"ActivityPub.MRF.html#subdomain_match?/2"},{"type":"function","title":"ActivityPub.MRF.subdomains_regex/1","doc":"","ref":"ActivityPub.MRF.html#subdomains_regex/1"},{"type":"module","title":"ActivityPub.MRF.SimplePolicy","doc":"Filter activities depending on their origin instance or other criteria.\n\n`SimplePolicy` is capable of handling most common admin tasks.\n\nTo use `SimplePolicy`, you must enable it. Do so by adding the following to your `:instance` config object, so that it looks like this:\n\n```\nconfig :bonfire, :instance,\n [...]\n rewrite_policy: ActivityPub.MRF.SimplePolicy\n```\n\nOnce `SimplePolicy` is enabled, you can configure various groups in the `:mrf_simple` config object. These groups are:\n\n- `media_removal`: Servers in this group will have media stripped from incoming messages.\n- `media_nsfw`: Servers in this group will have the #nsfw tag and sensitive setting injected into incoming messages which contain media.\n- `reject`: Servers in this group will have their messages rejected.\n- `report_removal`: Servers in this group will have their reports (flags) rejected.\n\nServers should be configured as lists.","ref":"ActivityPub.MRF.SimplePolicy.html"},{"type":"module","title":"Example - ActivityPub.MRF.SimplePolicy","doc":"This example will enable `SimplePolicy`, block media from `illegalporn.biz`, mark media as NSFW from `porn.biz` and `porn.business`, reject messages from `spam.com` and block reports (flags) from `troll.mob`:\n\n```\nconfig :activity_pub, :instance,\n rewrite_policy: [ActivityPub.MRF.SimplePolicy]\n\nconfig :activity_pub, :mrf_simple,\n media_removal: [\"illegalporn.biz\"],\n media_nsfw: [\"porn.biz\", \"porn.business\"],\n reject: [\"spam.com\"],\n report_removal: [\"troll.mob\"]\n\n```","ref":"ActivityPub.MRF.SimplePolicy.html#module-example"},{"type":"function","title":"ActivityPub.MRF.SimplePolicy.check_reject/2","doc":"","ref":"ActivityPub.MRF.SimplePolicy.html#check_reject/2"},{"type":"module","title":"ActivityPub.Object","doc":"","ref":"ActivityPub.Object.html"},{"type":"function","title":"ActivityPub.Object.actor_from_data/1","doc":"","ref":"ActivityPub.Object.html#actor_from_data/1"},{"type":"function","title":"ActivityPub.Object.actor_id_from_data/1","doc":"","ref":"ActivityPub.Object.html#actor_id_from_data/1"},{"type":"function","title":"ActivityPub.Object.all/1","doc":"","ref":"ActivityPub.Object.html#all/1"},{"type":"function","title":"ActivityPub.Object.changeset/1","doc":"","ref":"ActivityPub.Object.html#changeset/1"},{"type":"function","title":"ActivityPub.Object.changeset/2","doc":"","ref":"ActivityPub.Object.html#changeset/2"},{"type":"function","title":"ActivityPub.Object.common_changeset/1","doc":"","ref":"ActivityPub.Object.html#common_changeset/1"},{"type":"function","title":"ActivityPub.Object.delete/1","doc":"","ref":"ActivityPub.Object.html#delete/1"},{"type":"function","title":"ActivityPub.Object.do_insert/1","doc":"","ref":"ActivityPub.Object.html#do_insert/1"},{"type":"function","title":"ActivityPub.Object.do_update_existing/2","doc":"","ref":"ActivityPub.Object.html#do_update_existing/2"},{"type":"function","title":"ActivityPub.Object.fetch_latest_block/2","doc":"","ref":"ActivityPub.Object.html#fetch_latest_block/2"},{"type":"function","title":"ActivityPub.Object.fetch_latest_follow/2","doc":"","ref":"ActivityPub.Object.html#fetch_latest_follow/2"},{"type":"function","title":"ActivityPub.Object.get_activity_for_object_ap_id/2","doc":"","ref":"ActivityPub.Object.html#get_activity_for_object_ap_id/2"},{"type":"function","title":"ActivityPub.Object.get_ap_id/1","doc":"","ref":"ActivityPub.Object.html#get_ap_id/1"},{"type":"function","title":"ActivityPub.Object.get_cached/1","doc":"","ref":"ActivityPub.Object.html#get_cached/1"},{"type":"function","title":"ActivityPub.Object.get_cached!/1","doc":"","ref":"ActivityPub.Object.html#get_cached!/1"},{"type":"function","title":"ActivityPub.Object.get_existing_announce/2","doc":"Retruns an existing announce activity if the notice has already been announced","ref":"ActivityPub.Object.html#get_existing_announce/2"},{"type":"function","title":"ActivityPub.Object.get_existing_like/2","doc":"Returns an existing like if a user already liked an object","ref":"ActivityPub.Object.html#get_existing_like/2"},{"type":"function","title":"ActivityPub.Object.get_follow_activity/2","doc":"","ref":"ActivityPub.Object.html#get_follow_activity/2"},{"type":"function","title":"ActivityPub.Object.get_inbox/2","doc":"","ref":"ActivityPub.Object.html#get_inbox/2"},{"type":"function","title":"ActivityPub.Object.get_outbox_for_actor/2","doc":"","ref":"ActivityPub.Object.html#get_outbox_for_actor/2"},{"type":"function","title":"ActivityPub.Object.get_outbox_for_instance/1","doc":"","ref":"ActivityPub.Object.html#get_outbox_for_instance/1"},{"type":"function","title":"ActivityPub.Object.get_uncached/1","doc":"","ref":"ActivityPub.Object.html#get_uncached/1"},{"type":"function","title":"ActivityPub.Object.hard_delete/1","doc":"","ref":"ActivityPub.Object.html#hard_delete/1"},{"type":"function","title":"ActivityPub.Object.hashtags/1","doc":"","ref":"ActivityPub.Object.html#hashtags/1"},{"type":"function","title":"ActivityPub.Object.invalidate_cache/1","doc":"","ref":"ActivityPub.Object.html#invalidate_cache/1"},{"type":"function","title":"ActivityPub.Object.is_deleted?/1","doc":"","ref":"ActivityPub.Object.html#is_deleted?/1"},{"type":"function","title":"ActivityPub.Object.make_tombstone/2","doc":"","ref":"ActivityPub.Object.html#make_tombstone/2"},{"type":"function","title":"ActivityPub.Object.maybe_fetch/2","doc":"","ref":"ActivityPub.Object.html#maybe_fetch/2"},{"type":"function","title":"ActivityPub.Object.maybe_upsert/3","doc":"","ref":"ActivityPub.Object.html#maybe_upsert/3"},{"type":"function","title":"ActivityPub.Object.normalise_tos/1","doc":"","ref":"ActivityPub.Object.html#normalise_tos/1"},{"type":"function","title":"ActivityPub.Object.normalize/3","doc":"","ref":"ActivityPub.Object.html#normalize/3"},{"type":"function","title":"ActivityPub.Object.normalize_actors/1","doc":"","ref":"ActivityPub.Object.html#normalize_actors/1"},{"type":"function","title":"ActivityPub.Object.normalize_params/3","doc":"","ref":"ActivityPub.Object.html#normalize_params/3"},{"type":"function","title":"ActivityPub.Object.object_url/1","doc":"","ref":"ActivityPub.Object.html#object_url/1"},{"type":"function","title":"ActivityPub.Object.prepare_data/4","doc":"Prepares a struct to be inserted into the objects table","ref":"ActivityPub.Object.html#prepare_data/4"},{"type":"function","title":"ActivityPub.Object.query/1","doc":"","ref":"ActivityPub.Object.html#query/1"},{"type":"function","title":"ActivityPub.Object.self_replies_ids/2","doc":"","ref":"ActivityPub.Object.html#self_replies_ids/2"},{"type":"function","title":"ActivityPub.Object.set_cache/1","doc":"","ref":"ActivityPub.Object.html#set_cache/1"},{"type":"function","title":"ActivityPub.Object.swap_object_with_tombstone/1","doc":"","ref":"ActivityPub.Object.html#swap_object_with_tombstone/1"},{"type":"function","title":"ActivityPub.Object.update_and_set_cache/1","doc":"","ref":"ActivityPub.Object.html#update_and_set_cache/1"},{"type":"function","title":"ActivityPub.Object.update_changeset/2","doc":"","ref":"ActivityPub.Object.html#update_changeset/2"},{"type":"function","title":"ActivityPub.Object.update_existing/2","doc":"","ref":"ActivityPub.Object.html#update_existing/2"},{"type":"function","title":"ActivityPub.Object.update_state/3","doc":"Updates a follow activity's state (for locked accounts).","ref":"ActivityPub.Object.html#update_state/3"},{"type":"type","title":"ActivityPub.Object.t/0","doc":"","ref":"ActivityPub.Object.html#t:t/0"},{"type":"module","title":"ActivityPub.Pruner","doc":"Prunes objects from the database.","ref":"ActivityPub.Pruner.html"},{"type":"function","title":"ActivityPub.Pruner.prune_all/1","doc":"","ref":"ActivityPub.Pruner.html#prune_all/1"},{"type":"function","title":"ActivityPub.Pruner.prune_deletes/1","doc":"","ref":"ActivityPub.Pruner.html#prune_deletes/1"},{"type":"function","title":"ActivityPub.Pruner.prune_objects/1","doc":"","ref":"ActivityPub.Pruner.html#prune_objects/1"},{"type":"function","title":"ActivityPub.Pruner.prune_orphaned_activities/0","doc":"","ref":"ActivityPub.Pruner.html#prune_orphaned_activities/0"},{"type":"function","title":"ActivityPub.Pruner.prune_removes/1","doc":"","ref":"ActivityPub.Pruner.html#prune_removes/1"},{"type":"function","title":"ActivityPub.Pruner.prune_stale_follow_requests/1","doc":"","ref":"ActivityPub.Pruner.html#prune_stale_follow_requests/1"},{"type":"function","title":"ActivityPub.Pruner.prune_tombstones/1","doc":"","ref":"ActivityPub.Pruner.html#prune_tombstones/1"},{"type":"function","title":"ActivityPub.Pruner.prune_undos/1","doc":"","ref":"ActivityPub.Pruner.html#prune_undos/1"},{"type":"function","title":"ActivityPub.Pruner.remove_embedded_objects/0","doc":"","ref":"ActivityPub.Pruner.html#remove_embedded_objects/0"},{"type":"module","title":"ActivityPub.Pruner.PruneDatabaseWorker","doc":"The worker to prune old data from the database.","ref":"ActivityPub.Pruner.PruneDatabaseWorker.html"},{"type":"module","title":"ActivityPub.Queries","doc":"Contains queries for Object.","ref":"ActivityPub.Queries.html"},{"type":"function","title":"ActivityPub.Queries.activity_by_object_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#activity_by_object_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.by_actor/2","doc":"","ref":"ActivityPub.Queries.html#by_actor/2"},{"type":"function","title":"ActivityPub.Queries.by_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#by_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.by_id/2","doc":"","ref":"ActivityPub.Queries.html#by_id/2"},{"type":"function","title":"ActivityPub.Queries.by_object_id/2","doc":"","ref":"ActivityPub.Queries.html#by_object_id/2"},{"type":"function","title":"ActivityPub.Queries.by_object_in_reply_to_id/3","doc":"","ref":"ActivityPub.Queries.html#by_object_in_reply_to_id/3"},{"type":"function","title":"ActivityPub.Queries.by_type/2","doc":"","ref":"ActivityPub.Queries.html#by_type/2"},{"type":"function","title":"ActivityPub.Queries.exclude_type/2","doc":"","ref":"ActivityPub.Queries.html#exclude_type/2"},{"type":"function","title":"ActivityPub.Queries.find_by_object_ap_id/2","doc":"","ref":"ActivityPub.Queries.html#find_by_object_ap_id/2"},{"type":"function","title":"ActivityPub.Queries.last_follow/2","doc":"","ref":"ActivityPub.Queries.html#last_follow/2"},{"type":"function","title":"ActivityPub.Queries.ordered/1","doc":"","ref":"ActivityPub.Queries.html#ordered/1"},{"type":"function","title":"ActivityPub.Queries.replies/2","doc":"","ref":"ActivityPub.Queries.html#replies/2"},{"type":"function","title":"ActivityPub.Queries.self_replies/1","doc":"","ref":"ActivityPub.Queries.html#self_replies/1"},{"type":"function","title":"ActivityPub.Queries.with_joined_activity/3","doc":"","ref":"ActivityPub.Queries.html#with_joined_activity/3"},{"type":"function","title":"ActivityPub.Queries.with_joined_object/2","doc":"","ref":"ActivityPub.Queries.html#with_joined_object/2"},{"type":"function","title":"ActivityPub.Queries.with_preloaded_object/2","doc":"","ref":"ActivityPub.Queries.html#with_preloaded_object/2"},{"type":"type","title":"ActivityPub.Queries.query/0","doc":"","ref":"ActivityPub.Queries.html#t:query/0"},{"type":"module","title":"ActivityPub.Safety.Containment","doc":"This module contains some useful functions for containing objects to specific\norigins and determining those origins. They previously lived in the\nActivityPub `Transformer` module.\n\nObject containment is an important step in validating remote objects to prevent\nspoofing, therefore removal of object containment functions is NOT recommended.","ref":"ActivityPub.Safety.Containment.html"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_child/1","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_child/1"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_origin/2","doc":"Checks that an imported AP object's actor matches the host it came from.","ref":"ActivityPub.Safety.Containment.html#contain_origin/2"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_origin_from_id/2","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_origin_from_id/2"},{"type":"function","title":"ActivityPub.Safety.Containment.contain_uri/2","doc":"","ref":"ActivityPub.Safety.Containment.html#contain_uri/2"},{"type":"function","title":"ActivityPub.Safety.Containment.get_object/1","doc":"","ref":"ActivityPub.Safety.Containment.html#get_object/1"},{"type":"function","title":"ActivityPub.Safety.Containment.restrict_unauthenticated_access?/1","doc":"","ref":"ActivityPub.Safety.Containment.html#restrict_unauthenticated_access?/1"},{"type":"function","title":"ActivityPub.Safety.Containment.restrict_unauthenticated_access?/2","doc":"","ref":"ActivityPub.Safety.Containment.html#restrict_unauthenticated_access?/2"},{"type":"function","title":"ActivityPub.Safety.Containment.visible_for_user?/2","doc":"","ref":"ActivityPub.Safety.Containment.html#visible_for_user?/2"},{"type":"module","title":"ActivityPub.Safety.Encryption","doc":"Provides encryption and decryption functionality using RSA keys managed by ActivityPub.Safety.Keys.\n\nNOTE: not used at the moment, simply intended as a proof-of-concept","ref":"ActivityPub.Safety.Encryption.html"},{"type":"function","title":"ActivityPub.Safety.Encryption.decrypt/2","doc":"Decrypts data for a given actor using their private key.","ref":"ActivityPub.Safety.Encryption.html#decrypt/2"},{"type":"function","title":"Parameters - ActivityPub.Safety.Encryption.decrypt/2","doc":"- encrypted_data: The data to decrypt (binary)\n - actor: The Actor struct with private keys","ref":"ActivityPub.Safety.Encryption.html#decrypt/2-parameters"},{"type":"function","title":"Returns - ActivityPub.Safety.Encryption.decrypt/2","doc":"- {:ok, decrypted_data} on success\n - {:error, reason} on failure","ref":"ActivityPub.Safety.Encryption.html#decrypt/2-returns"},{"type":"function","title":"ActivityPub.Safety.Encryption.encrypt/2","doc":"Encrypts data for a given actor using their public key.","ref":"ActivityPub.Safety.Encryption.html#encrypt/2"},{"type":"function","title":"Parameters - ActivityPub.Safety.Encryption.encrypt/2","doc":"- data: The data to encrypt (binary or string)\n - actor: The Actor struct or AP ID of the recipient","ref":"ActivityPub.Safety.Encryption.html#encrypt/2-parameters"},{"type":"function","title":"Returns - ActivityPub.Safety.Encryption.encrypt/2","doc":"- {:ok, encrypted_data} on success\n - {:error, reason} on failure","ref":"ActivityPub.Safety.Encryption.html#encrypt/2-returns"},{"type":"module","title":"ActivityPub.Safety.HTTP.Signatures","doc":"Implementation for behaviour from `HTTPSignatures` library","ref":"ActivityPub.Safety.HTTP.Signatures.html"},{"type":"function","title":"ActivityPub.Safety.HTTP.Signatures.fetch_fresh_public_key/1","doc":"Fetch public key from remote actor","ref":"ActivityPub.Safety.HTTP.Signatures.html#fetch_fresh_public_key/1"},{"type":"function","title":"ActivityPub.Safety.HTTP.Signatures.fetch_public_key/1","doc":"Get or fetch public key from local cache/DB","ref":"ActivityPub.Safety.HTTP.Signatures.html#fetch_public_key/1"},{"type":"function","title":"ActivityPub.Safety.HTTP.Signatures.get_public_key/1","doc":"Get public key from local cache/DB","ref":"ActivityPub.Safety.HTTP.Signatures.html#get_public_key/1"},{"type":"module","title":"ActivityPub.Safety.Keys","doc":"Handles RSA keys for Actors & helpers for HTTP signatures","ref":"ActivityPub.Safety.Keys.html"},{"type":"function","title":"ActivityPub.Safety.Keys.add_public_key/2","doc":"","ref":"ActivityPub.Safety.Keys.html#add_public_key/2"},{"type":"function","title":"ActivityPub.Safety.Keys.cast_uri/1","doc":"","ref":"ActivityPub.Safety.Keys.html#cast_uri/1"},{"type":"function","title":"ActivityPub.Safety.Keys.ensure_keys_present/1","doc":"Checks if an actor struct has a non-nil keys field and generates a PEM if it doesn't.","ref":"ActivityPub.Safety.Keys.html#ensure_keys_present/1"},{"type":"function","title":"ActivityPub.Safety.Keys.fetch_public_key_for_ap_id/1","doc":"Fetches the remote public key for given actor AP ID.","ref":"ActivityPub.Safety.Keys.html#fetch_public_key_for_ap_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.generate_rsa_pem/0","doc":"","ref":"ActivityPub.Safety.Keys.html#generate_rsa_pem/0"},{"type":"function","title":"ActivityPub.Safety.Keys.get_public_key_for_ap_id/1","doc":"Get the public key for given actor AP ID.","ref":"ActivityPub.Safety.Keys.html#get_public_key_for_ap_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.http_host/1","doc":"","ref":"ActivityPub.Safety.Keys.html#http_host/1"},{"type":"function","title":"ActivityPub.Safety.Keys.key_id_to_actor_id/1","doc":"","ref":"ActivityPub.Safety.Keys.html#key_id_to_actor_id/1"},{"type":"function","title":"ActivityPub.Safety.Keys.keypair_from_pem/1","doc":"","ref":"ActivityPub.Safety.Keys.html#keypair_from_pem/1"},{"type":"function","title":"ActivityPub.Safety.Keys.maybe_add_fetch_signature_headers/3","doc":"","ref":"ActivityPub.Safety.Keys.html#maybe_add_fetch_signature_headers/3"},{"type":"function","title":"ActivityPub.Safety.Keys.public_key_decode/1","doc":"","ref":"ActivityPub.Safety.Keys.html#public_key_decode/1"},{"type":"function","title":"ActivityPub.Safety.Keys.public_key_from_data/1","doc":"","ref":"ActivityPub.Safety.Keys.html#public_key_from_data/1"},{"type":"function","title":"ActivityPub.Safety.Keys.sign/2","doc":"","ref":"ActivityPub.Safety.Keys.html#sign/2"},{"type":"module","title":"ActivityPub.Utils","doc":"Misc functions used for federation","ref":"ActivityPub.Utils.html"},{"type":"function","title":"ActivityPub.Utils.activitypub_object_headers/0","doc":"","ref":"ActivityPub.Utils.html#activitypub_object_headers/0"},{"type":"function","title":"ActivityPub.Utils.adapter_fallback/0","doc":"","ref":"ActivityPub.Utils.html#adapter_fallback/0"},{"type":"function","title":"ActivityPub.Utils.ap_base_url/0","doc":"","ref":"ActivityPub.Utils.html#ap_base_url/0"},{"type":"function","title":"ActivityPub.Utils.ap_id/1","doc":"","ref":"ActivityPub.Utils.html#ap_id/1"},{"type":"function","title":"ActivityPub.Utils.as_local_public/0","doc":"","ref":"ActivityPub.Utils.html#as_local_public/0"},{"type":"function","title":"ActivityPub.Utils.cache_clear/0","doc":"","ref":"ActivityPub.Utils.html#cache_clear/0"},{"type":"function","title":"ActivityPub.Utils.cachex_fetch/4","doc":"","ref":"ActivityPub.Utils.html#cachex_fetch/4"},{"type":"function","title":"ActivityPub.Utils.error_json/3","doc":"","ref":"ActivityPub.Utils.html#error_json/3"},{"type":"function","title":"ActivityPub.Utils.format_date/1","doc":"","ref":"ActivityPub.Utils.html#format_date/1"},{"type":"function","title":"ActivityPub.Utils.generate_id/1","doc":"","ref":"ActivityPub.Utils.html#generate_id/1"},{"type":"function","title":"ActivityPub.Utils.generate_object_id/0","doc":"","ref":"ActivityPub.Utils.html#generate_object_id/0"},{"type":"function","title":"ActivityPub.Utils.get_with_cache/4","doc":"","ref":"ActivityPub.Utils.html#get_with_cache/4"},{"type":"function","title":"ActivityPub.Utils.has_as_public?/1","doc":"","ref":"ActivityPub.Utils.html#has_as_public?/1"},{"type":"function","title":"ActivityPub.Utils.is_uid?/1","doc":"","ref":"ActivityPub.Utils.html#is_uid?/1"},{"type":"function","title":"ActivityPub.Utils.is_ulid?/1","doc":"","ref":"ActivityPub.Utils.html#is_ulid?/1"},{"type":"function","title":"ActivityPub.Utils.is_uuid?/1","doc":"Takes a string and returns true if it is a valid UUID (Universally Unique Identifier)","ref":"ActivityPub.Utils.html#is_uuid?/1"},{"type":"function","title":"ActivityPub.Utils.json_with_cache/6","doc":"","ref":"ActivityPub.Utils.html#json_with_cache/6"},{"type":"function","title":"ActivityPub.Utils.label_in_collection?/2","doc":"","ref":"ActivityPub.Utils.html#label_in_collection?/2"},{"type":"function","title":"ActivityPub.Utils.make_date/0","doc":"","ref":"ActivityPub.Utils.html#make_date/0"},{"type":"function","title":"ActivityPub.Utils.make_json_ld_header/1","doc":"","ref":"ActivityPub.Utils.html#make_json_ld_header/1"},{"type":"function","title":"ActivityPub.Utils.maybe_put/3","doc":"conditionally update a map","ref":"ActivityPub.Utils.html#maybe_put/3"},{"type":"function","title":"ActivityPub.Utils.maybe_to_atom/1","doc":"","ref":"ActivityPub.Utils.html#maybe_to_atom/1"},{"type":"function","title":"ActivityPub.Utils.maybe_to_string/1","doc":"Handles multiple cases where the input value is of a different type (atom, list, tuple, etc.) and returns a string representation of it.","ref":"ActivityPub.Utils.html#maybe_to_string/1"},{"type":"function","title":"ActivityPub.Utils.ok_unwrap/2","doc":"","ref":"ActivityPub.Utils.html#ok_unwrap/2"},{"type":"function","title":"ActivityPub.Utils.public?/1","doc":"","ref":"ActivityPub.Utils.html#public?/1"},{"type":"function","title":"ActivityPub.Utils.public?/2","doc":"Determines if an object or an activity is public.","ref":"ActivityPub.Utils.html#public?/2"},{"type":"function","title":"ActivityPub.Utils.put_if_present/4","doc":"","ref":"ActivityPub.Utils.html#put_if_present/4"},{"type":"function","title":"ActivityPub.Utils.repo/0","doc":"","ref":"ActivityPub.Utils.html#repo/0"},{"type":"function","title":"ActivityPub.Utils.request_ip/1","doc":"","ref":"ActivityPub.Utils.html#request_ip/1"},{"type":"function","title":"ActivityPub.Utils.return_json/4","doc":"","ref":"ActivityPub.Utils.html#return_json/4"},{"type":"function","title":"ActivityPub.Utils.safe_put_in/3","doc":"","ref":"ActivityPub.Utils.html#safe_put_in/3"},{"type":"function","title":"ActivityPub.Utils.service_actor/0","doc":"","ref":"ActivityPub.Utils.html#service_actor/0"},{"type":"function","title":"ActivityPub.Utils.service_actor!/0","doc":"","ref":"ActivityPub.Utils.html#service_actor!/0"},{"type":"function","title":"ActivityPub.Utils.set_repo/1","doc":"","ref":"ActivityPub.Utils.html#set_repo/1"},{"type":"function","title":"ActivityPub.Utils.single_ap_id/1","doc":"","ref":"ActivityPub.Utils.html#single_ap_id/1"},{"type":"function","title":"ActivityPub.Utils.single_ap_id_or_object/1","doc":"","ref":"ActivityPub.Utils.html#single_ap_id_or_object/1"},{"type":"function","title":"ActivityPub.Utils.stringify_keys/2","doc":"Takes a map or keyword list, and returns a map with any atom keys converted to string keys. It can optionally do so recursively.","ref":"ActivityPub.Utils.html#stringify_keys/2"},{"type":"function","title":"ActivityPub.Utils.uid/1","doc":"","ref":"ActivityPub.Utils.html#uid/1"},{"type":"module","title":"ActivityPub.Web","doc":"The entrypoint for defining your web interface, such\nas controllers, views, channels and so on.\n\nThis can be used in your application as:\n\n use ActivityPub.Web, :controller\n use ActivityPub.Web, :view\n\nThe definitions below will be executed for every view,\ncontroller, etc, so keep them short and clean, focused\non imports, uses and aliases.\n\nDo NOT define functions inside the quoted expressions\nbelow. Instead, define any helper function in modules\nand import those modules here.","ref":"ActivityPub.Web.html"},{"type":"macro","title":"ActivityPub.Web.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"ActivityPub.Web.html#__using__/1"},{"type":"function","title":"ActivityPub.Web.base_url/0","doc":"","ref":"ActivityPub.Web.html#base_url/0"},{"type":"function","title":"ActivityPub.Web.channel/0","doc":"","ref":"ActivityPub.Web.html#channel/0"},{"type":"function","title":"ActivityPub.Web.controller/0","doc":"","ref":"ActivityPub.Web.html#controller/0"},{"type":"function","title":"ActivityPub.Web.rate_limit_reached/2","doc":"","ref":"ActivityPub.Web.html#rate_limit_reached/2"},{"type":"function","title":"ActivityPub.Web.router/0","doc":"","ref":"ActivityPub.Web.html#router/0"},{"type":"function","title":"ActivityPub.Web.view/0","doc":"","ref":"ActivityPub.Web.html#view/0"},{"type":"module","title":"ActivityPub.Web.ActivityPubController","doc":"Endpoints for serving objects and collections, so the ActivityPub API can be used to read information from the server.\n\nEven though we store the data in AS format, some changes need to be applied to the entity before serving it in the AP REST response. This is done in `ActivityPub.Web.ActivityPubView`.","ref":"ActivityPub.Web.ActivityPubController.html"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.actor/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#actor/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.ap_route_helper/1","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#ap_route_helper/1"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.followers/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#followers/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.following/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#following/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.json_object_with_cache/3","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#json_object_with_cache/3"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.maybe_inbox/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#maybe_inbox/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.object/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#object/2"},{"type":"function","title":"ActivityPub.Web.ActivityPubController.outbox/2","doc":"","ref":"ActivityPub.Web.ActivityPubController.html#outbox/2"},{"type":"module","title":"ActivityPub.Web.ActorView","doc":"","ref":"ActivityPub.Web.ActorView.html"},{"type":"function","title":"ActivityPub.Web.ActorView.actor_json/1","doc":"","ref":"ActivityPub.Web.ActorView.html#actor_json/1"},{"type":"function","title":"ActivityPub.Web.ActorView.collection/4","doc":"","ref":"ActivityPub.Web.ActorView.html#collection/4"},{"type":"function","title":"ActivityPub.Web.ActorView.render/2","doc":"","ref":"ActivityPub.Web.ActorView.html#render/2"},{"type":"module","title":"ActivityPub.Web.Endpoint","doc":"","ref":"ActivityPub.Web.Endpoint.html"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast!/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast!/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast_from/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast_from/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.broadcast_from!/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.call/2","doc":"","ref":"ActivityPub.Web.Endpoint.html#call/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"ActivityPub.Web.Endpoint.html#child_spec/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"ActivityPub.Web.Endpoint.html#config/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"ActivityPub.Web.Endpoint.html#config_change/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"ActivityPub.Web.Endpoint.html#host/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.init/1","doc":"","ref":"ActivityPub.Web.Endpoint.html#init/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.local_broadcast/3","doc":"","ref":"ActivityPub.Web.Endpoint.html#local_broadcast/3"},{"type":"function","title":"ActivityPub.Web.Endpoint.local_broadcast_from/4","doc":"","ref":"ActivityPub.Web.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"ActivityPub.Web.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"ActivityPub.Web.Endpoint.html#path/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.script_name/0","doc":"Generates the script name.","ref":"ActivityPub.Web.Endpoint.html#script_name/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"ActivityPub.Web.Endpoint.html#server_info/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"ActivityPub.Web.Endpoint.html#start_link/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_integrity/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_lookup/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"ActivityPub.Web.Endpoint.html#static_path/1"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#static_url/0"},{"type":"function","title":"ActivityPub.Web.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":"ActivityPub.Web.Endpoint.html#struct_url/0"},{"type":"function","title":"ActivityPub.Web.Endpoint.subscribe/2","doc":"","ref":"ActivityPub.Web.Endpoint.html#subscribe/2"},{"type":"function","title":"ActivityPub.Web.Endpoint.unsubscribe/1","doc":"","ref":"ActivityPub.Web.Endpoint.html#unsubscribe/1"},{"type":"function","title":"ActivityPub.Web.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"ActivityPub.Web.Endpoint.html#url/0"},{"type":"module","title":"ActivityPub.Web.ErrorHelpers","doc":"Conveniences for translating and building error messages.","ref":"ActivityPub.Web.ErrorHelpers.html"},{"type":"function","title":"ActivityPub.Web.ErrorHelpers.error_tag/2","doc":"Generates tag for inlined form input errors.","ref":"ActivityPub.Web.ErrorHelpers.html#error_tag/2"},{"type":"module","title":"ActivityPub.Web.ErrorView","doc":"Standard error view","ref":"ActivityPub.Web.ErrorView.html"},{"type":"function","title":"ActivityPub.Web.ErrorView.render/2","doc":"","ref":"ActivityPub.Web.ErrorView.html#render/2"},{"type":"function","title":"ActivityPub.Web.ErrorView.template_not_found/2","doc":"By default, Phoenix returns the status message from the template name. For example, \"404.html\" becomes \"Not Found\".","ref":"ActivityPub.Web.ErrorView.html#template_not_found/2"},{"type":"module","title":"ActivityPub.Web.IncomingActivityPubController","doc":"Endpoints for the ActivityPub inbox","ref":"ActivityPub.Web.IncomingActivityPubController.html"},{"type":"function","title":"ActivityPub.Web.IncomingActivityPubController.inbox/2","doc":"","ref":"ActivityPub.Web.IncomingActivityPubController.html#inbox/2"},{"type":"function","title":"ActivityPub.Web.IncomingActivityPubController.outbox_info/2","doc":"","ref":"ActivityPub.Web.IncomingActivityPubController.html#outbox_info/2"},{"type":"module","title":"ActivityPub.Web.LayoutView","doc":"","ref":"ActivityPub.Web.LayoutView.html"},{"type":"function","title":"ActivityPub.Web.LayoutView.render/2","doc":"","ref":"ActivityPub.Web.LayoutView.html#render/2"},{"type":"module","title":"ActivityPub.Web.ObjectView","doc":"","ref":"ActivityPub.Web.ObjectView.html"},{"type":"function","title":"ActivityPub.Web.ObjectView.collection/4","doc":"","ref":"ActivityPub.Web.ObjectView.html#collection/4"},{"type":"function","title":"ActivityPub.Web.ObjectView.render/2","doc":"","ref":"ActivityPub.Web.ObjectView.html#render/2"},{"type":"module","title":"ActivityPub.Web.Plugs.DigestPlug","doc":"","ref":"ActivityPub.Web.Plugs.DigestPlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.DigestPlug.read_body/2","doc":"","ref":"ActivityPub.Web.Plugs.DigestPlug.html#read_body/2"},{"type":"module","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","doc":"Ensures HTTP signature has been validated by previous plugs on ActivityPub requests.","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.ignore/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#ignore/1"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#init/1"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.maybe_reject!/2","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#maybe_reject!/2"},{"type":"function","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.unauthorized/1","doc":"","ref":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug.html#unauthorized/1"},{"type":"module","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.HTTPSignaturePlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html"},{"type":"function","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.call/2","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html#call/2"},{"type":"function","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.init/1","doc":"","ref":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug.html#init/1"},{"type":"module","title":"ActivityPub.Web.RedirectController","doc":"","ref":"ActivityPub.Web.RedirectController.html"},{"type":"function","title":"ActivityPub.Web.RedirectController.actor/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#actor/2"},{"type":"function","title":"ActivityPub.Web.RedirectController.object/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#object/2"},{"type":"function","title":"ActivityPub.Web.RedirectController.remote_interaction/2","doc":"","ref":"ActivityPub.Web.RedirectController.html#remote_interaction/2"},{"type":"module","title":"ActivityPub.Web.Router","doc":"","ref":"ActivityPub.Web.Router.html"},{"type":"module","title":"ActivityPub.Web.Telemetry","doc":"","ref":"ActivityPub.Web.Telemetry.html"},{"type":"function","title":"ActivityPub.Web.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"ActivityPub.Web.Telemetry.html#child_spec/1"},{"type":"function","title":"ActivityPub.Web.Telemetry.metrics/0","doc":"","ref":"ActivityPub.Web.Telemetry.html#metrics/0"},{"type":"function","title":"ActivityPub.Web.Telemetry.start_link/1","doc":"","ref":"ActivityPub.Web.Telemetry.html#start_link/1"},{"type":"module","title":"ActivityPub.Web.UserSocket","doc":"","ref":"ActivityPub.Web.UserSocket.html"},{"type":"module","title":"ActivityPub.Web.WebFingerController","doc":"","ref":"ActivityPub.Web.WebFingerController.html"},{"type":"function","title":"ActivityPub.Web.WebFingerController.webfinger/2","doc":"","ref":"ActivityPub.Web.WebFingerController.html#webfinger/2"},{"type":"module","title":"Iconify","doc":"Phoenix helpers for using 100,000+ SVG icons from 100+ icon sets compiled by [Iconify](https://icon-sets.iconify.design) (visit that site to browse the sets available and preview the icons)\n\nIt copies only the icons you use from the iconify library into your project, preparing them on-the-fly when you first use an icon in a view or component (either at compile time if using the Surface component, or on the first run during development).\n\nIt can be configured to embed the icons one of three ways:\n- `css` (default): generate a single CSS file containing SVGs of all the icons used \n- `img` (default for emojis): to create SVG files in your static assets, used to be included with `img` tags and loaded over HTTP (you may want to include [svg-inject](https://github.com/iconfu/svg-inject) on your site to enable styling of the SVGs, e.g. to change their colour)\n- `inline`: to generate a Phoenix Component for each icon used, used to embed the icons as `svg` tags inline in the HTML of your views (meaning the SVG will be included in LiveView diffs)\n- `set`: to generate an SVG sprite set for each family, and reference icons with a `use` tag inside of inline SVGs.\n\nThere is also an optional integration of [phoenix_live_favicon](https://github.com/BartOtten/phoenix_live_favicon) so you can set an icon (or emoji) as favicon on a page with `Iconify.maybe_set_favicon(socket, icon_name_or_emoji)`.","ref":"Iconify.html"},{"type":"module","title":"Installation - Iconify","doc":"```elixir\ndef deps do\n [\n {:iconify_ex, \"~> 0.1.0\"}\n ]\nend\n```\n\nAfter running `mix deps.get` you need to fetch the latest [iconify icon sets](https://github.com/iconify/icon-sets) by running something like:\n```bash\ncd deps/iconify_ex/assets && yarn && cd -\n```","ref":"Iconify.html#module-installation"},{"type":"module","title":"Usage - Iconify","doc":"1. Add `import Iconify` in your Phoenix or LiveView module where you want to use it (or just once in the macros in your Web module). \n\n2. Set one of these options in config to choose which approach you want to use (see above for explanations):\n- `config :iconify_ex, :mode, :css` \n- `config :iconify_ex, :mode, :img` \n- `config :iconify_ex, :mode, :inline` \n- `config :iconify_ex, :mode, :set` \n\nIf using CSS mode, you'll need to include the CSS file in your layout (e.g. ` ` in your app's equivalent of `lib/my_app_web/components/layouts/root.html.heex`) and set some default styles that will be applied to all icons, by adding something like this to your app's main CSS (e.g. `assets/css/app.css`):\n```css\n[iconify] {\n background-color: currentColor;\n -webkit-mask-size: cover;\n mask-size: cover;\n min-width: 0.5rem;\n min-height: 0.5rem;\n}\n```\n\nOther configurations include:\n\n```elixir\nconfig :iconify_ex, :fallback_icon, \"heroicons-solid:question-mark-circle\" # when an icon is not found\nconfig :iconify_ex, :generated_icon_modules_path, \"./lib/web/icons\" # for :inline mode\nconfig :iconify_ex, :generated_icon_static_path, \"./priv/static/images/icons\" # where CSS and images are stored\nconfig :iconify_ex, :generated_icon_static_url, \"/images/icons/\" # where CSS and images are served from\n```\n\n3. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:\n\nEmbed an icon using default classes (copy the icon name from the [iconify website](https://icon-sets.iconify.design)):\n```html\n<.iconify icon=\"heroicons-solid:collection\" />\n```\n\nSpecify custom classes:\n```html\n<.iconify icon=\"heroicons-solid:collection\" class=\"w-8 h-8 text-base-content\" /> \n```\n\nOr if you use [Surface](https://surface-ui.org), it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:\n\nAdd `alias Iconify.Icon` to your Web module, and then:\n\n```html\n<#Icon iconify=\"heroicons-solid:collection\" />\n```\n\nIf your icon is dynamic, you'll still want to use the first form:\n```html\n<.iconify icon={@my_icon} />\n```\n\nNote: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like `sort -u -o icons_dir/icons.css icons_dir/icons.css` to clean up the CSS file.","ref":"Iconify.html#module-usage"},{"type":"function","title":"Iconify.add_icon_to_css/2","doc":"","ref":"Iconify.html#add_icon_to_css/2"},{"type":"function","title":"Iconify.complex?/1","doc":"Checks if the icon is part of a known emoji set or any set shouldn't use CSS mode (eg. includes color or animation).","ref":"Iconify.html#complex?/1"},{"type":"function","title":"Examples - Iconify.complex?/1","doc":"iex> Iconify.complex?(\"twemoji:smile\")\n true\n iex> Iconify.complex?(\"heroicons-solid:user\")\n false","ref":"Iconify.html#complex?/1-examples"},{"type":"function","title":"Iconify.dev_env?/0","doc":"","ref":"Iconify.html#dev_env?/0"},{"type":"function","title":"Iconify.emoji?/1","doc":"Checks if the icon is part of a known emoji set","ref":"Iconify.html#emoji?/1"},{"type":"function","title":"Examples - Iconify.emoji?/1","doc":"iex> Iconify.emoji?(\"twemoji:smile\")\n true\n iex> Iconify.emoji?(\"heroicons-solid:user\")\n false","ref":"Iconify.html#emoji?/1-examples"},{"type":"function","title":"Iconify.fallback_icon/0","doc":"Returns the fallback icon name.","ref":"Iconify.html#fallback_icon/0"},{"type":"function","title":"Examples - Iconify.fallback_icon/0","doc":"iex> Iconify.fallback_icon()\n \"heroicons-solid:question-mark-circle\"","ref":"Iconify.html#fallback_icon/0-examples"},{"type":"function","title":"Iconify.generate_css_from_components/0","doc":"Generates CSS icons from existing components.","ref":"Iconify.html#generate_css_from_components/0"},{"type":"function","title":"Examples - Iconify.generate_css_from_components/0","doc":"iex> Iconify.generate_css_from_components()\n :ok","ref":"Iconify.html#generate_css_from_components/0-examples"},{"type":"function","title":"Iconify.generate_css_from_static_files/0","doc":"Generates CSS icons from existing static files.","ref":"Iconify.html#generate_css_from_static_files/0"},{"type":"function","title":"Examples - Iconify.generate_css_from_static_files/0","doc":"iex> Iconify.generate_css_from_static_files()\n :ok","ref":"Iconify.html#generate_css_from_static_files/0-examples"},{"type":"function","title":"Iconify.generate_sets_from_components/0","doc":"Generates icon sets from existing components.","ref":"Iconify.html#generate_sets_from_components/0"},{"type":"function","title":"Examples - Iconify.generate_sets_from_components/0","doc":"iex> Iconify.generate_sets_from_components()\n [:ok, :ok, ...]","ref":"Iconify.html#generate_sets_from_components/0-examples"},{"type":"function","title":"Iconify.iconify/1","doc":"Renders an icon as a `Phoenix.Component` based on the given assigns.","ref":"Iconify.html#iconify/1"},{"type":"function","title":"Examples - Iconify.iconify/1","doc":"iex> assigns = %{icon: \"heroicons-solid:user\", class: \"w-6 h-6\"}\n iex> Iconify.iconify(assigns)\n # Returns rendered icon HTML","ref":"Iconify.html#iconify/1-examples"},{"type":"function","title":"Iconify.list_all_existing/0","doc":"Lists all existing icons (components and CSS).","ref":"Iconify.html#list_all_existing/0"},{"type":"function","title":"Examples - Iconify.list_all_existing/0","doc":"iex> Iconify.list_all_existing()\n %{\n \"HeroiconsSolid\" => [Iconify.HeroiconsSolid.User, \"user\", ...],\n \"HeroiconsOutline\" => [Iconify.HeroiconsOutline.User, \"user\", ...]\n }","ref":"Iconify.html#list_all_existing/0-examples"},{"type":"function","title":"Iconify.list_components/0","doc":"Lists all available icon components.","ref":"Iconify.html#list_components/0"},{"type":"function","title":"Examples - Iconify.list_components/0","doc":"iex> Iconify.list_components()\n %{\n \"HeroiconsSolid\" => [Iconify.HeroiconsSolid.User, Iconify.HeroiconsSolid.Star, ...],\n \"HeroiconsOutline\" => [Iconify.HeroiconsOutline.User, Iconify.HeroiconsOutline.Star, ...]\n }","ref":"Iconify.html#list_components/0-examples"},{"type":"function","title":"Iconify.list_icons_in_css/0","doc":"Lists all icons defined in the CSS file.","ref":"Iconify.html#list_icons_in_css/0"},{"type":"function","title":"Examples - Iconify.list_icons_in_css/0","doc":"iex> Iconify.list_icons_in_css()\n %{\n \"HeroiconsSolid\" => [\"user\", \"star\", ...],\n \"HeroiconsOutline\" => [\"user\", \"star\", ...]\n }","ref":"Iconify.html#list_icons_in_css/0-examples"},{"type":"function","title":"Iconify.list_icons_in_images/0","doc":"","ref":"Iconify.html#list_icons_in_images/0"},{"type":"function","title":"Iconify.manual/2","doc":"Prepares and renders an icon.","ref":"Iconify.html#manual/2"},{"type":"function","title":"Examples - Iconify.manual/2","doc":"iex> Iconify.manual(\"heroicons-solid:user\", mode: :css)\n # Returns rendered icon HTML or data","ref":"Iconify.html#manual/2-examples"},{"type":"function","title":"Iconify.maybe_phx_live_set_dynamic/3","doc":"","ref":"Iconify.html#maybe_phx_live_set_dynamic/3"},{"type":"function","title":"Iconify.maybe_set_favicon/2","doc":"Sets the favicon for a Phoenix LiveView socket.","ref":"Iconify.html#maybe_set_favicon/2"},{"type":"function","title":"Examples - Iconify.maybe_set_favicon/2","doc":"iex> socket = %Phoenix.LiveView.Socket{}\n iex> Iconify.maybe_set_favicon(socket, \"heroicons-solid:star\")\n %Phoenix.LiveView.Socket{}","ref":"Iconify.html#maybe_set_favicon/2-examples"},{"type":"function","title":"Iconify.path/0","doc":"Returns the configured path for generated icon modules.","ref":"Iconify.html#path/0"},{"type":"function","title":"Examples - Iconify.path/0","doc":"iex> Iconify.path()\n \"./lib/web/icons\"","ref":"Iconify.html#path/0-examples"},{"type":"function","title":"Iconify.prepare/2","doc":"Prepares an icon based on the given assigns and mode (such as CSS, inline SVG, or image URL).","ref":"Iconify.html#prepare/2"},{"type":"function","title":"Examples - Iconify.prepare/2","doc":"iex> {:css, _function, %{\n icon: \"heroicons-solid:user\",\n class: \"w-4 h-4\",\n icon_name: \"heroicons-solid:user\"\n }} = Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :css)\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :inline)\n {:inline, _fun, %{icon: \"heroicons-solid:user\"}}\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :img)\n {:img, _fun, %{src: \"/images/icons/heroicons-solid/user.svg\"}}\n\n iex> Iconify.prepare(%{icon: \"heroicons-solid:user\"}, :set)\n {:set, _fun, %{href: \"/images/icons/heroicons-solid.svg#user\"}}\n\n iex> Iconify.prepare(%{icon: \"twemoji:rabbit\"})\n {:img, _fun, %{src: \"/images/icons/twemoji/rabbit.svg\"}}\n\n iex> Iconify.prepare(%{icon: \"non-existent-icon\"})\n {:css, _fun, %{icon_name: \"heroicons-solid:question-mark-circle\"}}\n\n > Iconify.prepare(%{icon: \" ... \"})\n {:inline, _fun, %{icon: \" ... \"}}","ref":"Iconify.html#prepare/2-examples"},{"type":"function","title":"Iconify.prepare_entire_icon_family/2","doc":"Prepares an entire icon family for a particular mode.","ref":"Iconify.html#prepare_entire_icon_family/2"},{"type":"function","title":"Examples - Iconify.prepare_entire_icon_family/2","doc":"iex> Iconify.prepare_entire_icon_family(\"heroicons-solid\", :inline)\n # creates a Phoenix.Component module file for each icon in the set","ref":"Iconify.html#prepare_entire_icon_family/2-examples"},{"type":"function","title":"Iconify.static_path/0","doc":"Returns the configured path for generated static icon assets.","ref":"Iconify.html#static_path/0"},{"type":"function","title":"Examples - Iconify.static_path/0","doc":"iex> Iconify.static_path()\n \"./assets/static/images/icons\"","ref":"Iconify.html#static_path/0-examples"},{"type":"function","title":"Iconify.static_url/0","doc":"Returns the configured URL for generated static icon assets.","ref":"Iconify.html#static_url/0"},{"type":"function","title":"Examples - Iconify.static_url/0","doc":"iex> Iconify.static_url()\n \"/images/icons\"","ref":"Iconify.html#static_url/0-examples"},{"type":"function","title":"Iconify.using_svg_inject?/0","doc":"Checks if SVG injection is enabled in config.","ref":"Iconify.html#using_svg_inject?/0"},{"type":"function","title":"Examples - Iconify.using_svg_inject?/0","doc":"iex> Iconify.using_svg_inject?()\n false","ref":"Iconify.html#using_svg_inject?/0-examples"},{"type":"module","title":"Iconify.Icon","doc":"A `Surface` component for rendering icons using various methods.","ref":"Iconify.Icon.html"},{"type":"module","title":"Specifying what icon to use - Iconify.Icon","doc":"- `iconify` or `icon`: Any icon from Iconify (https://icones.js.org)\n- `solid`: Shorthand for Heroicons solid icons\n- `outline`: Shorthand for Heroicons outline icons","ref":"Iconify.Icon.html#module-specifying-what-icon-to-use"},{"type":"module","title":"Extra Properties - Iconify.Icon","doc":"- `svg`: Optionally pass SVG markup directly\n- `mode`: Sets what rendering mode to use (see `Iconify` docs)\n- `class`: Any CSS classes to apply to the icon","ref":"Iconify.Icon.html#module-extra-properties"},{"type":"module","title":"Examples - Iconify.Icon","doc":"iex> alias Iconify.Icon\n iex> ~F\"<#Icon iconify=\"heroicons-solid:user\" class=\"w-6 h-6\" />\"\n # Returns rendered icon HTML\n\n iex> ~F\"<#Icon solid=\"user\" class=\"w-6 h-6\" />\"\n \n iex> ~F\"<#Icon svg=\" ... \" class=\"w-6 h-6\" />\"","ref":"Iconify.Icon.html#module-examples"},{"type":"module","title":"Properties - Iconify.Icon","doc":"* **iconify** *:string, required: false, static: true*\n* **icon** *:string, required: false, static: true*\n* **solid** *:string, required: false, static: true*\n* **outline** *:string, required: false, static: true*\n* **svg** *:string, default: nil, required: false, static: true*\n* **mode** *:atom, required: false, static: true*\n* **class** *:css_class, default: nil*","ref":"Iconify.Icon.html#module-properties"},{"type":"function","title":"Iconify.Icon.class_to_string/1","doc":"","ref":"Iconify.Icon.html#class_to_string/1"},{"type":"function","title":"Iconify.Icon.expand/3","doc":"","ref":"Iconify.Icon.html#expand/3"},{"type":"macro","title":"Iconify.Icon.icon_name/1","doc":"","ref":"Iconify.Icon.html#icon_name/1"},{"type":"module","title":"Iconify.MaterialSymbols.CalendarMonth","doc":"","ref":"Iconify.MaterialSymbols.CalendarMonth.html"},{"type":"function","title":"Iconify.MaterialSymbols.CalendarMonth.render/1","doc":"","ref":"Iconify.MaterialSymbols.CalendarMonth.html#render/1"},{"type":"behaviour","title":"AbsintheClient","doc":"Supports use of GraphQL documents from with app containing the Absinthe schema","ref":"AbsintheClient.html"},{"type":"behaviour","title":"Example - AbsintheClient","doc":"First, `use AbsintheClient`, passing your `schema` and\nnotifying Absinthe to operate in `internal` mode:\n\n```elixir\ndefmodule MyAppWeb.UserController do\n use MyAppWeb, :controller\n use AbsintheClient, schema: MyAppWeb.Schema, action: [mode: :internal]\n\n # ... actions\n\nend\n```\n\nFor each action you want Absinthe to process, provide a GraphQL document using\nthe `@graphql` module attribute (before the action):\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10)\n }\n\"\"\"\ndef index(conn_or_socket, %{data: data}) do\n render conn_or_socket, \"index.html\", data\nend\n```\n\nThe params for the action will be intercepted by the\n`AbsintheClient.Action` plug, and used as variables for\nthe GraphQL document you've specified.\n\nFor instance, given a definition for a `:user_filter` input object\ntype like this:\n\n```\ninput_object :user_filter do\n field :name_matches, :string\n field :age_above, :integer\n field :age_below, :integer\nend\n```\n\nAnd a query that looks like this (assuming you have the normal\n`Plug.Parsers` configuration for param parsing):\n\n```\n?filter[name_matches]=joe&filter[age_above]=42\n```\n\nThen Absinthe will receive variable definitions of:\n\n```\n%{\"filter\" => %{\"name_matches\" => \"joe\", \"age_above\" => 42}}\n```\n\n(For how the string `\"42\"` was converted into `42`, see `cast_param/3`).\n\nThe params on the `conn_or_socket` will then be replaced by the result of the\nexecution by Absinthe. The action function can then match against\nthat result to respond correctly to the user:\n\nIt's up to you to handle the three possible results:\n\n- When there's `:data` but no `:errors`, everything went perfectly.\n- When there's `:errors` but no `:data`, a validation error occurred and the document could not be\n executed.\n- When there's `:data` and `:errors`, partial data is available but some fields reported errors\n during execution.\n\nNotice the keys are atoms, not strings as in normal Phoenix action invocations.","ref":"AbsintheClient.html#module-example"},{"type":"behaviour","title":"Differences with the GraphQL Specification - AbsintheClient","doc":"There are some important differences between GraphQL documents as\nprocessed in an HTTP API and the GraphQL documents that this module\nsupports.\n\nIn an effort to make use of GraphQL ergonomic in Elixir,\nAbsinthe supports some slight structural modifications to\nthe GraphQL documents provided using the `@graphql` module attribute\nin controller modules.\n\nIn a way, you can think of these changes as a specialized GraphQL\ndialect. The following are the differences you need to keep in mind.","ref":"AbsintheClient.html#module-differences-with-the-graphql-specification"},{"type":"behaviour","title":"Objects can be leaf nodes - AbsintheClient","doc":"Let's look at the `users` example mentioned before:\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10)\n }\n\"\"\"\n```\n\nYou'll notice that in the above example, `users` doesn't have an\naccompanying _selection set_ (that is, a set of child fields bounded\nby `{ ... }`). The GraphQL specification dictates that only scalar\nvalues can be \"leaf nodes\" in a GraphQL document... but to support\nunmodified struct values being returned (for example, Ecto schemas),\nif no selection set is provided for an object value (or list\nthereof), the entire value is returned.\n\nThe template can then use `users` as needed:\n\n```\n \n <%= for user <- @users do %>\n <%= link user.full_name, to: user_path(@conn_or_socket, :show, user) %> \n <% end %>\n \n```\n\nThis is useful for `Phoenix.HTML` helper functions that expect\nstructs with specific fields (especially `form_for`).\n\nOne way to think of this change is that, for objects, no selection\nset is equivalent to a \"splat\" operator (except, of course, even\nfields not defined in your GraphQL schema are returned as part of\nthe value).\n\nBut, never fear, nothing is stopping you from ignoring this behavior\nand providing a selection set if you want a traditionally narrow set\nof fields:\n\n```\n@graphql \"\"\"\n query ($filter: UserFilter) {\n users(filter: $filter, limit: 10) {\n id\n full_name\n }\n }\n\"\"\"\n```","ref":"AbsintheClient.html#module-objects-can-be-leaf-nodes"},{"type":"behaviour","title":"Scalar values aren't serialized - AbsintheClient","doc":"To remove the need for reparsing values, scalar values aren't serialized;\nPhoenix actions receive the original, unserialized values of GraphQL fields.\n\nThis is especially useful for custom scalar types. Using a couple of the\nadditional types packaged in `Absinthe.Type.Custom`, for example:\n\n- `:decimal` values are returned as `%Decimal{}` structs, not strings.\n- `:datetime` values are returned as `%DateTime{}` structs, not strings.\n\nIn short, GraphQL used in controllers is a query language to retrieve the values requested---there's no need to serialize the\nvalues to send them across HTTP.","ref":"AbsintheClient.html#module-scalar-values-aren-t-serialized"},{"type":"behaviour","title":"Fields use snake_case - AbsintheClient","doc":"Unlike in the GraphQL notation scheme we prefer for GraphQL APIs (that is,\n`camelCase` fields, which better match up with the expectations of JavaScript\nclients), fields used in documents provided as `@graphql` should use\n`snake_case` naming, as Elixir conventions use that notation style for atoms,\netc.","ref":"AbsintheClient.html#module-fields-use-snake_case"},{"type":"behaviour","title":"Atom keys - AbsintheClient","doc":"Because you are writing the GraphQL document in your controller and Absinthe\nis validating the document against your schema, atom keys are returned for\nfield names.","ref":"AbsintheClient.html#module-atom-keys"},{"type":"callback","title":"AbsintheClient.absinthe_pipeline/2","doc":"Customize the Absinthe processing pipeline.\n\nOnly implement this function if you need to change the pipeline used\nto process documents.","ref":"AbsintheClient.html#c:absinthe_pipeline/2"},{"type":"callback","title":"AbsintheClient.cast_param/3","doc":"Cast string param values to values Absinthe expects for variable input.\n\nSome scalar types, like `:integer` (GraphQL `Int`) require that raw,\nincoming value be a non-string type. This isn't a problem in\nGraphQL-over-HTTP because the variable values are provided as a JSON\npayload (which supports, i.e., integer values).\n\nTo support converting incoming param values to the format that\ncertain scalars expect, we support a `cast_param/3` callback\nfunction that takes a raw value, target type (e.g., the scalar\ntype), and the schema, and returns the transformed\nvalue. `cast_param/3` is overridable and the implementation already\nsupports `:integer` and `:float` types.\n\nIf you override `cast_param/3`, make sure you super or handle lists,\nnon-nulls, and input object values yourself; they're also processed\nusing the function.\n\nImportant: In the event that a value is _invalid_, just return it\nunchanged so that Absinthe's usual validation logic can report it as\ninvalid.","ref":"AbsintheClient.html#c:cast_param/3"},{"type":"function","title":"AbsintheClient.default_pipeline/2","doc":"","ref":"AbsintheClient.html#default_pipeline/2"},{"type":"function","title":"AbsintheClient.variables/1","doc":"","ref":"AbsintheClient.html#variables/1"},{"type":"module","title":"AbsintheClient.Helpers","doc":"","ref":"AbsintheClient.Helpers.html"},{"type":"function","title":"AbsintheClient.Helpers.assign/3","doc":"","ref":"AbsintheClient.Helpers.html#assign/3"},{"type":"function","title":"AbsintheClient.Helpers.error/2","doc":"","ref":"AbsintheClient.Helpers.html#error/2"},{"type":"function","title":"AbsintheClient.Helpers.maybe_to_atom/1","doc":"","ref":"AbsintheClient.Helpers.html#maybe_to_atom/1"},{"type":"module","title":"ConsoleHelpers","doc":"Handy aliases and imports to add to your iex CLI session","ref":"ConsoleHelpers.html"},{"type":"module","title":"DaisyTheme","doc":"","ref":"DaisyTheme.html"},{"type":"function","title":"DaisyTheme.adjust/5","doc":"","ref":"DaisyTheme.html#adjust/5"},{"type":"function","title":"DaisyTheme.clamp/3","doc":"","ref":"DaisyTheme.html#clamp/3"},{"type":"function","title":"DaisyTheme.darken/2","doc":"","ref":"DaisyTheme.html#darken/2"},{"type":"function","title":"DaisyTheme.darker/5","doc":"","ref":"DaisyTheme.html#darker/5"},{"type":"function","title":"DaisyTheme.default_theme/0","doc":"","ref":"DaisyTheme.html#default_theme/0"},{"type":"function","title":"DaisyTheme.generate/1","doc":"","ref":"DaisyTheme.html#generate/1"},{"type":"function","title":"DaisyTheme.is_dark?/1","doc":"","ref":"DaisyTheme.html#is_dark?/1"},{"type":"function","title":"DaisyTheme.keys/0","doc":"","ref":"DaisyTheme.html#keys/0"},{"type":"function","title":"DaisyTheme.lighten/2","doc":"","ref":"DaisyTheme.html#lighten/2"},{"type":"function","title":"DaisyTheme.style_attr/1","doc":"","ref":"DaisyTheme.html#style_attr/1"},{"type":"function","title":"DaisyTheme.theme/1","doc":"","ref":"DaisyTheme.html#theme/1"},{"type":"module","title":"DummyAdapter","doc":"","ref":"DummyAdapter.html"},{"type":"module","title":"Entrepot","doc":"Minimal, composable file upload, storage, and streamed data migrations for Elixir apps, flexibly and with minimal dependencies.\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot.svg)](https://hex.pm/packages/entrepot)\n[![CI status](https://github.com/bonfire-networks/entrepot/workflows/CI/badge.svg)](https://github.com/bonfire-networks/entrepot/actions)\n\n:warning: Although it's been used in production for over a year without issue, Entrepôt is experimental and still in active development. Accepting file uploads introduces specific security vulnerabilities. Use at your own risk.","ref":"Entrepot.html"},{"type":"module","title":"Concepts - Entrepot","doc":"Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: [storage](#storage), [upload](#upload), [locator](#locator), and optionally, [uploader](#uploader), which provides a more ergonomic API for the other 3.\n\nIt is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.\n\nSo what does it do? Here's a theoretical example of a use case with an Ecto 1 schema, which stores the file retrieved from a URL, along with some additional metadata:\n\n```\n def create_attachment(upload, user) do\n Multi.new()\n |> Multi.run(:upload, fn _, _ ->\n YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())\n end)\n |> Multi.insert(:attachment, fn %{upload: file_id} ->\n %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: \"document\"})\n end)\n |> Repo.transaction()\n end\n```\n\nThen to access the file:\n\n```\n%Attachment{file_data: file} = attachment\n\n{:ok, contents} = Disk.read(file.id)\n```\n\n 1 *See [integrations](#integrations) for streamlined use with Ecto.*","ref":"Entrepot.html#module-concepts"},{"type":"module","title":"Storage - Entrepot","doc":"A \"storage\" is a [behaviour](https://elixirschool.com/en/lessons/advanced/behaviours/) that implements the following \"file-like\" callbacks:\n\n* read\n* put\n* delete\n\nImplementing your own storage is as easy as creating a module that quacks this way. Each callback should accept an optional list of options as the last arg. Which options are supported is up to the module that implements the callbacks.","ref":"Entrepot.html#module-storage"},{"type":"module","title":"Upload - Entrepot","doc":"Upload is a [protocol](https://elixir-lang.org/getting-started/protocols.html) consisting of the following two functions:\n\n* contents\n* name\n\nA storage uses this interface to figure how to extract the file data from a given struct and how to identify it. See `Entrepot.Locator` for an example of how this protocol can be implemented.","ref":"Entrepot.html#module-upload"},{"type":"module","title":"Locator - Entrepot","doc":"Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.\n\nLocator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for \"promoting\" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage 2 :\n\n```\nold_file_data = %Locator{id: \"/path/to/file.jpg\", storage: Disk, metadata: %{}}\n{:ok, new_id} = S3.put(old_file_data)`\n```\n\nNote: always remember to take care of cleaning up the old file as Entrepot *never* automatically removes files:\n\n`Disk.delete(old_file_data.id)`","ref":"Entrepot.html#module-locator"},{"type":"module","title":"Uploader - Entrepot","doc":"This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can `use` the uploader to codify the handling for specific types of assets.\n\n```\ndefmodule AvatarUploader do\n use Entrepot.Uploader, storages: [cache: Disk, store: S3]\n\n def build_options(upload, :cache, opts) do\n Keyword.put(opts, :prefix, \"cache/#{Date.utc_today()}\")\n end\n\n def build_options(upload, :store, opts) do\n opts\n |> Keyword.put(:prefix, \"users/#{opts[:user_id]}/avatar\")\n |> Keyword.drop([:user_id])\n end\n\n def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()]\nend\n```\n\nThen you can get the files where they need to be without constructing all the options everywhere they might be uploaded: `AvatarUploader.store(upload, :store, user_id: 1)`\n\nNote: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.","ref":"Entrepot.html#module-uploader"},{"type":"module","title":"Built-in Integrations - Entrepot","doc":"Entrepôt's module design is intended to make it easy to implement your own custom utilities for handling files in the way you need. However, anticipating the most common use cases, that is facilitated with the following optional modules and add-on library.\n\nThere are several implementations some common file storages (including S3/Digital Ocean) and uploads (including `Plug.Upload`).","ref":"Entrepot.html#module-built-in-integrations"},{"type":"module","title":"Storages - Entrepot","doc":"Entrepôt ships with the following storage implementations:\n\n- [Disk](#Disk)\n- [S3](#S3)\n- [RAM](#RAM)","ref":"Entrepot.html#module-storages"},{"type":"module","title":"Disk - Entrepot","doc":"This saves uploaded files to a local disk. It is useful for caching uploads while you validate other data, and/or perform some file processing.\n\n#### configuration\n\n- To set the root directory where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.Disk, root_dir: \"tmp\")`\n\n#### options\n\n- `prefix`: This should be a valid system path that will be appended to the root. If it does not exist, Disk will create it.\n- `force`: If this option is set to a truthy value, Disk will overwrite any existing file at the derived path. Use with caution!\n\n#### notes\n\nSince it is possible for files with the same name to be uploaded multiple times, Disk needs some additional info to uniquely identify the file. Disk _does not_ overwrite files with the same name by default. To ensure an upload can be stored, the combination of the `Upload.name` and `prefix` should be unique.","ref":"Entrepot.html#module-disk"},{"type":"module","title":"S3 - Entrepot","doc":"This storage uploads files to [AWS's S3](https://aws.amazon.com/s3/) service. It also works with [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/).\n\n#### configuration\n\n- To set the bucket where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: \"whatever\")`\n\n#### options\n\n- prefix: A string to prepend to the upload's key\n- s3_options: Keyword list of option that will passed directly to ex_aws_s3\n\n#### dependencies\n\nSome of the implementations might require further dependencies (currently only [S3](#s3)-compatible storage) that you will also need to add to your project's deps\n```\n{:ex_aws, \"~> 2.0\"}\n{:ex_aws_s3, \"~> 2.0\"}\n```","ref":"Entrepot.html#module-s3"},{"type":"module","title":"RAM - Entrepot","doc":"Uses Elixir's [StringIO](https://hexdocs.pm/elixir/StringIO.html) module to store file contents in memory. Since the \"files\" are essentially just strings, they will not be persisted and will error if they are read back from a database, for example. However, operations are correspondingly very fast and thus suitable for tests or other temporary file operations.","ref":"Entrepot.html#module-ram"},{"type":"module","title":"uploads - Entrepot","doc":"There are implementation of the `Entrepot.Upload` protocol for the following modules:\n\n- [URI](#URI)\n- [Plug.Upload](#plugupload)","ref":"Entrepot.html#module-uploads"},{"type":"module","title":"URI - Entrepot","doc":"This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a [TUS server](https://tus.io/).\n\nYou can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:\n\n```\ndef attach(conn, %{\"attachment\" => %{\"url\" => url}}) when url != \"\" do\n URI.parse(url)\n |> Disk.put(upload)\n\n # ...redirect, etc\nend\n```\n\n#### notes\n\nThis implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.","ref":"Entrepot.html#module-uri"},{"type":"module","title":"Plug.Upload - Entrepot","doc":"This supports multi-part form submissions handled by [Plug](https://hexdocs.pm/plug/Plug.Upload.html#content).\n\n## [EntrepôtEcto](https://github.com/bonfire-networks/entrepot_ecto)\n\nThere is an external library (because it needs Ecto as a dependency) which provides `Entrepot.Ecto.Type` for Ecto schema fields to easily handle persisting Locator data in your repository.\n\n---\n\nNote: Entrepôt was originally forked from [Capsule](https://github.com/elixir-capsule)","ref":"Entrepot.html#module-plug-upload"},{"type":"function","title":"Entrepot.add_metadata/2","doc":"","ref":"Entrepot.html#add_metadata/2"},{"type":"function","title":"Entrepot.add_metadata/3","doc":"Adds metadata to a Locator.","ref":"Entrepot.html#add_metadata/3"},{"type":"function","title":"Parameters - Entrepot.add_metadata/3","doc":"- `locator`: A `Locator` struct to which metadata will be added.\n- `key`: A key for the metadata (when adding a single key-value pair).\n- `val`: A value for the metadata (when adding a single key-value pair).\n- `data`: A map or keyword list of metadata to be added.","ref":"Entrepot.html#add_metadata/3-parameters"},{"type":"function","title":"Returns - Entrepot.add_metadata/3","doc":"- `{:ok, Locator.t()}`: An updated `Locator` struct with the new metadata.\n- `{:error, term()}`: The original error tuple if given an error tuple.","ref":"Entrepot.html#add_metadata/3-returns"},{"type":"function","title":"Examples - Entrepot.add_metadata/3","doc":"iex> Entrepot.add_metadata(%Locator{}, :key, \"value\")\n {:ok, %Locator{metadata: %{key: \"value\"}}}\n\n iex> Entrepot.add_metadata(%Locator{key: \"value\"}, %{key2: \"value2\"})\n {:ok, %Locator{metadata: %{key: \"value1\", key2: \"value2\"}}}","ref":"Entrepot.html#add_metadata/3-examples"},{"type":"function","title":"Entrepot.copy/3","doc":"Copies a file from one storage to another.","ref":"Entrepot.html#copy/3"},{"type":"function","title":"Parameters - Entrepot.copy/3","doc":"- `locator`: A `Locator` struct representing the file to be copied.\n- `dest_storage`: The destination storage module.\n- `opts`: Optional keyword list of options to be passed to the storage modules.","ref":"Entrepot.html#copy/3-parameters"},{"type":"function","title":"Returns - Entrepot.copy/3","doc":"- `{:ok, Locator.t()}`: A new `Locator` struct for the copied file.\n- `{:error, term()}`: An error tuple if the copy operation fails.","ref":"Entrepot.html#copy/3-returns"},{"type":"function","title":"Raises - Entrepot.copy/3","doc":"- Raises an error if attempting to copy a file to the same storage.","ref":"Entrepot.html#copy/3-raises"},{"type":"function","title":"Examples - Entrepot.copy/3","doc":"iex> Entrepot.copy(%Locator{id: \"file.txt\", storage: Disk}, S3)\n {:ok, %Locator{id: \"new_id\", storage: S3, metadata: %{copied_from: Disk}}}","ref":"Entrepot.html#copy/3-examples"},{"type":"function","title":"Entrepot.storage!/1","doc":"Resolves the storage module from a Locator.","ref":"Entrepot.html#storage!/1"},{"type":"function","title":"Parameters - Entrepot.storage!/1","doc":"- `locator`: A `Locator` struct containing the storage information.","ref":"Entrepot.html#storage!/1-parameters"},{"type":"function","title":"Returns - Entrepot.storage!/1","doc":"- The resolved storage module as an atom.","ref":"Entrepot.html#storage!/1-returns"},{"type":"function","title":"Raises - Entrepot.storage!/1","doc":"- `InvalidStorage`: If the storage module cannot be resolved.","ref":"Entrepot.html#storage!/1-raises"},{"type":"function","title":"Examples - Entrepot.storage!/1","doc":"iex> Entrepot.storage!(%Locator{storage: Disk})\n Disk\n\n iex> Entrepot.storage!(%Locator{storage: \"Elixir.Disk\"})\n Disk","ref":"Entrepot.html#storage!/1-examples"},{"type":"module","title":"Entrepot.Ecto","doc":"Ecto integration for [Entrepôt](https://github.com/bonfire-networks/entrepot)\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot_ecto.svg)](https://hex.pm/packages/entrepot_ecto)\n[![CI status](https://github.com/bonfire-networks/entrepot_ecto/workflows/CI/badge.svg)](https://github.com/bonfire-networks/capsulei_ecto/actions)\n\nThis package adds the following two features to support the use of Entrepôt with Ecto:\n\n1. Custom Type\n2. Changeset helper\n\n## `Entrepot.Ecto.Type`\n\nIn your Ecto schema specify your file field with the following type to get serialization of uploads (`Entrepot.Locator`) to maps:\n\n```\ndefmodule Attachment\n use Ecto.Schema\n\n schema \"attachments\" do\n field :file_data, Entrepot.Ecto.Type\n end\nend\n```\n\n## `Entrepot.Ecto.upload`\n\nCast params to uploaded data with `Entrepot.Ecto.upload`. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.\n\nIt is expected to return either a success tuple with the `Locator` struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.\n\nEven if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], fn {_field, upload}, changeset ->\n case Entrepot.Storages.Disk.put(upload) do\n {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)\n error_tuple -> add_error(changeset, \"upload just...failed\")\n end\n end)\n |> validate_attachment\n\n ```\n\nHowever, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], MyApp.Attacher, :attach)\n ```\n---","ref":"Entrepot.Ecto.html"},{"type":"module","title":"Upload cleanup - Entrepot.Ecto","doc":"Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).\n\nOne good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:\n\n ```\n def create_attachment(user, attrs) do\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)\n |> Repo.insert()\n |> case do\n {:ok, attachment} = success_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Attachment.promote_upload(attachment) end\n )\n\n success_tuple\n\n {:error, %{changes: %{file_data: file_data}}} = error_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Disk.delete(file_data.id) end\n )\n\n error_tuple\n end\n ```\n\nIn this example, `Attachment.promote_upload(attachment)` would handle moving the file and updating the file data in the db. It uses `Multi` to ensure all operations succeed or fail together:\n\n ```\n def promote_upload(attachment) do\n Multi.new()\n |> Multi.run(:copy_file, fn _, _ ->\n NetworkStorage.put(attachment.file_data.id)\n end)\n |> Multi.update(:updated_schema, fn %{move_file: new_data} ->\n Attachment.changeset(attachment, %{file_data: new_data })\n end)\n |> Multi.run(:delete_old_file, fn _, _ ->\n Disk.delete(attachment.file_data.id)\n end)\n |> Repo.transaction()\n end\n ```","ref":"Entrepot.Ecto.html#module-upload-cleanup"},{"type":"module","title":"Testing - Entrepot.Ecto","doc":"Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:\n\n ```\n %Attachment{\n file_data: %{\n id: \"fake.jpg\",\n metadata: %{name: \"fake\"}, size: 100\n }\n }\n |> Repo.insert!()\n ```\n\nIf you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.\n\nYou can configure your test environment to use the RAM storage:\n\n ```\n {:ok, id} = Entrepot.Storages.RAM.put(some_upload)\n\n Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})\n ```\n\nOr, for maximum performance, you can a simple struct that implements the `Upload` protocol:\n\n ```\n defmodule Entrepot.MockUpload do\n defstruct content: \"Hi, I'm a file\", name: \"hi\"\n\n defimpl Entrepot.Upload do\n def contents(mock), do: {:ok, mock.content}\n\n def name(mock), do: mock.name\n end\n end\n ```\n\n---\nNote: Entrepôt was originally forked from [Capsule](https://github.com/elixir-capsule)","ref":"Entrepot.Ecto.html#module-testing"},{"type":"function","title":"Entrepot.Ecto.upload/4","doc":"Uploads data with `Entrepot` using a function.","ref":"Entrepot.Ecto.html#upload/4"},{"type":"function","title":"Parameters - Entrepot.Ecto.upload/4","doc":"- `changeset`: The changeset to update.\n- `params`: Parameters to upload.\n- `permitted`: List of permitted fields.\n- `function`: A function with arity 2 that handles the upload.","ref":"Entrepot.Ecto.html#upload/4-parameters"},{"type":"function","title":"Examples - Entrepot.Ecto.upload/4","doc":"iex> changeset = %Ecto.Changeset{}\n iex> fun = fn (_params, _changeset) -> %Entrepot.Locator{} end\n iex> Entrepot.Ecto.upload(changeset, %{\"field\" => \"value\"}, [\"field\"], fun)\n %Ecto.Changeset{}","ref":"Entrepot.Ecto.html#upload/4-examples"},{"type":"function","title":"Entrepot.Ecto.upload/5","doc":"Uploads data with `Entrepot` using a module and function name.","ref":"Entrepot.Ecto.html#upload/5"},{"type":"function","title":"Parameters - Entrepot.Ecto.upload/5","doc":"- `changeset`: The changeset to update.\n- `params`: Parameters to upload.\n- `permitted`: List of permitted fields.\n- `module`: The module containing the function.\n- `function`: The function name within the module.","ref":"Entrepot.Ecto.html#upload/5-parameters"},{"type":"function","title":"Examples - Entrepot.Ecto.upload/5","doc":"iex> changeset = %Ecto.Changeset{}\n iex> Entrepot.Ecto.upload(changeset, %{\"field\" => \"value\"}, [\"field\"], SomeModule, :some_function)\n %Ecto.Changeset{}","ref":"Entrepot.Ecto.html#upload/5-examples"},{"type":"module","title":"Entrepot.Ecto.Type","doc":"","ref":"Entrepot.Ecto.Type.html"},{"type":"function","title":"Entrepot.Ecto.Type.cast/1","doc":"","ref":"Entrepot.Ecto.Type.html#cast/1"},{"type":"function","title":"Entrepot.Ecto.Type.dump/1","doc":"","ref":"Entrepot.Ecto.Type.html#dump/1"},{"type":"function","title":"Entrepot.Ecto.Type.embed_as/1","doc":"","ref":"Entrepot.Ecto.Type.html#embed_as/1"},{"type":"function","title":"Entrepot.Ecto.Type.equal?/2","doc":"","ref":"Entrepot.Ecto.Type.html#equal?/2"},{"type":"function","title":"Entrepot.Ecto.Type.load/1","doc":"","ref":"Entrepot.Ecto.Type.html#load/1"},{"type":"function","title":"Entrepot.Ecto.Type.type/0","doc":"","ref":"Entrepot.Ecto.Type.html#type/0"},{"type":"exception","title":"Entrepot.Errors.InvalidLocator","doc":"","ref":"Entrepot.Errors.InvalidLocator.html"},{"type":"exception","title":"Entrepot.Errors.InvalidStorage","doc":"","ref":"Entrepot.Errors.InvalidStorage.html"},{"type":"module","title":"Entrepot.Locator","doc":"A struct representing a stored file's location and metadata.\n\nThe `Locator` struct contains information about where a file is stored,\nincluding its unique identifier, the storage backend used, and any\nadditional metadata.","ref":"Entrepot.Locator.html"},{"type":"function","title":"Entrepot.Locator.new/1","doc":"Creates a new Locator struct.","ref":"Entrepot.Locator.html#new/1"},{"type":"function","title":"Parameters - Entrepot.Locator.new/1","doc":"- `attrs`: A map or keyword list of attributes for the Locator.","ref":"Entrepot.Locator.html#new/1-parameters"},{"type":"function","title":"Returns - Entrepot.Locator.new/1","doc":"- `{:ok, Locator.t()}`: A new `Locator` struct.\n- `{:error, String.t()}`: An error message if the input is invalid.","ref":"Entrepot.Locator.html#new/1-returns"},{"type":"function","title":"Examples - Entrepot.Locator.new/1","doc":"iex> Entrepot.Locator.new(id: \"file.txt\", storage: Disk)\n {:ok, %Entrepot.Locator{id: \"file.txt\", storage: Disk, metadata: %{}}}\n\n iex> Entrepot.Locator.new(id: 123, storage: Disk)\n {:error, \"id must be binary\"}","ref":"Entrepot.Locator.html#new/1-examples"},{"type":"function","title":"Entrepot.Locator.new!/1","doc":"Creates a new Locator struct, raising an error if the input is invalid.","ref":"Entrepot.Locator.html#new!/1"},{"type":"function","title":"Parameters - Entrepot.Locator.new!/1","doc":"- `attrs`: A map or keyword list of attributes for the Locator.","ref":"Entrepot.Locator.html#new!/1-parameters"},{"type":"function","title":"Returns - Entrepot.Locator.new!/1","doc":"- A new `Locator` struct.","ref":"Entrepot.Locator.html#new!/1-returns"},{"type":"function","title":"Raises - Entrepot.Locator.new!/1","doc":"- `Entrepot.Errors.InvalidLocator`: If the input is invalid.","ref":"Entrepot.Locator.html#new!/1-raises"},{"type":"function","title":"Examples - Entrepot.Locator.new!/1","doc":"iex> Entrepot.Locator.new!(id: \"file.txt\", storage: Disk)\n %Entrepot.Locator{id: \"file.txt\", storage: Disk, metadata: %{}}\n\n iex> Entrepot.Locator.new!(id: 123, storage: Disk)\n ** (Entrepot.Errors.InvalidLocator) id must be binary","ref":"Entrepot.Locator.html#new!/1-examples"},{"type":"type","title":"Entrepot.Locator.t/0","doc":"","ref":"Entrepot.Locator.html#t:t/0"},{"type":"behaviour","title":"Entrepot.Storage","doc":"A behaviour module defining the interface for storage backends.\n\nThis module specifies the callbacks that must be implemented by any storage backend\nused with Entrepôt.","ref":"Entrepot.Storage.html"},{"type":"callback","title":"Entrepot.Storage.delete/1","doc":"","ref":"Entrepot.Storage.html#c:delete/1"},{"type":"callback","title":"Entrepot.Storage.delete/2","doc":"Deletes a file from the storage backend.","ref":"Entrepot.Storage.html#c:delete/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.delete/2","doc":"- `locator_id`: The unique identifier of the file to be deleted.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:delete/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.delete/2","doc":"- `:ok`: If the file was successfully deleted.\n- `{:error, String.t()}`: An error message if the file cannot be deleted.","ref":"Entrepot.Storage.html#c:delete/2-returns"},{"type":"callback","title":"Entrepot.Storage.path/1","doc":"","ref":"Entrepot.Storage.html#c:path/1"},{"type":"callback","title":"Entrepot.Storage.path/2","doc":"Retrieves the local filesystem path of the stored file, if applicable.","ref":"Entrepot.Storage.html#c:path/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.path/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:path/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.path/2","doc":"- `binary()`: The local filesystem path of the file.\n- `nil`: If a local path is not applicable or available.","ref":"Entrepot.Storage.html#c:path/2-returns"},{"type":"callback","title":"Entrepot.Storage.put/1","doc":"","ref":"Entrepot.Storage.html#c:put/1"},{"type":"callback","title":"Entrepot.Storage.put/2","doc":"Stores a file in the storage backend.","ref":"Entrepot.Storage.html#c:put/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.put/2","doc":"- `upload`: An `Upload` struct representing the file to be stored.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:put/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.put/2","doc":"- `{:ok, locator_id}`: The unique identifier of the stored file.\n- `{:error, String.t()}`: An error message if the file cannot be stored.","ref":"Entrepot.Storage.html#c:put/2-returns"},{"type":"callback","title":"Entrepot.Storage.read/1","doc":"","ref":"Entrepot.Storage.html#c:read/1"},{"type":"callback","title":"Entrepot.Storage.read/2","doc":"Reads the contents of the stored file.","ref":"Entrepot.Storage.html#c:read/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.read/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:read/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.read/2","doc":"- `{:ok, binary()}`: The contents of the file.\n- `{:error, String.t()}`: An error message if the file cannot be read.","ref":"Entrepot.Storage.html#c:read/2-returns"},{"type":"callback","title":"Entrepot.Storage.stream/1","doc":"","ref":"Entrepot.Storage.html#c:stream/1"},{"type":"callback","title":"Entrepot.Storage.stream/2","doc":"Creates a stream for reading the contents of the stored file.","ref":"Entrepot.Storage.html#c:stream/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.stream/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:stream/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.stream/2","doc":"- `IO.Stream.t()` | `File.Stream.t()` | `Stream.t()`: A stream for reading the file contents.","ref":"Entrepot.Storage.html#c:stream/2-returns"},{"type":"callback","title":"Entrepot.Storage.url/1","doc":"","ref":"Entrepot.Storage.html#c:url/1"},{"type":"callback","title":"Entrepot.Storage.url/2","doc":"Generates a URL for accessing the stored file.","ref":"Entrepot.Storage.html#c:url/2"},{"type":"callback","title":"Parameters - Entrepot.Storage.url/2","doc":"- `locator_id`: The unique identifier of the stored file.\n- `opts`: Optional list of options.","ref":"Entrepot.Storage.html#c:url/2-parameters"},{"type":"callback","title":"Returns - Entrepot.Storage.url/2","doc":"- `binary()`: The URL for accessing the file.\n- `nil`: If a URL cannot be generated.","ref":"Entrepot.Storage.html#c:url/2-returns"},{"type":"type","title":"Entrepot.Storage.locator_id/0","doc":"","ref":"Entrepot.Storage.html#t:locator_id/0"},{"type":"type","title":"Entrepot.Storage.option/0","doc":"","ref":"Entrepot.Storage.html#t:option/0"},{"type":"module","title":"Entrepot.Storages.Disk","doc":"","ref":"Entrepot.Storages.Disk.html"},{"type":"function","title":"Entrepot.Storages.Disk.clone/3","doc":"","ref":"Entrepot.Storages.Disk.html#clone/3"},{"type":"module","title":"Entrepot.Storages.RAM","doc":"","ref":"Entrepot.Storages.RAM.html"},{"type":"function","title":"Entrepot.Storages.RAM.clone/3","doc":"","ref":"Entrepot.Storages.RAM.html#clone/3"},{"type":"module","title":"Entrepot.Storages.S3","doc":"","ref":"Entrepot.Storages.S3.html"},{"type":"function","title":"Entrepot.Storages.S3.clone/3","doc":"","ref":"Entrepot.Storages.S3.html#clone/3"},{"type":"protocol","title":"Entrepot.Upload","doc":"A protocol defining the interface for file uploads.\n\nThis protocol should be implemented by any struct that represents an uploadable file.\n\nThere are built-in implementations for `Plug.Upload`, `File.Stream, `Stream`, `URI` and `Entrepot.Locator`.","ref":"Entrepot.Upload.html"},{"type":"function","title":"Entrepot.Upload.contents/1","doc":"Retrieves the contents of the upload.","ref":"Entrepot.Upload.html#contents/1"},{"type":"function","title":"Returns - Entrepot.Upload.contents/1","doc":"- `{:ok, iodata()}`: The contents of the upload.\n- `{:error, String.t()}`: An error message if the contents cannot be retrieved.","ref":"Entrepot.Upload.html#contents/1-returns"},{"type":"function","title":"Entrepot.Upload.name/1","doc":"Retrieves the name of the upload.","ref":"Entrepot.Upload.html#name/1"},{"type":"function","title":"Returns - Entrepot.Upload.name/1","doc":"- `String.t()`: The name of the upload.","ref":"Entrepot.Upload.html#name/1-returns"},{"type":"function","title":"Entrepot.Upload.path/1","doc":"Retrieves the path of the upload, if available.","ref":"Entrepot.Upload.html#path/1"},{"type":"function","title":"Returns - Entrepot.Upload.path/1","doc":"- `String.t()`: The path of the upload.\n- `nil`: If no path is available.","ref":"Entrepot.Upload.html#path/1-returns"},{"type":"type","title":"Entrepot.Upload.t/0","doc":"All the types that implement this protocol.","ref":"Entrepot.Upload.html#t:t/0"},{"type":"behaviour","title":"Entrepot.Uploader","doc":"A behaviour module for implementing custom uploaders.\n\nThis module provides a set of callbacks and a macro for easily defining uploaders\nthat work with different storage backends.","ref":"Entrepot.Uploader.html"},{"type":"callback","title":"Entrepot.Uploader.build_metadata/3","doc":"Builds metadata for the stored file.","ref":"Entrepot.Uploader.html#c:build_metadata/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.build_metadata/3","doc":"- `locator`: The `Locator` struct representing the stored file.\n- `storage`: The storage backend used.\n- `opts`: The options used in the storage operation.","ref":"Entrepot.Uploader.html#c:build_metadata/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.build_metadata/3","doc":"- A keyword list or map of metadata to be added to the `Locator`.","ref":"Entrepot.Uploader.html#c:build_metadata/3-returns"},{"type":"callback","title":"Entrepot.Uploader.build_options/3","doc":"Builds options for the storage operation.","ref":"Entrepot.Uploader.html#c:build_options/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.build_options/3","doc":"- `upload`: The upload to be stored.\n- `storage`: The storage backend to use.\n- `opts`: Initial list of options.","ref":"Entrepot.Uploader.html#c:build_options/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.build_options/3","doc":"- A list of options to be used in the storage operation.","ref":"Entrepot.Uploader.html#c:build_options/3-returns"},{"type":"callback","title":"Entrepot.Uploader.store/3","doc":"Stores an upload in the specified storage.","ref":"Entrepot.Uploader.html#c:store/3"},{"type":"callback","title":"Parameters - Entrepot.Uploader.store/3","doc":"- `upload`: The upload to be stored.\n- `storage`: The storage backend to use.\n- `opts`: Optional list of options for the storage operation.","ref":"Entrepot.Uploader.html#c:store/3-parameters"},{"type":"callback","title":"Returns - Entrepot.Uploader.store/3","doc":"- `{:ok, Locator.t()}`: A `Locator` struct representing the stored file.\n- `{:error, any()}`: An error tuple if the storage operation fails.","ref":"Entrepot.Uploader.html#c:store/3-returns"},{"type":"type","title":"Entrepot.Uploader.option/0","doc":"","ref":"Entrepot.Uploader.html#t:option/0"},{"type":"type","title":"Entrepot.Uploader.storage/0","doc":"","ref":"Entrepot.Uploader.html#t:storage/0"},{"type":"module","title":"Import2Alias","doc":"","ref":"Import2Alias.html"},{"type":"function","title":"Import2Alias.import2alias/2","doc":"","ref":"Import2Alias.html#import2alias/2"},{"type":"module","title":"Import2Alias.CallerTracer","doc":"","ref":"Import2Alias.CallerTracer.html"},{"type":"function","title":"Import2Alias.CallerTracer.trace/2","doc":"","ref":"Import2Alias.CallerTracer.html#trace/2"},{"type":"module","title":"Import2Alias.Server","doc":"","ref":"Import2Alias.Server.html"},{"type":"function","title":"Import2Alias.Server.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Import2Alias.Server.html#child_spec/1"},{"type":"function","title":"Import2Alias.Server.entries/0","doc":"","ref":"Import2Alias.Server.html#entries/0"},{"type":"function","title":"Import2Alias.Server.record/6","doc":"","ref":"Import2Alias.Server.html#record/6"},{"type":"function","title":"Import2Alias.Server.start_link/1","doc":"","ref":"Import2Alias.Server.html#start_link/1"},{"type":"task","title":"mix bonfire.account.new","doc":"Creates an account in the database, automatically activated","ref":"Mix.Tasks.Bonfire.Account.New.html"},{"type":"task","title":"Usage - mix bonfire.account.new","doc":"```\njust mix bonfire.account.new [email@address]\n```\n\nYou will be prompted for a password and an email if it was not provided.","ref":"Mix.Tasks.Bonfire.Account.New.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.get/4","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#get/4"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.password/1","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#password/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.password/3","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#password/3"},{"type":"function","title":"Mix.Tasks.Bonfire.Account.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Account.New.html#run/1"},{"type":"task","title":"mix bonfire.extension.compile","doc":"(re)compiles dependencies.\n\nTODO: check if we still need this now that we treat extensions as umbrella apps in dev...\n\nThis is a modified version of Elixir's `Mix.Tasks.Deps.Compile` which was needed to compile dependencies and extract localisable strings in `Mix.Tasks.Bonfire.Localise.Extract`\n\nBy default, compile all dependencies. A list of dependencies\ncan be given compile multiple dependencies in order.\n\nThis task attempts to detect if the project contains one of\nthe following files and act accordingly:\n\n * `mix.exs` - invokes `mix compile`\n * otherwise skip\n\nIf a list of dependencies is given, Mix will attempt to compile\nthem as is. For example, if project `a` depends on `b`, calling\n`mix deps.compile a` will compile `a` even if `b` is out of\ndate. This is to allow parts of the dependency tree to be\nrecompiled without propagating those changes upstream. To ensure\n`b` is included in the compilation step, pass `--include-children`.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.force_compile/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#force_compile/2"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.loaded_by_name/3","doc":"Receives a list of dependency names and returns loaded `Mix.Dep`s.\nLogs a message if the dependency could not be found.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#loaded_by_name/3"},{"type":"function","title":"Exceptions - Mix.Tasks.Bonfire.Extension.Compile.loaded_by_name/3","doc":"This function raises an exception if any of the dependencies\nprovided in the project are in the wrong format.","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#loaded_by_name/3-exceptions"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#run/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.touch_manifests/0","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#touch_manifests/0"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.Compile.try_compile/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.Compile.html#try_compile/2"},{"type":"task","title":"mix bonfire.extension.copy_migrations","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.copy/3","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#copy/3"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.maybe_copy/2","doc":"","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#maybe_copy/2"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.CopyMigrations.run/1","doc":"Usage:\n`just mix bonfire.extension.copy_migrations my_extension`\nor\n`just mix bonfire.extension.copy_migrations` \n\nNOTE: if you don't specify what extension(s) to include, it will automatically include all extensions which:\n- start with `bonfire_`\n- and are included in the top-level app (not dependencies of dependencies)\n\nOptional args:\n\n--force (to not ask for confirmation before copying, or to overwrite existing migration files)\n--from priv/repo/migrations (to change the source repo paths, relative to each extension path)\n--to priv/repo/migrations (to change the target repo path (defaults to current flavour's migrations) relative to working directory)\n--repo MyRepo (to specify what repo to migrate after)","ref":"Mix.Tasks.Bonfire.Extension.CopyMigrations.html#run/1"},{"type":"task","title":"mix bonfire.extension.new","doc":"","ref":"Mix.Tasks.Bonfire.Extension.New.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Extension.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Extension.New.html#run/1"},{"type":"task","title":"mix bonfire.full_docs","doc":"Generates docs for your app and *all* of its deps","ref":"Mix.Tasks.Bonfire.FullDocs.html"},{"type":"task","title":"Command line options - mix bonfire.full_docs","doc":"* `--only` - the environment to include dependencies for\n * `--target` - the target to include dependencies for\n * `--exclude` - exclude dependencies which you do not want to see in docs.\n * any arguments supported by `mix docs` will be passed along","ref":"Mix.Tasks.Bonfire.FullDocs.html#module-command-line-options"},{"type":"task","title":"mix bonfire.load_testing","doc":"","ref":"Mix.Tasks.Bonfire.LoadTesting.html"},{"type":"function","title":"Mix.Tasks.Bonfire.LoadTesting.run/1","doc":"","ref":"Mix.Tasks.Bonfire.LoadTesting.html#run/1"},{"type":"task","title":"mix bonfire.localise.extract","doc":"Extracts translations by recompiling the Elixir source code.\n\n mix gettext.extract [OPTIONS]\n\nTranslations are extracted into POT (Portable Object Template) files (with a\n`.pot` extension). The location of these files is determined by the `:otp_app`\nand `:priv` options given by Gettext modules when they call `use Gettext`. One\nPOT file is generated for each translation domain.\n\nIt is possible to give the `--merge` option to perform merging\nfor every Gettext backend updated during merge:\n\n mix gettext.extract --merge\n\nAll other options passed to `gettext.extract` are forwarded to the\n`gettext.merge` task (`Mix.Tasks.Gettext.Merge`), which is called internally\nby this task. For example:\n\n mix gettext.extract --merge --no-fuzzy","ref":"Mix.Tasks.Bonfire.Localise.Extract.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Localise.Extract.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Localise.Extract.html#run/1"},{"type":"task","title":"mix bonfire.release","doc":"","ref":"Mix.Tasks.Bonfire.Release.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Release.main/1","doc":"","ref":"Mix.Tasks.Bonfire.Release.html#main/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Release.run/1","doc":"","ref":"Mix.Tasks.Bonfire.Release.html#run/1"},{"type":"task","title":"mix bonfire.secrets","doc":"Generates secrets and prints to the terminal.\n mix bonfire.secrets [length]\nBy default, it generates keys 64 characters long.\nThe minimum value for `length` is 32.","ref":"Mix.Tasks.Bonfire.Secrets.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Secrets.main/1","doc":"","ref":"Mix.Tasks.Bonfire.Secrets.html#main/1"},{"type":"function","title":"Mix.Tasks.Bonfire.Secrets.print/1","doc":"","ref":"Mix.Tasks.Bonfire.Secrets.html#print/1"},{"type":"task","title":"mix bonfire.user.admin.promote","doc":"Promotes a user to an administrator","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html"},{"type":"task","title":"Usage - mix bonfire.user.admin.promote","doc":"```\nmix bonfire.user.admin.promote username\n```","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.User.Admin.Promote.run/1","doc":"","ref":"Mix.Tasks.Bonfire.User.Admin.Promote.html#run/1"},{"type":"task","title":"mix bonfire.user.new","doc":"Creates an user in the database (and an account, automatically activated)","ref":"Mix.Tasks.Bonfire.User.New.html"},{"type":"task","title":"Usage - mix bonfire.user.new","doc":"```\njust mix bonfire.user.new [username] [email@address]\n```\n\nYou will be prompted for a password, and username/email if not provided.","ref":"Mix.Tasks.Bonfire.User.New.html#module-usage"},{"type":"function","title":"Mix.Tasks.Bonfire.User.New.run/1","doc":"","ref":"Mix.Tasks.Bonfire.User.New.html#run/1"},{"type":"task","title":"mix bonfire.widget.new","doc":"`just mix bonfire.widget.new Bonfire.MyUIExtension.MyWidget`\n\nwill present you with a diff and create new files","ref":"Mix.Tasks.Bonfire.Widget.New.html"},{"type":"function","title":"Mix.Tasks.Bonfire.Widget.New.ext_path_for_module/4","doc":"","ref":"Mix.Tasks.Bonfire.Widget.New.html#ext_path_for_module/4"},{"type":"function","title":"Mix.Tasks.Bonfire.Widget.New.igniter/2","doc":"","ref":"Mix.Tasks.Bonfire.Widget.New.html#igniter/2"},{"type":"task","title":"mix import2alias","doc":"","ref":"Mix.Tasks.Import2alias.html"},{"type":"module","title":"Nebulex.DiskAdapter","doc":"WIP: Nebulex disk adapter based on https://hexdocs.pm/nebulex/creating-new-adapter.html and https://hexdocs.pm/cachex/Cachex.Disk.html","ref":"Nebulex.DiskAdapter.html"},{"type":"module","title":"Nebulex.DiskAdapter.DiskCacheHelper","doc":"WIP: Nebulex disk adapter based on https://hexdocs.pm/nebulex/creating-new-adapter.html and https://hexdocs.pm/cachex/Cachex.Disk.html","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.cache_path/3","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#cache_path/3"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#child_spec/1"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_clear/2","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_clear/2"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_delete/3","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_delete/3"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_get/4","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_get/4"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_list/2","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_list/2"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.disk_put/4","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#disk_put/4"},{"type":"function","title":"Nebulex.DiskAdapter.DiskCacheHelper.start_link/1","doc":"","ref":"Nebulex.DiskAdapter.DiskCacheHelper.html#start_link/1"},{"type":"behaviour","title":"Paginator","doc":"Defines a paginator.\n\nThis module adds a `paginate/3` function to your `Ecto.Repo` so that you can\npaginate through results using opaque cursors.","ref":"Paginator.html"},{"type":"behaviour","title":"Usage - Paginator","doc":"defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n use Paginator\n end","ref":"Paginator.html#module-usage"},{"type":"behaviour","title":"Options - Paginator","doc":"`Paginator` can take any options accepted by `paginate/3`. This is useful when\nyou want to enforce some options globally across your project.","ref":"Paginator.html#module-options"},{"type":"behaviour","title":"Example - Paginator","doc":"defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n use Paginator,\n limit: 10, # sets the default limit to 10\n maximum_limit: 100, # sets the maximum limit to 100\n include_total_count: true, # include total count by default\n total_count_primary_key_field: :uuid # sets the total_count_primary_key_field to uuid for calculate total_count\n end\n\nNote that these values can be still be overriden when `paginate/3` is called.","ref":"Paginator.html#module-example"},{"type":"behaviour","title":"Use without macros - Paginator","doc":"If you wish to avoid use of macros or you wish to use a different name for\nthe pagination function you can define your own function like so:\n\n defmodule MyApp.Repo do\n use Ecto.Repo, otp_app: :my_app\n\n def my_paginate_function(queryable, opts \\ [], repo_opts \\ []) do\n defaults = [limit: 10] # Default options of your choice here\n opts = Keyword.merge(defaults, opts)\n Paginator.paginate(queryable, opts, __MODULE__, repo_opts)\n end\n end","ref":"Paginator.html#module-use-without-macros"},{"type":"function","title":"Paginator.cursor_for_record/3","doc":"Generate a cursor for the supplied record, in the same manner as the\n`before` and `after` cursors generated by `paginate/3`.\n\nFor the cursor to be compatible with `paginate/3`, `cursor_fields`\nmust have the same value as the `cursor_fields` option passed to it.","ref":"Paginator.html#cursor_for_record/3"},{"type":"function","title":"Example - Paginator.cursor_for_record/3","doc":"iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])\n \"g3QAAAABZAACaWRhAQ==\"\n\n iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: \"Alice\"}, [id: :asc, name: :desc])\n \"g3QAAAACZAACaWRhAWQABG5hbWVtAAAABUFsaWNl\"","ref":"Paginator.html#cursor_for_record/3-example"},{"type":"function","title":"Paginator.default_fetch_cursor_value/2","doc":"Default function used to get the value of a cursor field from the supplied\nmap. This function can be overriden in the `Paginator.Config` using the\n`fetch_cursor_value_fun` key.\n\nWhen using named bindings to sort on joined columns it will attempt to get\nthe value of joined column by using the named binding as the name of the\nrelationship on the original Ecto.Schema.","ref":"Paginator.html#default_fetch_cursor_value/2"},{"type":"function","title":"Example - Paginator.default_fetch_cursor_value/2","doc":"iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)\n 1\n\n iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: \"London\"}}, {:address, :city})\n \"London\"","ref":"Paginator.html#default_fetch_cursor_value/2-example"},{"type":"callback","title":"Paginator.paginate/3","doc":"Fetches all the results matching the query within the cursors.","ref":"Paginator.html#c:paginate/3"},{"type":"callback","title":"Options - Paginator.paginate/3","doc":"* `:after` - Fetch the records after this cursor.\n * `:before` - Fetch the records before this cursor.\n * `:cursor_fields` - The fields with sorting direction used to determine the\n cursor. In most cases, this should be the same fields as the ones used for sorting in the query.\n When you use named bindings in your query they can also be provided.\n * `:fetch_cursor_value_fun` function of arity 2 to lookup cursor values on returned records.\n Defaults to `Paginator.default_fetch_cursor_value/2`\n * `:include_total_count` - Set this to true to return the total number of\n records matching the query. Note that this number will be capped by\n `:total_count_limit`. Defaults to `false`.\n * `:total_count_primary_key_field` - Running count queries on specified column of the table\n * `:limit` - Limits the number of records returned per page. Note that this\n number will be capped by `:maximum_limit`. Defaults to `50`.\n * `:maximum_limit` - Sets a maximum cap for `:limit`. This option can be useful when `:limit`\n is set dynamically (e.g from a URL param set by a user) but you still want to\n enforce a maximum. Defaults to `500`.\n * `:total_count_limit` - Running count queries on tables with a large number\n of records is expensive so it is capped by default. Can be set to `:infinity`\n in order to count all the records. Defaults to `10,000`.","ref":"Paginator.html#c:paginate/3-options"},{"type":"callback","title":"Repo options - Paginator.paginate/3","doc":"This will be passed directly to `Ecto.Repo.all/2`, as such any option supported\nby this function can be used here.","ref":"Paginator.html#c:paginate/3-repo-options"},{"type":"callback","title":"Simple example - Paginator.paginate/3","doc":"query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)\n\n Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)","ref":"Paginator.html#c:paginate/3-simple-example"},{"type":"callback","title":"Example with using custom sort directions per field - Paginator.paginate/3","doc":"query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)\n\n Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)","ref":"Paginator.html#c:paginate/3-example-with-using-custom-sort-directions-per-field"},{"type":"callback","title":"Example with sorting on columns in joined tables - Paginator.paginate/3","doc":"from(\n p in Post,\n as: :posts,\n join: a in assoc(p, :author),\n as: :author,\n preload: [author: a],\n select: p,\n order_by: [\n {:asc, a.name},\n {:asc, p.id}\n ]\n )\n\n Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)\n\nWhen sorting on columns in joined tables it is necessary to use named bindings. In\nthis case we name it `author`. In the `cursor_fields` we refer to this named binding\nand its column name.\n\nTo build the cursor Paginator uses the returned Ecto.Schema. When using a joined\ncolumn the returned Ecto.Schema won't have the value of the joined column\nunless we preload it. E.g. in this case the cursor will be build up from\n`post.id` and `post.author.name`. This presupposes that the named of the\nbinding is the same as the name of the relationship on the original struct.\n\nOne level deep joins are supported out of the box but if we join on a second\nlevel, e.g. `post.author.company.name` a custom function can be supplied to\nhandle the cursor value retrieval. This also applies when the named binding\ndoes not map to the name of the relationship.","ref":"Paginator.html#c:paginate/3-example-with-sorting-on-columns-in-joined-tables"},{"type":"callback","title":"Example - Paginator.paginate/3","doc":"from(\n p in Post,\n as: :posts,\n join: a in assoc(p, :author),\n as: :author,\n join: c in assoc(a, :company),\n as: :company,\n preload: [author: a],\n select: p,\n order_by: [\n {:asc, a.name},\n {:asc, p.id}\n ]\n )\n\n Repo.paginate(query,\n cursor_fields: [{{:company, :name}, :asc}, id: :asc],\n fetch_cursor_value_fun: fn\n post, {{:company, name}, _} ->\n post.author.company.name\n\n post, field ->\n Paginator.default_fetch_cursor_value(post, field)\n end,\n limit: 50\n )","ref":"Paginator.html#c:paginate/3-example"},{"type":"function","title":"Paginator.paginated_query/2","doc":"","ref":"Paginator.html#paginated_query/2"},{"type":"module","title":"Paginator.Page","doc":"Defines a page.","ref":"Paginator.Page.html"},{"type":"module","title":"Fields - Paginator.Page","doc":"* `edges` - a list of entries contained in this page.\n* `page_info` - meta-data attached to this page.","ref":"Paginator.Page.html#module-fields"},{"type":"type","title":"Paginator.Page.t/0","doc":"","ref":"Paginator.Page.html#t:t/0"},{"type":"module","title":"Paginator.PageInfo","doc":"Defines page page_info.","ref":"Paginator.PageInfo.html"},{"type":"module","title":"Fields - Paginator.PageInfo","doc":"* `start_cursor` - an opaque cursor representing the first row of the current page, to be used with the `before` query parameter.\n* `end_cursor` - an opaque cursor representing the last row of the current page, to be used with the `after` query parameter.\n* `limit` - the maximum number of edges that can be contained in this page.\n* `page_count` - the number of edges on the current page.\n* `total_count` - the total number of edges matching the query.\n* `total_count_cap_exceeded` - a boolean indicating whether the `:total_count_limit` was exceeded.","ref":"Paginator.PageInfo.html#module-fields"},{"type":"type","title":"Paginator.PageInfo.opaque_cursor/0","doc":"","ref":"Paginator.PageInfo.html#t:opaque_cursor/0"},{"type":"type","title":"Paginator.PageInfo.t/0","doc":"","ref":"Paginator.PageInfo.html#t:t/0"},{"type":"module","title":"UserAuthLiveMount","doc":"","ref":"UserAuthLiveMount.html"},{"type":"function","title":"UserAuthLiveMount.on_mount/4","doc":"","ref":"UserAuthLiveMount.html#on_mount/4"},{"type":"extras","title":"Bonfire Networks","doc":"\n\n\n# Bonfire Networks \n\n[Bonfire](https://bonfirenetworks.org/) is an open-source framework for building federated digital spaces where people can gather, interact, and form communities online.\n\n![Bonfire wallpaper](https://i.imgur.com/dbRT0Z1.png)\n\n> #### Info {: .info}\n>\n> This project is in the beta stage - you're welcome to try out it out (specifically the social features in the classic flavour), but APIs may still change and no guarantees are given about stability. You can keep track of progress [in our milestones](https://github.com/bonfire-networks/bonfire-app/milestones?direction=asc&sort=due_date&state=open)","ref":"readme.html"},{"type":"extras","title":"Main features - Bonfire Networks","doc":"1. **Modular architecture**: Bonfire consists of extensions that shape the functionality and user experience of each digital space. Communities can enable or disable these extensions to customize their space according to their needs and vision.\n2. **Extensibility**: Developers can create new extensions to expand the capabilities of digital spaces, such as adding new activities or introducing innovative user experiences for existing functions.\n3. **Federation**: Bonfire allows digital spaces to connect and communicate with each other, enabling users to interact across different communities while maintaining their unique identities and preferences.\n4. **Flexibility**: Whether you're an individual developer or part of a larger team, Bonfire provides a flexible framework for building and customizing digital spaces that cater to a wide range of communities and purposes.\n\nBonfire empowers developers and communities to create engaging, customizable, and interconnected digital spaces that foster collaboration, creativity, and social interaction online.","ref":"readme.html#main-features"},{"type":"extras","title":"🔥 Flavours - Bonfire Networks","doc":"This repo includes configurations to run a few main [flavours of Bonfire](https://bonfirenetworks.org/apps/) you can choose from:\n* [Classic](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/classic) for basic social networking (beta)\n* [Community](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/community) with groups and topics functionality (alpha)\n* [Open Science](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/open-science) building the next generation of open science platforms (pre-alpha)\n* [Coordination](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/coordination) for organising work and collaborating around projects and tasks (pre-alpha)\n* [Cooperation](https://github.com/bonfire-networks/bonfire-app/tree/main/flavours/cooperation) for cooperative production, distribution, and exchange of economic resources (pre-alpha)\n\n","ref":"readme.html#flavours"},{"type":"extras","title":"How to get the most out of the documentation - Bonfire Networks","doc":"- **Developers**: You'll probably be interested in understanding how to build on Bonfire. The [dev setup](/docs/DEPLOY.md) will guide you through the installation of bonfire on your local machine. In the [Just commands](/docs/topics/JUST.md) page you will gain familiarities with the basic Bonfire CLI commands. From there you may want to continue [developing a new extension](/docs/building/create-a-new-extension.md), or learning more about the internals and the [Bonfire architecture](/docs/topics/ARCHITECTURE.md).\n\n- **Users**: Whether you are a user who is looking for an existing digital place to join, or want to understand more about how Bonfire works and how to get the most out of it, the [Community Manual](https://bonfirenetworks.org/#TODO) is a good place to start. There you can learn about how to customize your experience, what boundaries are and how to experience a new and safer way to interact with federated social networks.\n\n- **Community organisers & sysadmins**: Ready to launch your digital space? We got you covered on our [hosting guide](/docs/DEPLOY.md).","ref":"readme.html#how-to-get-the-most-out-of-the-documentation"},{"type":"extras","title":"Prerequisite knowledge - Bonfire Networks","doc":"Bonfire aims to be beginner-friendly, but to keep the documentation focused on the framework's functionalities, we assume a basic understanding of the following technologies:\n\n- **Elixir**: If you're new to Elixir or need a refresher, start with the [Elixir guide](https://hexdocs.pm/elixir/introduction.html).\n- **Phoenix/LiveView** and **Surface**: Bonfire's official web UI is built with the Surface framework, which itself is based on Phoenix LiveView. If you're unfamiliar with them, check out the [Phoenix overview](https://hexdocs.pm/phoenix/overview.html), [Phoenix LiveView guide](https://hexdocs.pm/phoenix_live_view/welcome.html), and [Surface docs](https://surface-ui.org). You may also be interested in the [Phoenix LiveView video course by Pragmatic Studio](https://pragmaticstudio.com/phoenix-liveview).\n- **PostgreSQL**: Bonfire uses PostgreSQL as its primary database. Basic knowledge of SQL and PostgreSQL is helpful.\n\nBonfire also provides a [GraphQL API](/docs/topics/GRAPHQL.md) for developers who want to build custom frontends.\n\nThroughout the documentation, we'll make sure to provide links to relevant resources when introducing new concepts to help you along the way. We have a strong affinity for Elixir and believe it's a powerful language for building scalable and maintainable social networks.","ref":"readme.html#prerequisite-knowledge"},{"type":"extras","title":"Join our community - Bonfire Networks","doc":"If you have questions about anything related to Bonfire, you're always welcome to ask our community on [Matrix](https://matrix.to/#/#bonfire-networks:matrix.org), [Slack](https://join.slack.com/t/elixir-lang/shared_invite/zt-2ko4792lz-28XosraCTaYZKOyuZ80hrg), [Elixir Forum](https://elixirforum.com) and the [Fediverse](https://indieweb.social/@bonfire) or send us an email at team@bonfire.cafe.","ref":"readme.html#join-our-community"},{"type":"extras","title":"Copyright and License - Bonfire Networks","doc":"Copyright (c) 2020-2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"readme.html#copyright-and-license"},{"type":"extras","title":"Development setup","doc":"# Development setup\n\n> #### Info {: .info}\n>\n> These instructions are for hacking on Bonfire. If you wish to deploy in production, please refer to our deployment guide instead.\n\n\nHello, potential contributor! :-)\n\nThis is a work in progress guide to getting up and running as a developer. Please ask questions in the issue tracker if something is not clear and we'll try to improve it.\n\nHappy hacking!","ref":"hacking.html"},{"type":"extras","title":"Status: beta - have fun and provide feedback 🙏 - Development setup","doc":"Bonfire is currently beta software. While it's fun to play with it, we would not recommend running any production instances (meaning not using it for your primary fediverse identity) yet because it's not quite ready for that today.","ref":"hacking.html#status-beta-have-fun-and-provide-feedback"},{"type":"extras","title":"System Requirements - Development setup","doc":"- [Just](https://github.com/casey/just#packages): a handy tool (a `make` alternative) to run commands defined in `./justfile`.","ref":"hacking.html#system-requirements"},{"type":"extras","title":"Download - Development setup","doc":"Either way, you need to first clone this repository and change into the directory and then do some configuration:\n\n```sh\n$ git clone https://github.com/bonfire-networks/bonfire-app bonfire\n$ cd bonfire\n```","ref":"hacking.html#download"},{"type":"extras","title":"Configure - Development setup","doc":"","ref":"hacking.html#configure"},{"type":"extras","title":"Pick a flavour - Development setup","doc":"Bonfire is a flexible platform that powers a variety of social networks. The first thing you have to choose is which app (or \"flavour\") you want to hack on:\n\n- `classic` (\"Bonfire Social\", a basic social network that interoperates with the fediverse)\n- `community` (for topics and groups)\n- `open-science` (for next-gen scientific communities)\n- `coordination` (for coordinating around tasks and projects)\n- `cooperation` (for building cooperative economic networks)\n\nNote that at the current time, the core team are focusing most of their efforts on the `classic` flavour and this is where we **recommend** you start.\n\n\nSo for example if you want to run the `classic` flavour run:\n\n```sh\nexport FLAVOUR=classic\n``` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#pick-a-flavour"},{"type":"extras","title":"Choose your development environment - Development setup","doc":"You can choose to run bonfire in a variety of ways, from fully managed via docker-compose, to bare metal with local postgres and elixir, to a combination of the two, we also offer the possibility to run Bonfire with nix.\n\n","ref":"hacking.html#choose-your-development-environment"},{"type":"extras","title":"Easy - Development setup","doc":"The easy way consist in using bare-metal elixir, and docker-managed tooling, database & search index, recommended for active development.\n\n> #### Info {: .info}\n>\n> Note: the simplest way to handle dependencies is using a tool like [mise](https://mise.jdx.dev/) or asdf to setup the environment (simply run `mise install` in the root directory).\n\n#### Dependencies:\n - Recent versions of [Elixir](https://elixir-lang.org/install.html) (1.15+) and OTP/erlang (25+)\n - [yarn](https://yarnpkg.com)\n - Recent versions of Docker & [docker-compose](https://docs.docker.com/compose/install/)\n\n- Make sure you've set the env to indicate your choice\n\n```bash\nexport WITH_DOCKER=easy\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#easy"},{"type":"extras","title":"All containers - Development setup","doc":"Fully managed via docker-compose, recommended when you're first exploring and don't want to install Elixir.\n\n> NOTE: not recommended on MacOS, as it is significantly slower.\n\n#### Dependencies \n\n- Recent versions of Docker & [docker-compose](https://docs.docker.com/compose/install/)\n- Make sure you've set the environment variable to indicate your choice:\n\n```bash\nexport WITH_DOCKER=total\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n","ref":"hacking.html#partial"},{"type":"extras","title":"Bare-metal - Development setup","doc":"> #### Info {: .info}\n>\n> Note: you can use a tool like [mise](https://mise.jdx.dev/) or asdf to setup the environment (run `mise install` in the root directory). You will still need to install Postgres and Meili seperately though.\n\n- Dependencies:\n - Recent versions of [Elixir](https://elixir-lang.org/install.html) (1.15+) and OTP/erlang (25+)\n \n - [yarn](https://yarnpkg.com)\n - Postgres 12+ (or rather [Postgis](https://postgis.net/install/) if using the bonfire_geolocate extension)\n - [Meili Search](https://docs.meilisearch.com/learn/getting_started/installation.html) (optional)\n\n- If you want search capabilities, you'll also need to setup a Meili server and set the relevant env variables as well.\n\n- Make sure you've set the environment variable to indicate your choice\n\n```bash\nexport WITH_DOCKER=no\n```\n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)","ref":"hacking.html#bare-metal"},{"type":"extras","title":"Nix - Development setup","doc":"You can also choose to use nix to setup your development environment.\n\n#### Dependencies:\n\n- Run a recent version of Nix or NixOS: https://nixos.org/download.html\n- Enable Flakes: https://nixos.wiki/wiki/Flakes#Installing_flakes\n- Install [direnv](https://direnv.net/) through nix if you don't have the tool already: `nix profile install nixpkgs#direnv` and add it to your shell: https://direnv.net/docs/hook.html\n- Clone the bonfire-app repo if you haven't already and allow direnv to use environment variables:\n ```bash\n git clone https://github.com/bonfire-networks/bonfire-app\n cd `bonfire-app`\n direnv allow\n ```\n\nThe tool direnv is necessary for the nix setup as the nix shell environment will use variables defined on `.envrc` to set itself up.\n\nNote: when you run `direnv allow` on the bonfire-app directory for the first time, nix will automatically fetch the dependencies for bonfire. The process will take a while as it's downloading everything needed to use the development environment. Afterwards you will be able to use just fine. Proceeding times you enter the directory, the shell with automatically set up for your use without downloading the packages again.\n\nYou will need to update the db directory which is automatically created by nix the first time you initialized the shell with `direnv allow`. You can do so with the following steps:\n- Update `props.nix` to the settings you want.\n- Run `just nix-db-init` to create the database and user for postgres defined on `props.nix`.\n- Modify the `.env` file to comment out all `POSTGRES_*` variables. These are populated automatically by nix. So if the variables are set here, you may get issues with overriding your settings in `props.nix` when using bonfire.\n- You can now proceed to Hello World!\n\nNote: if you ever want to shut off the postgres server in nix, simply run the nix-db targets in just:\n\n```\n# stop postgres server running locally\njust nix-db stop\n# start postgres server running locally\njust nix-db start\n```\n\n","ref":"hacking.html#nix"},{"type":"extras","title":"Configure - Development setup","doc":"Run `just config` to initialise the needed config.\n\n```sh\njust config\n```\n\nThen you can edit the config for the current flavour in `./.env`\n\n> For example, you can set `TEST_LOG_LEVEL=debug` in your `.env` to show full debug logs when running unit tests.\n\nThe only required config to startup bonfire are the secrets for sessions/cookies (`SECRET_KEY_BASE`, `SIGNING_SALT`, `ENCRYPTION_SALT`), you can generate strings for these by running:\n\n```sh\njust secrets\n```","ref":"hacking.html#configure"},{"type":"extras","title":"Light a fire! - Development setup","doc":"From a fresh checkout of this repository, this command will fetch the app's dependencies and setup the database (the same commands apply for all three options above):\n\n```\njust setup-dev\n```\n\nThis command will take a while to complete. Soon we will streamiline the setup process to be more lightway, bear with us for the moment.\n\nYou should now be able to run the app with:\n\n```\njust dev\n```\n\nRead more about the available `just` commands in the [`just` commands](./topics/JUST.md) page.","ref":"hacking.html#light-a-fire"},{"type":"extras","title":"Onboarding - Development setup","doc":"","ref":"hacking.html#onboarding"},{"type":"extras","title":"Getting Started - Development setup","doc":"The back-end server runs on port 4000 (TCP) by default. Access it by navigating to http://localhost:4000/ in your web browser.","ref":"hacking.html#getting-started"},{"type":"extras","title":"Creating an account - Development setup","doc":"To create an account, go to http://localhost:4000/signup and enter your email address and password.\nWhen running the server locally and signing up for the first time, you won't need a confirmation email. However, for any future signups know you can find the confirmation link in the server logs.\n\n> You can also sign up via CLI by entering something like this in your app's Elixir console: `Bonfire.Me.make_account_only(\"my@email.net\", \"my pw\")`","ref":"hacking.html#creating-an-account"},{"type":"extras","title":"Admin permissions - Development setup","doc":"The first user registered on the platform is automatically granted Admin permissions.","ref":"hacking.html#admin-permissions"},{"type":"extras","title":"Successful onboarding - Development setup","doc":"After successfully creating and confirming your account, you should see an empty dashboard.\n\nThat's it! You have now successfully onboarded and can start using the application.","ref":"hacking.html#successful-onboarding"},{"type":"extras","title":"The Bonfire environment - Development setup","doc":"We like to think of bonfire as a comfortable way of developing software - there are a lot of conveniences built in once you know how they all work. The gotcha is that while you don't know them, it can be a bit overwhelming. Don't worry, we've got your back.\n\n- [Architecture](./topics/ARCHITECTURE.md) - an overview of the stack and code structure.\n- [Bonfire-flavoured Elixir](./topics/BONFIRE-FLAVOURED-ELIXIR.md) - an introduction to the way we write Elixir.\n- [Bonfire's Database: an Introduction](./topics/DATABASE.md) - an overview of how our database is designed.\n- [Boundaries](./topics/BOUNDARIES.md) - an introduction to our access control system.\n\nNote: these are still at the early draft stage, we expect to gradually improve documentation over time.","ref":"hacking.html#the-bonfire-environment"},{"type":"extras","title":"Documentation - Development setup","doc":"The code is somewhat documented inline. You can generate HTML docs (using `Exdoc`) by running `just docs`.","ref":"hacking.html#documentation"},{"type":"extras","title":"Additional information - Development setup","doc":"\n\n- `./extensions/` is used to hack on local copies of Bonfire extensions. You can clone an extension from its git repo and use the local version during development, eg: `just dep-clone-local bonfire_me https://github.com/bonfire-networks/bonfire_me`\n\n- `./forks/` is used to hack on local copies of any other dependencies.\n\n- You can migrate the DB when the app is running (also runs automatically on startup): `Bonfire.Common.Repo.migrate`\n\n- You can generate a dependency graph using `just xref-graph` which will generate a DOT file at `docs/` (if Graphviz is installed it will also generate an SVG visualisation using `dot`).","ref":"hacking.html#additional-information"},{"type":"extras","title":"Usage under Windows (WSL, MSYS or CYGWIN) - Development setup","doc":"By default, the `justfile` requires symlinks, which can be enabled with the help of [this link](https://stackoverflow.com/a/59761201).\n\nSee the [pull request adding WSL support](https://github.com/bonfire-networks/bonfire-app/pull/111) for details about usage without symlinks.","ref":"hacking.html#usage-under-windows-wsl-msys-or-cygwin"},{"type":"extras","title":"Troubleshooting - Development setup","doc":"","ref":"hacking.html#troubleshooting"},{"type":"extras","title":"EACCES Permissions Error - Development setup","doc":"If you get a permissions error when following any of the steps, run the following command and it should be fixed:\n\n```shell\ncd bonfire && sudo chown -R yourusername:yourusername .\n```\n\nNote that the command should be modified so your shell is pointing to wherever you have bonfire installed. If you are already in the bonfire directory then you only need to worry about running the `chown` portion of the command.","ref":"hacking.html#eacces-permissions-error"},{"type":"extras","title":"Unable to access Postgres database - Development setup","doc":"If you are getting any `:nxdomain` errors, check if you have any firewalls that may be blocking the port on your system.\n\nFor example, if you are running UFW (a lot of Linux distros do), run the following command to allow access to port 4000:\n\n```shell\nsudo ufw allow 4000\n```\n\n### (Mix) Package fetch failed\n\nExample:\n\n```\n** (Mix) Package fetch failed and no cached copy available (https://repo.hex.pm/tarballs/distillery-2.0.12.tar)\n```\n\nIn this case, distillery (as an example of a dependency) made a new release and retired the old release from hex. The new version (`2.0.14`) is quite close to the version we were depending on (`2.0.12`), so we chose to upgrade:\n\n```shell\nmix deps.update distillery\n```\n\nThis respects the version bounds in `mix.exs` (`~> 2.0`), so increment that if required.\n\n### `(DBConnection.ConnectionError) tcp recv: closed`\n\nExample:\n\n```\n** (DBConnection.ConnectionError) tcp recv: closed (the connection was closed by the pool, possibly due to a timeout or because the pool has been terminated)\n```\n\nIn this case, the seeds were unable to complete because a query took too long to execute on your machine. You can configure the timeout to be larger in the `dev` environment:\n\n1. Open `config/dev.exs` in your editor.\n2. Find the database configuration (search for `Bonfire.Common.Repo`).\n3. Add `timeout: 60_000` to the list of options:\n\n```\nconfig :bonfire, Bonfire.Common.Repo,\n timeout: 60_000,\n [...]\n```","ref":"hacking.html#unable-to-access-postgres-database"},{"type":"extras","title":"Compilation errors like `(ArgumentError) could not load module Needle.ULID due to reason :unavailable` or `(ArgumentError) could not load module Poison.Encoder due to reason :unavailable` - Development setup","doc":"This seems to be an issue with the order of compilation, you can usually work around it by cleaning the deps it complains about, eg: `just deps-clean needle_ulid` or `just deps-clean poison` or `just deps-clean jason`","ref":"hacking.html#compilation-errors-like-argumenterror-could-not-load-module-needle-ulid-due-to-reason-unavailable-or-argumenterror-could-not-load-module-poison-encoder-due-to-reason-unavailable"},{"type":"extras","title":"Hosting guide","doc":"# Hosting guide\n\nA short guide to running Bonfire in a production environment and setting up a digital space connected to the fediverse.\n\n> #### Warning {: .warning}\n>\n> Bonfire is currently beta software. While it's fun to play with it, we would not recommend running any production instances yet (meaning not using it for your primary fediverse identity) because it's not quite ready for that today. \n\n\n_These instructions are for setting up Bonfire in production. If you want to run the backend in development, please refer to our [Installation guide](./hacking) instead._","ref":"deploy.html"},{"type":"extras","title":"Security Warning - Hosting guide","doc":"We recommend only granting an account to people you trust to minimise the attack surface. Accordingly, Bonfire ships with public registration disabled. The admin panel has an `invite` facility. \n\n---","ref":"deploy.html#security-warning"},{"type":"extras","title":"Step 1 - Decide how you want to deploy and manage the app - Hosting guide","doc":"","ref":"deploy.html#step-1-decide-how-you-want-to-deploy-and-manage-the-app"},{"type":"extras","title":"Co-op Cloud - Hosting guide","doc":"Install using [Co-op Cloud](https://coopcloud.tech) (recommended) which is an alternative to corporate cloud services built by tech co-ops, and provides handy tools for setting up and managing many self-hosted free software tools using ready-to-use \"recipes\". Very useful if you'd like to host Bonfire alongside other open and/or federated projects. \n\n1. Install [Abra](https://docs.coopcloud.tech/abra/) on your machine\n2. [Set up a server with co-op cloud](https://docs.coopcloud.tech/operators/) \n3. Use the [Bonfire recipe](https://recipes.coopcloud.tech/bonfire) and follow the instructions there, including editing the config in the env file at `~/.abra/servers/your_server/your_app.env` (see [prepare the config](#preparing-the-config-in-env) for details about what to edit)\n4. Run the abra deploy command and [done!](#running-the-app)","ref":"deploy.html#co-op-cloud"},{"type":"extras","title":"Docker containers - Hosting guide","doc":"1. Install dependencies. \n\nThe easiest way to manage the docker image is using just commands.\n\nThe `docker-compose.release.yml` uses `config/prod/.env` to launch a container with the necessary environment variables along with its dependencies, currently that means an extra postgres container, along with a reverse proxy (Caddy server, which you may want to replace with nginx or whatever you prefer).\n\nMake sure you have [Docker](https://www.docker.com/), with the [compose](https://docs.docker.com/compose/install/#install-compose) plugin, and [just](https://github.com/casey/just#packages) installed:\n\n```sh\n$ docker version\nDocker Engine - Community - 23.0.1\n\n$ docker compose version\nDocker Compose version v2.16.0\n\n$ just --version\njust 1.13.0\n...\n```\n\n2. Clone this repository and change into the directory:\n\n```sh\ngit clone --depth 1 https://github.com/bonfire-networks/bonfire-app.git bonfire && cd bonfire\n```\n\n3. Specify what flavour you want to run in production:\n\nThe first thing to do is choose what flavour of Bonfire (eg. classic, community, or cooperation) you want to deploy, as each flavour uses different Docker images and set of configs. For example if you want to run the `classic` flavour:\n\n- `export MIX_ENV=prod FLAVOUR=classic WITH_DOCKER=yes` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n4. Run `just config` to initialise some default config and then edit the config in the `./.env` file (see [prepare the config](#preparing-the-config-in-env) for details about what to edit).\n\n> Now that your tooling is set up, you have the choice of using pre-built images or building your own. For example if your flavour does not have a prebuilt image on Docker Hub, or if you want to customise any of the extensions, you can build one yourself. \n\n\n#### Using pre-built Docker images (easy mode)\n\n- The `image` entry in `docker-compose.release.yml` will by default use the image on Docker Hub which corresponds to your chosen flavour (see step 1 above for choosing your flavour).\n\nYou can see the images available per flavour, version (we currently recommend using the `latest` tag), and architecture at https://hub.docker.com/r/bonfirenetworks/bonfire/tags \n\n5. Try [running the app](#running-with-docker)!\n\n\n#### Custom Docker build\n\nBuilding your own Docker image is useful if you want to make code changes or add your own extensions.\n\n`Dockerfile.release` uses the [multistage build](https://docs.docker.com/develop/develop-images/multistage-build/) feature to just the image as small as possible. It generates the OTP release which is later copied into the final image packaged in an Alpine linux container.\n\nThere is a `justfile` with relevant commands (make sure set the `MIX_ENV=prod` env variable):\n\n- `just rel-build-locked` which builds the docker image of the latest release\n- `just rel-build` which builds the docker image, including local changes to any cloned extensions in `./extensions/` \n- `just rel-tag` adds the \"latest\" tag to your last build, so that it will be used when running\n\nOnce you've built and tagged your image, you may need to update the `image` name in `docker-compose.release.release.yml` to match (either your local image name if running on the same machine you used for the build, or a remote image on Docker Hub if you pushed it) and then follow the same steps as for option A1.\n\nFor production, we recommend to set up a CI workflow to automate this, for an example you can look at the one [we currently use](../github/workflows/release.yaml).\n\nFinally, try [running the app](#running-with-docker)!\n\n\n#### Running with Docker\n\n- Start the docker containers with docker-compose:\n\n```\njust rel-run\n```\n\nRun this at the prompt: \n\n`bin/bonfire remote` to enter Elixir's iex environment\n`Bonfire.Common.Repo.migrate` to initialise your database\n\nThe backend should now be running at [http://localhost:4000/](http://localhost:4000/). [Yay, you're up and running!](#running-the-app)\n\n- If that worked, start the app as a daemon next time:\n\n```\njust rel-run-bg\n```\n\n(Alternatively, `just rel-run-bg db` if you want to run the backend + db but not the web proxy, or `just rel-run-bg db search` if you want to run the full-text search index.)","ref":"deploy.html#docker-containers"},{"type":"extras","title":"Bare-metal - Hosting guide","doc":"Running a custom build without Docker.\n\n1. Install dependencies. \n\n- Postgres (or Postgis) version 12 or newer\n- [just](https://github.com/casey/just#packages)\n- Elixir version 1.15+ with OTP 25+ (see the `Dockerfile` to double check the versions we're currently using). If your distribution only has an old version available, check [Elixir's install page](https://elixir-lang.org/install.html) or use a tool like [mise](https://github.com/jdx/mise) (run `mise install` in this directory) or asdf.\n\n2. Clone this repository and change into the directory:\n\n```sh\ngit clone --depth 1 https://github.com/bonfire-networks/bonfire-app.git bonfire && cd bonfire\n```\n\n3. Specify what flavour you want to run in production:\n\nThe first thing to do is choose what flavour of Bonfire (eg. classic, community, or cooperation) you want to deploy, as each flavour uses different Docker images and set of configs. For example if you want to run the `classic` flavour:\n\n- `export FLAVOUR=classic MIX_ENV=prod WITH_DOCKER=no` \n\nYou may also want to put this in the appropriate place in your system so your choice of flavour is remembered for next time (eg. `~/.bashrc` or `~/.zshrc`)\n\n4. Run `just config` to initialise some default config and then edit the config in the `./.env` file (see [prepare the config](#preparing-the-config-in-env) for details about what to edit).\n \n5. Run `just rel-build` to create an elixir release. This will create an executable in your `_build/prod/rel/bonfire` directory. Note that you will need `just` to pass in the `.env` file to the executable, like so: `just cmd _build/prod/rel/bonfire/bin/bonfire `. Alternatively, this file can be sourced by `source .env` instead. We will be using the `bin/bonfire` executable as called from `just` from here on. \n\n6. Running the release\n\n- Create a database, and a user, fill out the `.env` with your credentials and secrets\n\n- You will need to use `just` in order to pass the `.env` file to the executable. This can be accomplished by running `just cmd _build/prod/rel/bonfire/bin/bonfire `. Just works from the root directory of the `justfile`, not your current directory.\n\n- If you’re using RDS or some other locked down DB, you may need to run `CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;` on your database with elevated privileges.\n\n- You can check if your instance is configured correctly and get to the iex console by running `bin/bonfire start`\n\n- The migrations should automatically run on first boot, but if you run into troubles the migration command is: `Bonfire.Common.Repo.migrate()` in the iex console. \n\n- To run the instance as a daemon, use `bin/bonfire start daemon`. [Yay, you're up and running!](#running-the-app)\n\n7. Adding HTTPS\n\nThe common and convenient way for adding HTTPS is by using a reverse proxy like Nginx or Caddyserver (the latter of which is bundled as part of the docker compose setup).\n\nCaddyserver and other servers can handle generating and setting up HTTPS certificates automatically, but if you need TLS/SSL certificates for nginx, you can look get some for free with [letsencrypt](https://letsencrypt.org/). The simplest way to obtain and install a certificate is to use [Certbot.](https://certbot.eff.org). Depending on your specific setup, certbot may be able to get a certificate and configure your web server automatically.\n\nIf you've built from source, you should point the nginx root directory to be `_build/prod/rel/bonfire/lib/bonfire-[current-version]/priv/static`","ref":"deploy.html#bare-metal"},{"type":"extras","title":"Nix - Hosting guide","doc":"This repo contains an experimental Flake and Nix module. These are not ready for production.\n\nHere are the detailed steps to deploy it:\n\n- run a recent version of Nix or NixOS: https://nixos.wiki\n- enable Flakes: https://nixos.wiki/wiki/Flakes#Installing_flakes\n- add `sandbox = false` in your nix.conf\n- fetch and build the app and dependencies: `nix run github:bonfire-networks/bonfire-app start_iex`\n- add it as an input to your system flake.\n- add an overlay to just the package available\n- add the required configuration in your system\n\nYour `flake.nix` file would look like the following. Remember to replace `myHostName` with your actual hostname or however your deployed system is called.\n\n```nix\n{\n inputs.bonfire.url = \"github:bonfire-networks/bonfire-app/main\";\n outputs = { self, nixpkgs, bonfire }: {\n overlay = final: prev: with final;{\n # a package named bonfire already exists on nixpkgs so we put it under a different name\n elixirBonfire = bonfire.packages.x86_64-linux.default;\n };\n nixosConfigurations.myHostName = nixpkgs.lib.nixosSystem {\n system = \"x86_64-linux\";\n modules = [\n {\n environment.systemPackages = [ agenix.defaultPackage.x86_64-linux ];\n nixpkgs.overlays = [ self.overlay ];\n }\n ./myHostName.nix\n bonfire.nixosModules.bonfire\n ];\n };\n };\n}\n```\n\nThen your `myHostName.nix` would look like the following:\n\n```nix\n{ config, lib, pkgs, ... }:\n\n{\n services.bonfire = {\n # you will additionally need to expose bonfire with a reverse proxy, for example caddy\n port = 4000;\n package = pkgs.elixirBonfire;\n dbName = \"bonfire\";\n # the environment should contain a minimum of\n # SECRET_KEY_BASE\n # SIGNING_SALT\n # ENCRYPTION_SALT\n # RELEASE_COOKIE\n # have a look into nix/module.nix for more details\n # the way to deploy secrets is beyond this readme, but I would recommend agenix\n environmentFile = \"/run/secrets/bonfireEnv\";\n dbSocketDir = \"/var/run/postgresql\";\n };\n\t\n\t# this is specifically for a reverse proxy, which is primarily used for SSL certs\n\tservices.ngnix = {\n\t\tenable = true;\n\t\tforceSSL = true;\n\t\tenableACME = true;\n\t\tvirtualHosts.\"myHostName\".locations.proxyPass = \"http://localhost:4000\";\n\t};\n\t\n\t# You will need to accept ACME's terms and conditions if you haven't elsewhere in your configuration\n\tsecurity.acme.defaults.email = \"you@myHostName.com\";\n\tsecurity.acme.acceptTerms = true;\n\n # this is uniquely for database backup purposes\n # replace myBackupUserName with the user name that will do the backups\n # if you want to do backups differently, feel free to remove this part of the config\n services.postgresql = {\n ensureDatabases = [ \"bonfire\" ];\n ensureUsers = [{\n name = \"myBackupUserName\";\n ensurePermissions = { \"DATABASE bonfire\" = \"ALL PRIVILEGES\"; };\n }];\n };\n}\n```\n\n\n\n\n\n## Preparing the config (in .env)","ref":"deploy.html#nix"},{"type":"extras","title":"Config keys you should pay special attention to: - Hosting guide","doc":"The app needs these environment variables to be configured in order to work.\n\n- `FLAVOUR` should reflect your chosen flavour\n- `HOSTNAME` (your domain name, eg: `bonfire.example.com`)\n- `PUBLIC_PORT` (usually 443)\n- `MAIL_DOMAIN` and `MAIL_KEY` and related keys to configure transactional email, for example set `MAIL_BACKEND=mailgun` and sign up at [Mailgun](https://www.mailgun.com/) and then configure the domain name and key (you may also need to set `MAIL_BASE_URI` if your domain is not setup in EU, as the default `MAIL_BASE_URI` is set as `https://api.eu.mailgun.net/v3`). \n- SMTP is supported as well, through the following env vars \n```\nMAIL_SERVER (smtp domain of the mail server)\nMAIL_DOMAIN (the bit after the @ in your email)\nMAIL_USER\nMAIL_PASSWORD\nMAIL_FROM\nMAIL_PORT (optional)\nMAIL_SSL (optional)\n```\n- `UPLOADS_S3_BUCKET` and the related API key and secret for uploads. WARNING: If you want to store uploads in an object storage rather than directly on your server (which you probably want, to not run out of space), you need to configure that up front, otherwise URLs will break if you change it later. See `config/runtime.exs` for extra variables to set if you're not using the default service and region (which is [Scaleway](https://www.scaleway.com/en/object-storage/) Paris).","ref":"deploy.html#config-keys-you-should-pay-special-attention-to"},{"type":"extras","title":"Secret keys for which you should put random secrets. - Hosting guide","doc":"You can run `just secrets` to generate some for you.\n\n- `SECRET_KEY_BASE`\n- `SIGNING_SALT`\n- `ENCRYPTION_SALT`\n- `POSTGRES_PASSWORD`\n- `MEILI_MASTER_KEY`","ref":"deploy.html#secret-keys-for-which-you-should-put-random-secrets"},{"type":"extras","title":"Further information on config - Hosting guide","doc":"In the `./config/` (which is a symbolic link to the config of the flavour you choose to run) directory of the codebase, there are following config files:\n\n- `config.exs`: default base configuration, which itself loads many other config files, such as one for each installed Bonfire extension.\n- `prod.exs`: default extra configuration for `MIX_ENV=prod`\n- `runtime.exs`: extra configuration which is loaded at runtime (vs the others which are only loaded once at compile time, i.e. when you build a release)\n- `bonfire_*.exs`: configs specific to different extensions, which are automatically imported by `config.exs`\n\nYou should *not* have to modify the files above. Instead, overload any settings from the above files using env variables or in `./.env`. If any settings in the `.exs` config files are not available in env or in the instance settings UI, please open an issue or PR.","ref":"deploy.html#further-information-on-config"},{"type":"extras","title":"Running the app - Hosting guide","doc":"> NOTE: If you are running in a restricted environment such as Amazon RDS, you will need to execute some sql against the database before migrations can run: `CREATE EXTENSION IF NOT EXISTS citext;`\n\nBy default, the backend listens on port 4000 (TCP), so you can access it on http://localhost:4000/ (if you are on the same machine). In case of an error it will restart automatically.\n\nOnce you've signed up, you will automatically be an instance admin if you were the first to register.\n\n> You can sign up via CLI by entering something like this in your app's Elixir console: `Bonfire.Me.make_account_only(\"my@email.net\", \"my pw\")`","ref":"deploy.html#running-the-app"},{"type":"extras","title":"Handy commands - Hosting guide","doc":"- `just update` to update to the latest release of Bonfire \n- `just rel-run` Run the app in Docker, in the foreground\n- `just rel-run-bg` Run the app in Docker, and keep running in the background\n- `just rel-stop` Stop the running release\n- `just rel-shell` Runs a simple shell inside of the container, useful to explore the image \n\nOnce in the shell, you can run `bin/bonfire` with the following commands:\nUsage: `bonfire COMMAND [ARGS]`\n\nThe known commands are:\n- `start` Starts the system\n- `start_iex` Starts the system with IEx attached\n- `daemon` Starts the system as a daemon\n- `daemon_iex` Starts the system as a daemon with IEx attached\n- `eval \"EXPR\"` Executes the given expression on a new, non-booted system\n- `rpc \"EXPR\"` Executes the given expression remotely on the running system\n- `remote` Connects to the running system via a IEx remote shell\n- `restart` Restarts the running system via a remote command\n- `stop` Stops the running system via a remote command\n- `pid` Prints the operating system PID of the running system via a remote command\n- `version` Prints the release name and version to be booted\n\nThere are some useful database-related release tasks under `EctoSparkles.Migrator.` that can be run in an `iex` console (which you get to with `just rel.shell` followed by `bin/bonfire remote`, assuming the app is already running):\n\n- `migrate` runs all up migrations\n- `rollback(step)` roll back to step X\n- `rollback_to(version)` roll back to a specific version\n- `rollback_all` rolls back all migrations back to zero (caution: this means losing all data)\n\nYou can also directly call some functions in the code from the command line, for example:\n- to migrate: `docker exec bonfire_web bin/bonfire rpc 'Bonfire.Common.Repo.migrate'`\n- to just yourself an admin: `docker exec bonfire_web bin/bonfire rpc 'Bonfire.Me.Users.make_admin(\"my_username\")'`","ref":"deploy.html#handy-commands"},{"type":"extras","title":"Admin tools - Hosting guide","doc":"- LiveDashboard for viewing real-time metrics and logs at `/admin/system/`\n- Oban logs for viewing queued jobs (e.g. for processing federated activities) `/admin/system/oban_queues`\n- LiveAdmin for browsing data in the database at `/admin/system/data`\n- Orion for dynamic distributed performance profiling at `/admin/system/orion`\n- Web Observer as an alternative way to view metrics at `/admin/system/wobserver`","ref":"deploy.html#admin-tools"},{"type":"extras","title":"Troubleshooting - Hosting guide","doc":"Some common issues that may arise during deployment and our suggestions for resolving them.\n\n#### WebSocket connections not establishing behind a reverse proxy\n\nIf you are running Bonfire behind your own reverse proxy (e.g. nginx), you might experience issues with WebSocket connections not establishing. WebSocket connections require specific configuration to work, in nginx the following configuration is necessary for websockets to work:\n\n```\nlocation /live/websocket {\n proxy_pass http://127.0.0.1:4000;\n \n # these configurations are necessary to proxy WebSocket requests\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n}\n```","ref":"deploy.html#troubleshooting"},{"type":"extras","title":"Bonfire Changelog","doc":"# Bonfire Changelog\n\n## [0.3.5-beta (2022-09-23)]","ref":"changelog.html"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Coordination MVP [#445](https://github.com/bonfire-networks/bonfire-app/issues/445) by mayel & ivanminutillo\n- UI to enable/disable extensions in settings [#448](https://github.com/bonfire-networks/bonfire-app/issues/448) \n- Static page generator [#444](https://github.com/bonfire-networks/bonfire-app/issues/444) \n- Publish creation of sub-topic in the topic's feed [#439](https://github.com/bonfire-networks/bonfire-app/issues/439) by mayel","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Refactor navs/sidebars to use dynamic navigation & widgets provided by extensions [#447](https://github.com/bonfire-networks/bonfire-app/issues/447)","ref":"changelog.html#changed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- When I reply to a task, the activity in the feed does not show the parent activity [#449](https://github.com/bonfire-networks/bonfire-app/issues/449) \n- Use same composer for create post / topic / create a new list / create task\n\n## [0.3.4-beta.8 (2022-08-26)]","ref":"changelog.html#other"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Remember position in timeline [#392](https://github.com/bonfire-networks/bonfire-app/issues/392) by mayel\n- Should be able to click on a notification to see the related activity [#412](https://github.com/bonfire-networks/bonfire-app/issues/412) by mayel\n- Actions when someone clicks on follow/boost/like/reply buttons on a profile or feed while logged out [#441](https://github.com/bonfire-networks/bonfire-app/issues/441) \n- Combine duplicate posts [#396](https://github.com/bonfire-networks/bonfire-app/issues/396) by mayel","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- User preferences missing a consistent UX structure [#430](https://github.com/bonfire-networks/bonfire-app/issues/430) \n- Bug: pop-ups from compose box are hidden if close to edge [#394](https://github.com/bonfire-networks/bonfire-app/issues/394) \n- reset the CW field after posting [#378](https://github.com/bonfire-networks/bonfire-app/issues/378) \n- On mobile, there should be an obvious way to reply to a single post when viewing it by itself [#371](https://github.com/bonfire-networks/bonfire-app/issues/371) \n- Alerts and feedback messages need to adopt a solid pattern [#305](https://github.com/bonfire-networks/bonfire-app/issues/305)","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- i can't see what i'm typing past a certain amount of text. Like rivht now i dont' see what i'm typing. Might be some typos then^^ [#425](https://github.com/bonfire-networks/bonfire-app/issues/425) \n- Bug: When you switch user it *sometimes* stays on the switch user page [#377](https://github.com/bonfire-networks/bonfire-app/issues/377) by mayel","ref":"changelog.html#fixed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- Make push notification system more solid [#180](https://github.com/bonfire-networks/bonfire-app/issues/180) \n- Test/fix/improve graceful degradation (usage without JS, or without a LiveView websocket, i.e. when logged out) [#365](https://github.com/bonfire-networks/bonfire-app/issues/365) by mayel\n- use @prop in Surface views/components instead of e(assigns, :prop, default) and declare defaults in props or mount/1 [#414](https://github.com/bonfire-networks/bonfire-app/issues/414) \n\n\n## [0.3.4-beta.6 (2022-08-19)]","ref":"changelog.html#other"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- 3 options for smart input (sidebar, modal, floating) and improve responsive (modal on small screens) [#443](https://github.com/bonfire-networks/bonfire-app/issues/443) \n- Improve feeds async loading [#437](https://github.com/bonfire-networks/bonfire-app/issues/437) by mayel\n- Improve media/link attachments [#440](https://github.com/bonfire-networks/bonfire-app/issues/440)","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- Show and count only local users in user directory [#438](https://github.com/bonfire-networks/bonfire-app/issues/438) by mayel\n\n## [0.3.4 (2022-08-09)]","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Define & implement granular role & permission system for instance administration and moderation [#406](https://github.com/bonfire-networks/bonfire-app/issues/406) \n\n## [0.3.3 (2022-08-02)]","ref":"changelog.html#added"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Define & implement granular role & permission system for instance administration and moderation [#406](https://github.com/bonfire-networks/bonfire-app/issues/406) \n\n## [0.3.2 (2022-07-30)]","ref":"changelog.html#added"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Pagination topics list & feeds within topics [#431](https://github.com/bonfire-networks/bonfire-app/issues/431) \n- Check boundaries of a topic when tagging and if allowed auto-boost the tagged object in the topic's outbox [#428](https://github.com/bonfire-networks/bonfire-app/issues/428) \n- Show followed topics on a list [#424](https://github.com/bonfire-networks/bonfire-app/issues/424) \n- Topic settings [#423](https://github.com/bonfire-networks/bonfire-app/issues/423) \n- Topic activity preview [#422](https://github.com/bonfire-networks/bonfire-app/issues/422) \n- Browse topics [#421](https://github.com/bonfire-networks/bonfire-app/issues/421) \n- Tag something (eg. post/user) with a topic at any time (depending on boundaries) [#416](https://github.com/bonfire-networks/bonfire-app/issues/416) \n- Tag a post with a topic when writing a new post (or reply) [#415](https://github.com/bonfire-networks/bonfire-app/issues/415) \n- CRUD topics [#410](https://github.com/bonfire-networks/bonfire-app/issues/410) \n- Create a users directory [#159](https://github.com/bonfire-networks/bonfire-app/issues/159)","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Optimise LiveView rendering [#426](https://github.com/bonfire-networks/bonfire-app/issues/426) \n- Allow us to scroll from anywhere [#391](https://github.com/bonfire-networks/bonfire-app/issues/391)","ref":"changelog.html#changed"},{"type":"extras","title":"Other - Bonfire Changelog","doc":"- Add unique key to encircle [#248](https://github.com/bonfire-networks/bonfire-app/issues/248) \n- Database Question [#3](https://github.com/bonfire-networks/activity_pub/issues/3) \n- Being able to change activity type from the composer [#429](https://github.com/bonfire-networks/bonfire-app/issues/429) \n- use created and extra_info mixins on Category [#433](https://github.com/bonfire-networks/bonfire-app/issues/433) \n- check boundaries for edit and archive topic [#434](https://github.com/bonfire-networks/bonfire-app/issues/434)","ref":"changelog.html#other"},{"type":"extras","title":"0.3.1-beta.9 (2022-07-22) - Bonfire Changelog","doc":"","ref":"changelog.html#0-3-1-beta-9-2022-07-22"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- BUG:Responsive, navigation goes under the mobile bottom tab [#420](https://github.com/bonfire-networks/bonfire-app/issues/420) by ivanminutillo","ref":"changelog.html#fixed"},{"type":"extras","title":"0.3.1-beta (2022-07-19) - Bonfire Changelog","doc":"","ref":"changelog.html#0-3-1-beta-2022-07-19"},{"type":"extras","title":"Added - Bonfire Changelog","doc":"- Circles & flexible boundaries [#223](https://github.com/bonfire-networks/bonfire-app/issues/223) by mayel & ivanminutillo\n- Compose box at the bottom of the screen as an alternative to the standard microblogging input box [#419](https://github.com/bonfire-networks/bonfire-app/issues/419) \n- \"Compact layout\" in user preferences [#418](https://github.com/bonfire-networks/bonfire-app/issues/418) \n- Fetch metadata of links included in a post and show previews (of images, videos, etc) in feeds [#314](https://github.com/bonfire-networks/bonfire-app/issues/314)","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Bonfire Changelog","doc":"- Pasting images into the editor should upload them [#411](https://github.com/bonfire-networks/bonfire-app/issues/411) \n- Bug: When starting from the feed page, clicking back would exit the site [#400](https://github.com/bonfire-networks/bonfire-app/issues/400) \n- /write page was missing the boundary selector [#398](https://github.com/bonfire-networks/bonfire-app/issues/398) \n- Keep me logged in [#395](https://github.com/bonfire-networks/bonfire-app/issues/395) \n- Font size is too small in compose window [#388](https://github.com/bonfire-networks/bonfire-app/issues/388) \n- UI: moved topbar in the header to sidebar [#362](https://github.com/bonfire-networks/bonfire-app/issues/362) \n- Improved responsive UI for use on small screens","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Bonfire Changelog","doc":"- Bug: some notifications / live feed updates were making all other activities in the feed disappear [#383](https://github.com/bonfire-networks/bonfire-app/issues/383) by mayel\n- Bug: followed/followers pages remained empty despite having followed people [#373](https://github.com/bonfire-networks/bonfire-app/issues/373) by mayel\n- Bug: followed activity missing the person (in main feeds) [#372](https://github.com/bonfire-networks/bonfire-app/issues/372) by mayel\n- Bug: follow notification clears the home feed except for the \"new follow\" post [#366](https://github.com/bonfire-networks/bonfire-app/issues/366) by mayel\n- Bug: images attached to a post should appear in the feed [#364](https://github.com/bonfire-networks/bonfire-app/issues/364)","ref":"changelog.html#fixed"},{"type":"extras","title":"Add a new widget","doc":"# Add a new widget\n\nWidgets are reusable components that encapsulate data and provide context-specific information to users based on the pages they are currently visiting. They are typically placed in the right sidebar ( refers to the [Design Guidelines](../topics/DESIGN.md) section to learn more about Bonfire user experience), and developers can define which widgets should appear on each page and in what order. \n\nDevelopers can include options for users to enable, disable, or rearrange the order of widgets when possible.\n\nA widget usually consists of a title and data formatted in various ways, such as links, data visualizations, actions, or information fetched from third-party apps. In this section, we will create a new widget that utilizes the user's location (if provided) and the [bonfire_geolocate](https://github.com/bonfire-networks/bonfire_geolocate) library to obtain the correct coordinates. These coordinates will then be used to retrieve the location's weather information using an external library. Additionally, we will create a setting that allows users to optionally include the widget on their profile.\n\nThis example is simple yet meaningful because it touches upon different parts of the Bonfire framework during the tutorial. The code for this widget is available [here](https://github.com/bonfire-networks/bonfire_geolocate/tree/main/lib/web/components/widgets).\n\n![weather widget](https://i.imgur.com/S6OaPGg.png)","ref":"add-a-new-widget.html"},{"type":"extras","title":"Let’s code! - Add a new widget","doc":"The first step is to identify the most appropriate extension for this widget. In this case, we can include the widget in the `bonfire_geolocate` extension, which already handles all the necessary logic for dealing with geolocations.\n\nWidgets are typically included in `lib/web/components/widgets`. Bonfire uses Surface on the frontend, so we'll create two files:\n\n- `widget_forecast_live.ex`\n- `widget_forecast_live.sface`\n\nThis forecast widget is a stateless component, meaning it won't handle any internal state. Therefore, the `widget_forecast_live.ex` code will be quite basic:\n\n```elixir\ndefmodule Bonfire.Geolocate.WidgetForecastLive do\n use Bonfire.UI.Common.Web, :stateless_component\n\n prop location, :string, default: nil\nend\n\n```\n\nWe use `:stateless_component`, a [function](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/web.ex#L543) that wraps the `Surface.Component` and includes a list of [helpers](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/web.ex#L575) widely used across most components.\n\nSince we want to include the widget on the user profile, we can gather the location data from there, so we define the `location` prop.\n\nWidgets are wrapped in a [WidgetBlockLive](https://github.com/bonfire-networks/bonfire_ui_common/blob/main/lib/components/widgets/widget_block_live.ex) component that takes care of injecting a style and the basic prop as the title. The initial implementation of our `widget_forecast_live.sface` looks like this:\n\n```elixir\n \n hello world\n \n\n```\n\nTo see our widget, we need to include it in a page. Widgets are included in our right sidebar and are defined within a prop called `sidebar_widgets`, which is a list that includes guest and user lists (respectively, the widgets to show when the user is visiting a page while not logged in or when the user is logged in).\n\nWe'll include our widget in the logged list, specifying it is in the secondary widget section. The final look of our `sidebar_widget` prop looks like this:\n\n```elixir\nsidebar_widgets = [\n users: [\n secondary: [\n Bonfire.Geolocate.WidgetForecastLive, [location: \"Naples, Italy\"]\n ]\n ]\n]\n\n```\n\nWe'll include our widget in the user profile page, located in the [Bonfire.UI.Me](https://github.com/bonfire-networks/bonfire_ui_me) extension, a library that deals with all the views related to user profiles and settings.\n\nThe `Bonfire.UI.Me.ProfileLive` [mount function](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/views/profile/profile_live.ex#L34) looks like:\n\n```elixir\n def mount(_params, _session, socket) do\n {:ok,\n socket\n |> assign(LiveHandler.default_assigns(is_nil(current_user_id(assigns(socket)))))}\n end\n\n```\n\nThe `default_assigns` function includes data needed for dealing with multiple kinds of interactions and permissions. It also fetches the user from the database and ensures all the data is loaded correctly. The location data is fetched in [profiles_live_handler.ex:95](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/live_handlers/profiles_live_handler.ex#L95), and the widget is included in [profiles_live_handler.ex:274](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/live_handlers/profiles_live_handler.ex#L274).","ref":"add-a-new-widget.html#let-s-code"},{"type":"extras","title":"Adding Settings - Add a new widget","doc":"To ensure the user can decide whether they want to include the widget when visiting any user page, we're creating a new setting that optionally shows the widget based on user input.\n\nIn `profiles_live_handler.ex:274`, the widget is preceded by `weather_widget_enabled`, a boolean that controls whether the widget should be displayed or not. It makes use of the `Settings.get` function. You can learn more about defining and returning settings in our [Add an Extension Settings](/building/add-an-extension-settings.md) section.\n\nWe're adding the settings in the [edit_profile_info_live.sface](https://github.com/bonfire-networks/bonfire_ui_me/blob/main/lib/components/settings/profile/edit_profile_info_live.sface#L99) component (we may later refactor this to add the setting in the defined extension, but this is still a work in progress):\n\n```elixir\n \n \n \n\n```\n\nAt this point, we should be able to see our basic weather widget on our profile page and decide to switch it on and off.\n\nWhat remains is to include the logic for returning and displaying the weather. We will use the Forecastr library, which is already used in our application and added in the [bonfire](https://github.com/bonfire-networks/bonfire) extension.\n\nThe Forecastr library makes use of the Pirate Weather service, so we need a Pirate Weather API KEY. You can generate one on [pirateweather.net](http://pirateweather.net/) and add it at the bottom of your `.env` file:\n\n```elixir\nPIRATE_WEATHER_API=***********************\n\n```\n\nThe final component code looks like:\n\n```elixir\n{#if e(@location, nil)}\n \n {#case Forecastr.forecast(:today, e(@location, nil),\n units: :metric,\n renderer: Forecastr.Renderer.JSON\n )}\n {#match {:ok,\n %{\n \"description\" => weather,\n \"id\" => weather_id,\n \"temp\" => temp,\n \"name\" => weather_location\n }}}\n \n \n \n {temp}° \n {weather} \n \n \n {#match _}\n {/case}\n \n{/if}\n\n```","ref":"add-a-new-widget.html#adding-settings"},{"type":"extras","title":"Next Steps - Add a new widget","doc":"Although this weather widget is relatively basic, it significantly enhances the user experience by providing relevant metadata fetched from external services. This example demonstrates the potential for integrating additional information and functionality into widgets to create a more engaging and informative user interface.\nTo further improve this widget, developers can consider including more data points, such as:\n\n- Current moon position and phase\n- Daily amount of daylight hours\n- Sunrise and sunset times\n- Extended weather forecasts\n- Weather alerts and notifications\n\nBy incorporating these additional features, the widget can provide users with a more comprehensive overview of their location's weather and astronomical information, making it a valuable addition to their profile page.","ref":"add-a-new-widget.html#next-steps"},{"type":"extras","title":"Bonfire Navigation Sidebar","doc":"# Bonfire Navigation Sidebar","ref":"add-a-page-to-the-sidebar.html"},{"type":"extras","title":"Overview - Bonfire Navigation Sidebar","doc":"The Bonfire framework includes the navigation on the left sidebar, which can include pages from various extensions. Different navigation menus can be defined based on the current page (e.g., Explore and Settings pages have distinct menus).","ref":"add-a-page-to-the-sidebar.html#overview"},{"type":"extras","title":"Key Concepts - Bonfire Navigation Sidebar","doc":"1. Create new navigation menus\n2. Add pages to existing menus\n3. Override default navigation\n4. Use custom navigation components","ref":"add-a-page-to-the-sidebar.html#key-concepts"},{"type":"extras","title":"Creating a New Navigation Menu - Bonfire Navigation Sidebar","doc":"To create a new menu for your extension:\n\n1. Use the `declare_extension` macro in one of your extension views (typically the extension homepage).\n2. Configure your extension with options like name, icon, description, and navigation menu.\n\n```elixir\ndeclare_extension(\"Your Extension Name\",\n icon: \"🎆\",\n description: \"A short description to display in the extension settings\",\n default_nav: [\n ExtensionName.Path.YourPageLive,\n ExtensionName.Path.AnotherPageLive,\n # Add more pages as needed\n ]\n)\n```\n\n3. For each page in `default_nav`, use the `declare_nav_link` macro to define link properties:\n\n```elixir\ndeclare_nav_link(l(\"Your Page\"),\n page: \"your_page\",\n href: \"/your_page\",\n icon: \"ph:search\",\n icon_active: \"ph:search-fill\"\n)\n```","ref":"add-a-page-to-the-sidebar.html#creating-a-new-navigation-menu"},{"type":"extras","title":"Using the Default Navigation Menu - Bonfire Navigation Sidebar","doc":"To use the default navigation menu instead of your extension's menu:\n\n1. In each view's `mount` function, set the `nav_items` property:\n\n```elixir\ndef mount(params, session, socket) do\n {:ok,\n socket\n |> assign(\n nav_items: Bonfire.Common.ExtensionModule.default_nav()\n )\n }\nend\n```","ref":"add-a-page-to-the-sidebar.html#using-the-default-navigation-menu"},{"type":"extras","title":"Overriding Default Navigation with a Custom Menu - Bonfire Navigation Sidebar","doc":"To override the default navigation for specific pages:\n\n1. Create a custom navigation menu component.\n2. Use the `declare_nav_component(\"sidebar description\")` macro on the custom menu.\n3. In each view's `mount` function, set the `nav_items` property:\n\n```elixir\ndef mount(params, session, socket) do\n {:ok,\n socket\n |> assign(\n nav_items: [ExtensionName.Path.YourPageLive.declared_nav()]\n )\n }\nend\n```","ref":"add-a-page-to-the-sidebar.html#overriding-default-navigation-with-a-custom-menu"},{"type":"extras","title":"Add a new extension settings","doc":"# Add a new extension settings\n\nBonfire extensions can define settings that will be available to the users of the extension. These settings can be used to configure the behavior of the extension.\n\nTODO","ref":"add-an-extension-settings.html"},{"type":"extras","title":"Create a new extension","doc":"# Create a new extension\n \nExtensions in Bonfire are powerful tools that allow you to extend the functionality and features of your application.\nThis guide is perfect for developers who are looking to contribute new features or capabilities to the Bonfire ecosystem.\nBy the end of this page, you should have a solid understanding of how to develop and integrate a new extension in Bonfire, leveraging its modular architecture.","ref":"create-a-new-extension.html"},{"type":"extras","title":"Create your Bonfire extension - Create a new extension","doc":"1. To start building your own extension, you can utilise our custom mix generator task. Simply navigate to the Bonfire app root folder in your terminal and type:\n \n```\njust mix bonfire.extension.new *your_extension_name*\n```\n\nThis command creates a new directory in `./extensions` named `*your_extension_name*`, complete with all the necessary files and scaffolding.\n\n2. Add your extension to `./config/deps.flavour.path` (on a new line, it should look similar to `your_extension_name = \"extensions/your_extension_name\"`) to enable it locally.\n\n3. Once your new extension is set up, you're ready to dive into coding. Consider these possible steps to enhance your extension:\n\n- Implement extension-specific fake functions for testing purposes.\n- Create extension-specific [database migrations](https://hexdocs.pm/ecto_sql/Ecto.Adapters.SQL.html#module-migrations).\n- Add any dependencies you need to deps.git and/or deps.hex.\n- If your extension includes new pages, you need to link them in the main router. \n\n> #### Info {: .info}\n> Bonfire's Phoenix router module is found in the `bonfire` extension. Refer to the [Routing](/docs/building/routing.md) page to learn how to add new routes.\n\n\n4. After coding your initial features, create an empty repository on your preferred Git platform. Then, commit and push your local changes to make your work accessible and open for collaboration:\n\n```\ngit add .\ngit commit -m \"light my fire\"\ngit branch -M main\ngit remote add origin [your-remote-repository-url]\ngit push -u origin main\n```\n\n5. When you're ready for other people upstream to use your extension, add it to `./config/deps.git` (including the branch name).\n\nAnd just like that, you've successfully created and prepared your first Bonfire extension and shared with the community 🔥","ref":"create-a-new-extension.html#create-your-bonfire-extension"},{"type":"extras","title":"Create a new page","doc":"# Create a new page\n\nTODO","ref":"create-a-new-page.html"},{"type":"extras","title":"Make changes to an extension","doc":"# Make changes to an extension\n \nThis tutorial guides you through the process of editing an existing Bonfire extension. We'll cover how to clone, enable, and contribute to an extension, ensuring you can test and implement your changes effectively.\nIdeal for developers looking to modify and enhance Bonfire's functionalities.\nBy the end, you'll be adept at including and working with extensions in the Bonfire development environment.\n\n \nIn Bonfire, in order to edit an existing extension and test the changes you need to set up the extension in your development environment. The process is quite straightforward:","ref":"edit-an-existing-extension.html"},{"type":"extras","title":"Fork the extension - Make changes to an extension","doc":"If you want to share your changes to the extension, you may want to first fork it on Github.\n\nUse `just dep-clone-local *[dep]* *[repo]*` to clone an extension from its Git repository. Replace dep with the extension name and repo with the full URL of your fork. The cloned extension will be cloned in `./extensions`:\n \n```\njust dep-clone-local bonfire_social https://github.com/bonfire-networks/bonfire_social\n```","ref":"edit-an-existing-extension.html#fork-the-extension"},{"type":"extras","title":"Enable the extension - Make changes to an extension","doc":"After cloning, choose to use the local version by editing `./config/deps.flavour.path` (create the file in the `./flavours/[flavour]/config/` directory if it doesn’t exist). \nThe format to follow is the following: `dep_name = \"dep_path\"`.\nTo disable a local extension, comment or delete its line in `./config/deps.flavour.path`.\nUse just dev to run the app with changes hot-reloading.\n\n```\n# ./config/deps.flavour.path\nbonfire_me = \"./extensions/bonfire_me\"\n# bonfire_boundaries = \"./extensions/bonfire_boundaries\" # disabled local copy\n```","ref":"edit-an-existing-extension.html#enable-the-extension"},{"type":"extras","title":"Make and test your changes - Make changes to an extension","doc":"You can now make your edits to the `./extensions`, run the app with `just dev` and run tests with `just test-watch`.","ref":"edit-an-existing-extension.html#make-and-test-your-changes"},{"type":"extras","title":"Push changes - Make changes to an extension","doc":"You can push your changes remotely, use Bonfire's helpers like `just contrib` if you need to commit files that belong to multiple extensions or `just update-dep *dep*` for a specific one (e.g.` just update-dep bonfire_me`).","ref":"edit-an-existing-extension.html#push-changes"},{"type":"extras","title":"Great works 🎉🎉🎉 - Make changes to an extension","doc":"You're now equipped to contribute to Bonfire extensions, enhancing the framework's capabilities. You can do so by opening a PR on Github from your forked extension. Your contributions are vital to the Bonfire community, and we encourage you to keep exploring and improving the project.","ref":"edit-an-existing-extension.html#great-works"},{"type":"extras","title":"What is a Bonfire extension","doc":"# What is a Bonfire extension\n\nExtensions in Bonfire are collections of code that introduce new features and enhance the platform's functionality, or explore a different user experience for an existing feature.\n\nThey can range from adding entirely new pages, such as [bonfire_invite_links]() which lets admins create and share invites with usage limit and expiration date, to implementing specific components or widgets.\nAn example is [bonfire_editor_milkdown](), which integrates a markdown-first editor for publishing activities.\n\nExtensions are versatile, they can implement their own schema, database, logic, and components, or they can leverage existing fields, context functions, and UI components, or more commonly, a combination of both.","ref":"extensions-overview.html"},{"type":"extras","title":"Using extensions - What is a Bonfire extension","doc":"In order to make changes to extensions, you need to clone them locally. As you may imagine, we have a `just` command for that.\n\n```\njust dep-clone-local **[extension name]** **[extension url]**\n```\n\nThis command (eg. `just dep-clone-local bonfire_ui_social https://github.com/bonfire-app/bonfire_ui_social`) will create a local copy of the extension in `./extensions/bonfire_ui_social`.\n\nIf the extension is enabled locally, you will see an entry in `config/deps.flavour.path` with the path to the local extension: \n\n```\nbonfire_ui_social = \"extensions/bonfire_ui_social\"\n```\n\nIf you want to disable the extension, you can remove the entry from `config/deps.flavour.path`\n\n> #### Info {: .info}\n>\n> `config/deps.flavour.path` is a symlink of the file `flavours/[flavour]/deps.flavour.path`. Ensure this file exist in the flavour you are working on, or create one to begin use your extensions locally.\n\n\nWhen the extension is enabled, Bonfire will use the code in `extensions/` instead of the one in `deps/`.\n\nWe will dive more into the creation and the lifecycle of extensions in the next sections.","ref":"extensions-overview.html#using-extensions"},{"type":"extras","title":"Extension helpers - What is a Bonfire extension","doc":"Given Bonfire modularity, you will likely find yourself combining functions from several extensions when using the framework.\nA significant portion of its codebase is included in extensions, each serving specific purposes.\nMoreover, extensions often utilise code from other extensions.\nFor instance, [bonfire_common](https://github.com/bonfire-networks/bonfire_common) and [bonfire_ui_common](https://github.com/bonfire-networks/bonfire_ui_common) provide a suite of helpers to ease a good amount of tasks.\n\nWhen using extensions functions, we need a way to ensure the app will not break if the extension is not enabled.\n\nBonfire provides a few built-in components that allows users to optionally inject components or functions from different extensions.\n\n`Bonfire.Common.Utils.maybe_apply`\n\n- Helpers for calling hypothetical functions in other modules. Returns the result of calling a function with the given arguments, or the result of fallback function if the primary function is not defined (by default just logging an error message).\n\n```elixir\nBonfire.Common.Utils.maybe_apply(Bonfire.Social.Graph, :maybe_applications, [],\n fallback_return: []\n )\n```\n\n`Bonfire.UI.Common.Modular.StatefulComponent`\n\n- A built-in component that allows users to optionally inject dynamic live components into a Surface template.\n Based on `Surface.Components.Dynamic.LiveComponent` to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.\n\n```elixir\n \n```\n\n`Bonfire.UI.Common.Modular.StatelessComponent`\n\n- A built-in component that allows users to optionally inject dynamic functional components into a Surface template.\n Based on `Surface.Components.Dynamic.Component` to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.\n\n```elixir\n \n```","ref":"extensions-overview.html#extension-helpers"},{"type":"extras","title":"Project structure","doc":"# Project structure\n\nTODO","ref":"project-structure.html"},{"type":"extras","title":"Routing","doc":"# Routing\n\nThe Bonfire routing system provides a modular and extensible way to define routes for different parts of your application. \nIt allows developers to include routes directly from their extensions based on their availability and configuration. \nThe routes are organized into pipelines and scopes to handle authentication and authorization requirements.\n\nThe Router module is declared in the [router.ex](https://github.com/bonfire-networks/bonfire/blob/main/lib/web/router.ex) file in the [bonfire](https://github.com/bonfire-networks/bonfire) extension.\n\nThe `Bonfire.Web.Router.Routes` module defines all the routes for active Bonfire extensions that will be included in the Bonfire app. It also includes routes for GraphQl and AcitvityPub specific endpoints.\n\n\nIn order to add a new route to Bonfire, you need to create a Routes module in your extension. It is usually named as `Project.ExtensionName.Web.Routes` eg. [Bonfire.UI.Social.Routes](https://github.com/bonfire-networks/bonfire_social/blob/main/lib/bonfire_social_web/routes.ex)\n\nThe Routes file follows the standard Phoenix/Liveview syntax and structure.","ref":"routing.html"},{"type":"extras","title":"Add a new route - Routing","doc":"To add a new routes to the Router, you need to add include it to the main Router. \n\n> #### Info {: .info}\n>\n> At the moment, you need a workaround to be able to enable the `bonfire` dependency locally: clone it in your `./extensions` folder and then add it to your` deps.flavour.path` file.\n\nOnce you have the `bonfire` dep enabled locally, include your new extension router with `use_if_enabled(Project.ExtensionName.Web.Routes)` in the [Bonfire.Web.Router.Routes](https://github.com/bonfire-networks/bonfire/blob/main/lib/web/router.ex) file.","ref":"routing.html#add-a-new-route"},{"type":"extras","title":"What is a Bonfire flavour?","doc":"# What is a Bonfire flavour?","ref":"what-is-flavour.html"},{"type":"extras","title":"Working with flavour","doc":"# Working with flavour\n\ntest","ref":"working-with-flavour.html"},{"type":"extras","title":"Bonfire Architecture","doc":"# Bonfire Architecture","ref":"architecture.html"},{"type":"extras","title":"Hacking - Bonfire Architecture","doc":"Bonfire is an unusual piece of software, developed in an unusual way. It originally started as a project to create a generic federation library/framework, while building an app for educators to share and collaborate on learning resources with their peers, and has been forked and evolved a lot since then. \n\nHacking on it is actually pretty fun. The codebase has a unique feeling to work with and we've relentlessly refactored to manage the ever-growing complexity that a distributed social networking toolkit implies. That said, it is not easy to understand without context, which is what this document is here to provide.","ref":"architecture.html#hacking"},{"type":"extras","title":"Design Decisions - Bonfire Architecture","doc":"Feature goals:\n\n- Flexibility for developers and users.\n- Extreme configurability and extensibility.\n- Integrated federation with the existing fediverse.\n\nOperational goals:\n\n- Easy to set up and run.\n- Light on resources for small deployments.\n- Scalable for large deployments.","ref":"architecture.html#design-decisions"},{"type":"extras","title":"Stack - Bonfire Architecture","doc":"Our main implementation language is [Elixir](https://www.elixir-lang.org/), which is designed for building reliable systems. We have almost [our own dialect](./BONFIRE-FLAVOURED-ELIXIR.md).\n\nWe use the [Phoenix](https://www.phoenixframework.org/) web framework with [LiveView](https://hexdocs.pm/phoenix_live_view/) and [Surface](https://surface-ui.org/documentation) for UI components and views.\n\nSurface is a different syntax for LiveView that is designed to be more convenient and understandable to frontend developers, with extra compile time checks. Surface views and components are compiled into LiveView code (so once you hit runtime, Surface in effect doesn't exist any more).\n\nSome extensions use the [Absinthe](https://absinthe-graphql.org/) GraphQL library to expose an API.","ref":"architecture.html#stack"},{"type":"extras","title":"The Bonfire Environment - Bonfire Architecture","doc":"We like to think of bonfire as a comfortable way of developing software - there are a lot of conveniences built in once you know how they all work. The gotcha is that while you don't know them, it can be a bit overwhelming. Don't worry, we've got your back.","ref":"architecture.html#the-bonfire-environment"},{"type":"extras","title":"Code Structure - Bonfire Architecture","doc":"The code is broadly composed namespaces such as these, many of which are packaged as \"extensions\" which live in separate git repositories, which are included in the app by way of mix dependencies:\n\n- `Bonfire.*` - Core application logic (very little code).\n- `Bonfire.*.*` - Bonfire extensions (eg `Bonfire.Posts`) containing mostly context modules, APIs, and routes\n- `Bonfire.Data.*` - Extensions containing database schemas and migrations \n- `Bonfire.UI.*` - UI component extensions\n- `Bonfire.*.*.LiveHandler` - Backend logic to handle events in the frontend\n- `Bonfire.Editor.*` (pluggable text editors, eg. CKEditor for WYSIWYG markdown input)\n- `Bonfire.GraphQL.*` - Optional GraphQL API\n- `Bonfire.Federate.*` - Optional Federation hooks\n- `ActivityPub` - ActivityPub S2S models, logic and various helper modules \n- `ActivityPub.Web` - ActivityPub S2S REST endpoints, activity ingestion and push federation facilities \n- `ValueFlows.*` - economic extensions implementing the [ValueFlows vocabulary](https://www.valueflo.ws)\n\n\nContexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. `Bonfire.Posts` implements `Bonfire.Data.Social.Post`). \n\nAll Bonfire objects use an ULID as their primary key. We use the `Needle` library (with extra logic in `Bonfire.Common.Needles`) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see `Bonfire.Data.Social.Follow`) for an example.\n\nContext modules usually have `one/2`, `many/2`, and `many_paginated/1` functions for fetching objects, which in turn call a `query/2` function. These take a keyword list as filters (and an optional `opts` argument) allowing objects to be fetched by arbitrary criteria.\n\nExamples:\n\n```\nUsers.one(username: \"bob\") # Fetching by username\nPosts.many_paginated(by: \"01E9TQP93S8XFSV2ZATX1FQ528\") # List a page of posts by its author\nEconomicResources.many(deleted: true) # List any deleted resources\n```\n\nContext modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.\n\nHere is an incomplete sample of some of current extensions and modules:\n\n- `Bonfire.Me.Accounts` (for managing and querying local user accounts)\n- `Bonfire.Me.Users` (for managing and querying both local and remote user identities and profiles)\n- `Bonfire.Boundaries` (for managing and querying circles, ACLs, permissions...)\n- `Bonfire.Social.FeedActivities`, `Bonfire.Social.Feeds` and `Bonfire.Social.Activities` (for managing and querying activities and feeds)\n- `Bonfire.Posts` and `Bonfire.Social.PostContents` (for managing and querying posts)\n- `Bonfire.Social.Threads` (for managing and querying threads and comments)\n- `Bonfire.Social.Flags` (for managing and querying flags)\n- `Bonfire.Social.Graph.Follows` (for managing and querying follows)\n- `Bonfire.Classify` (for managing and querying categories, topics, and the like)\n- `Bonfire.Tag` (for managing and querying tags and mentions)\n- `Bonfire.Geolocate` (for managing and querying locations and geographical coordinates)\n- `Bonfire.Quantify` (for managing and querying units and measures)\n\n#### Additional extensions, libraries, and modules\n\n- `Bonfire.Common` and `Bonfire.Common.Utils` (stuff that gets used everywhere)\n- `Bonfire.Application` (OTP application)\n- `Bonfire.Me.Characters` (a shared abstraction over users, organisations, categories, and other objects that need to have feeds and behave as an actor in ActivityPub land)\n- `Bonfire.Federate.ActivityPub` and `ActivityPub` (ActivityPub integration)\n- `Bonfire.Search` (local search indexing and search API, powered by Meili)\n- `Bonfire.Mailer`, `Bonfire.Me.Mails`, and `Bamboo` (for rendering and sending emails)\n- `Bonfire.Files`, `Waffle`, `TreeMagic` and `TwinkleStar` (for managing uploaded content)\n- `Bonfire.GraphQL` (GraphQL API abstractions)\n- `Queery` and `Bonfire.Repo.Query` (Helpers for making queries on the database)\n- `Bonfire.Repo` (Ecto repository)\n- `Exto` (to extend DB schemas in config, especially useful for adding associations)\n- `AbsintheClient` (for querying the API from within the server)","ref":"architecture.html#code-structure"},{"type":"extras","title":"General structure - Bonfire Architecture","doc":"- Bonfire app\n - A [flavour](../README.md#flavours) running `Bonfire.Application` as supervisor\n - Configs assembled from extensions at `flavour/$FLAVOUR/config`\n - Phoenix at `Bonfire.Web.Endpoint`\n - Routes assembled from extensions at `Bonfire.Web.Router` \n - GraphQL schema assembled from extensions at `Bonfire.GraphQL.Schema`\n - Database migrations assembled from extensions at `flavour/$FLAVOUR/repo/migrations`\n - Data seeds assembled from extensions at `flavour/$FLAVOUR/repo/seeds`\n - Extensions and libraries as listed in `flavour/$FLAVOUR/config/deps.*`\n - Extensions defining schemas and migrations (usually `Bonfire.Data.*`)\n - Schemas\n - Migrations defined as functions in the schema modules in `lib/`\n - Migration templates calling those functions in `priv/repo/migrations` which are then copied into an app flavour's migrations\n - Extensions implementing features or groups of features (eg. `Bonfire.Me`)\n - Config template which is then copied into an app flavour's config (eg `config/bonfire_me.exs`)\n - Contexts (eg `Bonfire.Me.Users`)\n - Sometimes LiveHandlers for handling frontend events in the backend (eg `Bonfire.Me.Users.LiveHandler`)\n - Routes (eg `Bonfire.UI.Me.Routes`)\n - Controllers and/or Views (eg `Bonfire.UI.Me.CreateUserController` and `Bonfire.UI.Me.CreateUserLive`)\n - API (eg `Bonfire.Me.API.GraphQL`), refer to [GraphQL API documentation](./GRAPHQL.md)\n - Schemas\n - Resolvers\n - Sometimes Plugs (eg `Bonfire.Web.Plugs.UserRequired` and `Bonfire.Web.LivePlugs.UserRequired`)\n - Other extensions or libraries (eg `Needle` or `Bonfire.Common` which are used by most other extensions)","ref":"architecture.html#general-structure"},{"type":"extras","title":"Naming - Bonfire Architecture","doc":"It is said that naming is one of the four hard problems of computer science (along with cache management and off-by-one errors). We don't claim our scheme is the best, but we do strive for consistency.","ref":"architecture.html#naming"},{"type":"extras","title":"Naming guidelines - Bonfire Architecture","doc":"- Module names mostly begin with `Bonfire.` unless they belong to a more generic library (eg `Needle` or `ValueFlows`)\n- Everything within an extension begins with the context name and a `.` (eg `Bonfire.Social.Migrations`)\n- Database schemas should be named in the singular (eg `Bonfire.Data.Social.Post`)\n- Context modules are named in plural where possible (eg `Bonfire.Posts`)\n- Other modules within a context begins with the context name and a `.` (eg `Bonfire.Posts.LiveHandler`)\n- Modules use UpperCamelCase while functions use snake_case\n- Acronyms in module names should be all uppercase (eg `Bonfire.Social.APActivities`)","ref":"architecture.html#naming-guidelines"},{"type":"extras","title":"Federation libraries - Bonfire Architecture","doc":"### `ActivityPub`\n\nThis namespace handles the ActivityPub logic and stores AP activities. It is largely adapted Pleroma code with some modifications, for example merging of the activity and object tables and new actor object abstraction.\n\n- `ActivityPub` contains the main API and is documented there. \n- `ActivityPub.Federator.Adapter` defines callback functions for the AP library.\n\nIt also contains some functionality that isn't part of the AP spec but is required for federation:\n- `ActivityPub.Safety.Keys` - Generating and handling RSA keys and signatures \n- `ActivityPub.Federator.WebFinger` - Implementation of the WebFinger protocol\n- `ActivityPub.Federator.HTTP` - Module for making HTTP requests (wrapper around tesla)\n- `ActivityPub.Instances` - Module for storing reachability information about remote instances\n\nAlso refer to [MRF documentation](./MRF.md) to learn how to rewrite or discard messages.\n\n### `ActivityPub.Web`\n\nThis namespace contains the ActivityPub Server-to-Server REST API, the activity ingestion pipeline (`ActivityPub.Federator.Transformer`) and the push federation facilities (`ActivityPub.Federator`, `ActivityPub.Federator.APPublisher` and others). The outgoing federation module is designed in a modular way allowing federating through different protocols in the future.","ref":"architecture.html#federation-libraries"},{"type":"extras","title":"ActivityPub integration with Bonfire's application logic - Bonfire Architecture","doc":"The callback functions defined in `ActivityPub.Federator.Adapter` are implemented in `Bonfire.Federate.ActivityPub.Adapter`. \n\nWhen implementing federation for a new object type it needs to be implemented for both directions: \nfor outgoing federation using the hooks in `Bonfire.Federate.ActivityPub.Outgoing` and for incoming federation using the hooks in `Bonfire.Federate.ActivityPub.Incoming`.","ref":"architecture.html#activitypub-integration-with-bonfire-s-application-logic"},{"type":"extras","title":"Bonfire-flavoured Elixir","doc":"# Bonfire-flavoured Elixir\n\nBonfire has a few libraries that are widely used in the codebase and make writing Elixir feel a little bit different. To help you get less confused by this, here's a guide on what we can call \"bonfire-flavoured elixir\"!\n\nPlease note this guide assumes you already know [Elixir](https://elixir-lang.org/getting-started/introduction.html).\n\n## `Arrows`\n\nThe Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). Here is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"bonfire-flavoured-elixir.html"},{"type":"extras","title":"Ok-pipe - Bonfire-flavoured Elixir","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.","ref":"bonfire-flavoured-elixir.html#ok-pipe"},{"type":"extras","title":"Untangle - Bonfire-flavoured Elixir","doc":"`Untangle` provides replacements for the macros in Elixir's `Logger` module and the `IO.inspect` function to output code location information. The first argument will be `inspect`ed and the second (where provided) will be used as a label:\n\n```\niex(1)> import Untangle\nUntangle\niex(2)> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\niex(3)> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes slightly more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for\ninserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!\n\nYou will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.","ref":"bonfire-flavoured-elixir.html#untangle"},{"type":"extras","title":"Error handling - Bonfire-flavoured Elixir","doc":"`Bonfire.Fail` is an `Exception` handler, which you can use to stop the show anywhere in the code, e.g:\n\n`id = uid(object) || raise(Bonfire.Fail, :not_found)` \n\nYou can use this special exception when you want to redirect the user to the login page rather than just show an error:\n`user = current_user(assigns) || raise(Bonfire.Fail.Auth, :needs_login)` \n\nAdvantages include:\n\n- standardised error messages (defaults are defined at https://github.com/bonfire-networks/bonfire_fail/blob/main/lib/runtime_config.ex#L16) which can be overridden in your app's config using `config :bonfire_fail, :common_errors`\n- friendly error messages are defined in one place, which means no duplicated localisation efforts\n- uses the elixir/OTP pattern of \"let it crash\"\n- returns the correct HTTP code when applicable\n- no need to wrap blocks in if/else or the like \n- for users of the LiveView frontend, this will make the corresponding friendly error message appear in a flash overlay (if using `Bonfire.UI.Common.LiveHandlers` and/or `Bonfire.UI.Common.undead/3`)","ref":"bonfire-flavoured-elixir.html#error-handling"},{"type":"extras","title":"Design Guidelines","doc":"# Design Guidelines\n\nTODO","ref":"design.html"},{"type":"extras","title":"Just commands","doc":"# Just commands\n\nWelcome to this guide on navigating the world of Bonfire development, is crafted especially for people taking their first steps in Bonfire or looking to refine their workflow.","ref":"just.html"},{"type":"extras","title":"General Setup Related Commands - Just commands","doc":"As you dive into developing your own extension or app with the Bonfire framework, you'll quickly encounter an array of dependencies and extensions to deal with. An extension that uses a function or a component from a different extension is not an exception, but rather a common pattern.\n\nThis setup means you might likely soon find yourself contributing to multiple extensions simultaneously. Navigating this landscape can be intimidating at first, but Bonfire provides tools to streamline the process.\n\nThey help you effortlessly synchronize the latest updates across different extensions or efficiently push your updates to all relevant repositories. Understanding these facilities is key to a smooth and productive development experience in the Bonfire ecosystem.\n \nMost of these tools are driven by [just](https://github.com/casey/just#just) and their code can be seen in the [justfile](https://github.com/bonfire-networks/bonfire-app/blob/main/justfile) (which is quite similar to a `Makefile`). Below is a small selection of the most used commands.\n \n \n \n`just`\n- Print a list of all possible `just` commands a short explanation for each. \n\n`just update`\n- Update the app and all extensions/forks, and run migrations. Use this command to ensure you're in sync with the most recent changes across your development environment. \n\n`just update-app`\n- This command updates the app along with Bonfire extensions located in `./deps`. It's ideal for updating the app while excluding the extensions currently under development located in `./extensions`.\n\n`just dep-clone *[dep]* *[repo]*`\n- Clone a git dependency and use the local version, eg: `just dep-clone-local bonfire_me https://github.com/bonfire-networks/bonfire_me`. Active extensions need to be added in `./config/deps.path` (see [the tutorial on how to fork an extension](/courses/how_to_fork_extension/)). To switch between local and remote dependencies, simply comment or uncomment the corresponding lines in this file.\n\n`just contrib`\n- Push all changes to the app and extensions in `./forks` and `./extensions`.\n\n`just contrib-release`\n- Push all changes to the app and extensions in `./forks`, increment the app version number, and push a new version/release\n\n`just test`\n- Run tests of all extensions, or only specific tests, eg: `just test extensions/bonfire_social` or `just test extensions/bonfire_social/test/social/boosts_test.exs`\n\n`just test-watch *[path]*`\n- Run stale tests, and wait for changes to any module code, and re-run affected tests. \n\n`just test-federation-in-extensions *[path]*`\n- Test federation integration in your extension.","ref":"just.html#general-setup-related-commands"},{"type":"extras","title":"Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"# Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto\n\n> One foreign key to rule them all and in the darkness, bind them. - Gandalf, paraphrased.\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle)](https://hex.pm/packages/needle)\n[hexdocs](https://hexdocs.pm/needle)","ref":"Needle.html"},{"type":"extras","title":"Intro - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Bonfire uses the excellent PostgreSQL database for most data storage. PostgreSQL allows us to make a wide range of queries and to make them relatively fast while upholding data integrity guarantees.\n\nPostgres is a relational schema-led database - it expects you to pre-define tables and the fields in each table (represented in tabular form, i.e. as a collection of tables with each table consisting of a set of rows and columns). Fields can contain data or a reference to a row in another table. \n\nThis usually means that a field containing a reference has to be pre-defined with a foreign key pointing to a specific field (typically a primary key, like an ID column) *in a specific table*. \n\nA simple example would be a blogging app, which might have a `post` table with `author` field that references the `user` table.\n\nA social network, by contrast, is actually a graph of objects. Objects need to be able to refer to other objects by their ID without knowing their type. \n\nA simple example would be likes, you might have a `likes` table with `liked_post_id` field that references the `post` table. But you don't just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add `liked_video_id`, `liked_image_id`, etc?\n\nWe needed the flexibility to have a foreign key that can reference any referenceable object. We call our system `Needle`.\n\nThis guide is a brief introduction to Needle. It assumes some foundational knowledge:\n\n* Basic understanding of how relational databases like Postgresql work, in particular:\n * Tables being made up of fields.\n * What a primary key is and why it's useful.\n * Foreign keys and relationships between tables (1 to 1, 1 to Many, Many to 1, Many to Many).\n * Views as virtual tables backed by a SQL query.\n\n* Basic understanding of Elixir (enough to follow the examples).\n* Basic working knowledge of the [Ecto](https://hexdocs.pm/ecto/Ecto.html) database library (schema and migration definitions)","ref":"Needle.html#intro"},{"type":"extras","title":"What is Needle? - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"A means of foreign keying many tables in one field. Designed for highly interlinked data in highly dynamic schemata where tracking all the foreign keys is neither desired nor practical.\n\n> A universal foreign key is actually a hard problem. Many approaches are on offer with a variety of tradeoffs. If plugging into Bonfire's Needle-based core extensions isn't a requirement for you (i.e. you don't need to put things into feeds or use boundaries for access-control) should carefully consider a variety of approaches rather than just blindly adopting the one that fitted our project's needs the best!","ref":"Needle.html#what-is-needle"},{"type":"extras","title":"Identifying objects - the UID type - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"All referenceable objects in the system have a unique ID (primary key) whose type is the `Needle.UID`. `UUIDv7` and [ULIDs](https://github.com/ulid/spec) are a lot like standard `UUID` in that you can generate unique ones independently of the database. It's also a little different, being made up of two parts:\n\n* The current timestamp, to millisecond precision.\n* Strong random padding for uniqueness.\n\nThis means that it naturally sorts by time to the millisecond (close enough for us), giving us a performance advantage compared to queries ordered by a separate creation datetime field (by contrast, UUIDv4 is randomly distributed).\n\nIf you've only worked with integer primary keys before, you are probably used to letting the database dispense an ID for you. With `ULID` (or `UUID`), IDs can be known *before* they are stored, greatly easing the process of storing a graph of data and allowing us to do more of the preparation work outside of a transaction for increased performance.\n\nIn PostgreSQL, we actually store `UUIDv7` and `ULID`s as `UUID` columns, thanks to both being the same size (and the lack of specific column types shipping with postgresql). You mostly will not notice this because it's handled for you, but there are a few places it can come up:\n\n* Ecto debug and error output may show either binary values or UUID-formatted values.\n* Hand-written SQL may need to convert table IDs to the `UUID` format before use.","ref":"Needle.html#identifying-objects-the-uid-type"},{"type":"extras","title":"It's just a table - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The `Needle` system is mostly based around a single table represented by the `Needle.Pointer` schema with the following fields:\n\n* `id` (UID) - the database-wide unique id for the object, primary key.\n* `table_id` (UID) - identifies the type of the object, references `Needle.Table`.\n* `deleted_at` (timestamp, default: `null`) - when the object was deleted.\n\nEvery object that is stored in the system will have a record in this table. It may also have records in other tables (handy for storing more than 3 fields about the object!).\n\nA `Table` is a record of a table that may be linked to by a pointer. A `Pointer` is a pointer ID and a table ID.\nWith these two ingredients, we can construct a means of pointing to any table that has a `Table` entry.\n\nBut don't worry about `Needle.Table` for now, just know that every object type will have a record there so `Needle.Pointer.table_id` can reference it.","ref":"Needle.html#it-s-just-a-table"},{"type":"extras","title":"Installation - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Aside from adding the dependency, you will also need to write add a migration to set up the database before you can start writing your regular migrations:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.InitPointers do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up(), do: inits(:up)\n def down(), do: inits(:down)\n\n defp inits(dir) do\n init_pointers_ulid_extra(dir) # this one is optional but recommended\n init_pointers(dir) # this one is not optional\n end\nend\n```\n\n> Note: Pointers is already a default dependency of most Bonfire extensions, so you shouldn't need to add the migration if building a new extension.","ref":"Needle.html#installation"},{"type":"extras","title":"Declaring Object Types - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#declaring-object-types"},{"type":"extras","title":"Picking a table id - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The first step to declaring a new type is picking a unique table ID in UID format. \n\nYou could just generate a random UID, but since these IDs are special, we tend to assign a synthetic UID that are readable as words so they stand out in debug output.\n\nFor example, the ID for the `Feed` table is: `1TFEEDS0NTHES0V1S0FM0RTA1S`, which can be read as \"It feeds on the souls of mortals\". Feel free to have a little fun coming up with them, it makes debug output a little more cheery! The rules are:\n\n* The alphabet is [Crockford's Base32](https://en.wikipedia.org/wiki/Base32#Crockford's_Base32).\n* They must be 26 characters in length.\n* The first character must be a digit in the range 0-7.\n\nTo help you with this, the `Needle.UID.synthesise!/1` method takes an alphanumeric binary and tries to return you it transliterated into a valid UID. Example usage:\n\n```\niex(1)> Needle.UID.synthesise!(\"itfeedsonthesouls\")\n\n11:20:28.299 [error] Too short, need 9 chars.\n:ok\niex(2)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortalsandothers\")\n\n11:20:31.819 [warn] Too long, chopping off last 9 chars\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(3)> Needle.UID.synthesise!(\"itfeedsonthesoulsofmortals\")\n\"1TFEEDS0NTHES0V1S0FM0RTA1S\"\niex(4)> Needle.UID.synthesise!(\"gtfeedsonthesoulsofmortals\")\n\n11:21:03.268 [warn] First character must be a digit in the range 0-7, replacing with 7\n\"7TFEEDS0NTHES0V1S0FM0RTA1S\"\n```","ref":"Needle.html#picking-a-table-id"},{"type":"extras","title":"Virtual pointables (\"virtuals\") - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"`Needle.Virtual` is the simplest and most common type of object. Here's a definition of block:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block do\n\n use Needle.Virtual,\n otp_app: :bonfire_data_social,\n table_id: \"310CK1NGSTVFFAV01DSSEE1NG1\",\n source: \"bonfire_data_social_block\"\n\n alias Bonfire.Data.Edges.Edge\n\n virtual_schema do\n has_one :edge, Edge, foreign_key: :id\n end\nend\n```\n\nIt should look quite similar to a mixin definition, except that we `use` `Needle.Virtual` this time (passing an additional `table_id` argument) and we call the `virtual_schema` macro.\n\nThe primary limitation of a virtual is that you cannot put extra fields on it. This also means that `belongs_to` is not generally permitted because it results in adding a field, while `has_one` and `has_many` work just fine as they do not cause the creation of fields in the schema.\n\nThis is not usually a problem, as extra fields can be put into [mixins](mixins-storing-data-about-objects) or [multimixins](#multimixins) as appropriate.\n\nIn all other respects, they behave like Pointables. You can have changesets over them and select and insert as usual.\n\n> Under the hood, a virtual has a writable view (in the above example, called `bonfire_data_social_block`). It looks like a table with just an id, but it's populated with all the ids of blocks that have not been deleted. When the view is inserted into, a record is created in the `pointers` table for you transparently. When you delete from the view, the corresponding `pointers` entry is marked deleted for you.\n\n> Before introducing Virtuals, we noticed it was very common to create Pointables with no extra fields just so we could use the Needle system. Virtuals are alternative for this case that requires less typing and provides a reduced overhead vs pointable (as they save the cost of maintaining a primary key in that table and the associated disk space).","ref":"Needle.html#virtual-pointables-virtuals"},{"type":"extras","title":"Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The other, lesser used, type of object is called the `Needle.Pointable`. The major difference is that unlike the simple case of virtuals, pointables are not backed by views, but by tables.\n\n> When a record is inserted into a pointable table, a copy is made in the `pointers` table for you transparently. When you delete from the table, the the corresponding `pointers` entry is marked deleted for you. In these ways, they behave very much like virtuals. By having a table, however, we are free to add new fields.\n\nPointables pay for this flexibility by being slightly more expensive than virtuals:\n\n* Records must be inserted into/deleted from two tables (the pointable's table and the `pointers` table).\n* The pointable table needs its own primary key index.\n\nThe choice of using a pointable instead of a virtual combined with one or more mixins is ultimately up to you.\n\nHere is a definition of a pointable type (indicating an ActivityPub activity whose type we don't recognise, stored as a JSON blob):\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity do\n\n use Needle.Pointable,\n otp_app: :bonfire_data_social,\n table_id: \"30NF1REAPACTTAB1ENVMBER0NE\",\n source: \"bonfire_data_social_apactivity\"\n\n pointable_schema do\n field :json, :map\n end\nend\n```\n\n\n> As you can see, to declare a pointable schema, we start by using `Needle.Pointable`, providing the name of our otp application, the source table's name in the database and our chosen sentinel UID.\n\n> We then call `pointable_schema` and define any fields we wish to put directly in the table. For the most part, `pointable_schema` is like Ecto's `schema` macro, except you do not provide the table name and let it handle the primary key.\n\n> If for some reason you wished to turn ID autogeneration off, you could pass `autogenerate: false` to the options provided when using `Needle.Pointable`.","ref":"Needle.html#pointables"},{"type":"extras","title":"Adding re-usable fields - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#adding-re-usable-fields"},{"type":"extras","title":"Mixins - storing data about objects - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Mixins are tables which contain extra information on behalf of objects. Each object can choose to\nrecord or not record information for each mixin. Sample mixins include:\n\n* user profile (containing a name, location and summary)\n* post content (containing the title, summary, and/or html body of a post or message)\n* created (containing the id of the object creator)\n\nIn this way, they are reusable across different object types. One mixin may (or may not) be used by any number of objects. This is mostly driven by the type of the object we are storing, but can also be driven by user input.\n\nMixins are just tables too! The only requirement is they have a `UID` primary key which references `Needle.Pointer`. The developer of the mixin is free to put whatever other fields they want in the table, so long as they have that primary-key-as-reference (which will be automatically added for you by the `mixin_schema` macro). \n\nHere is a sample mixin definition for a user profile:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_profile\"\n\n mixin_schema do\n field :name, :string\n field :summary, :string\n field :website, :string\n field :location, :string\n end\nend\n```\n\n> Mixin tables are not themselves pointable, so there is no need to specify a table id as when defining a pointable schema.\n\nAside from `use`ing `Needle.Mixin` instead of `Ecto.Schema` and calling `mixin_schema` instead of\n`schema`, pretty similar to a standard Ecto schema, right? \n\nThe arguments to `use Needle.Mixin` are:\n\n* `otp_app`: the OTP app name to use when loading dynamic configuration, e.g. the current extension or app (required)\n* `source`: the underlying table name to use in the database\n\nWe will cover dynamic configuration later. For now, you can use the OTP app that includes the module.","ref":"Needle.html#mixins-storing-data-about-objects"},{"type":"extras","title":"Multimixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Multimixins are like mixins, except that where an object may have 0 or 1 of a particular mixins, an object may have any number of a particular multimixin.\n\nFor this to work, a multimixin must have a *compound primary key* which must contain an `id` column referencing `Needle.Pointer` and at least one other field which will collectively be unique.\n\nAn example multimixin is used for publishing an item to feeds:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish do\n\n use Needle.Mixin,\n otp_app: :bonfire_data_social,\n source: \"bonfire_data_social_feed_publish\"\n\n alias Needle.Pointer\n\n mixin_schema do\n belongs_to :feed, Pointer, primary_key: true\n end\nend\n```\n\nNotice that this looks very similar to defining a mixin. Indeed, the only difference is the `primary_key: true` in this line, which adds a second field to the compound primary key.\nThis results in ecto recording a compound primary key of `(id, feed_id)` for the schema (the id is added for you as with regular mixins).","ref":"Needle.html#multimixins"},{"type":"extras","title":"Writing Migrations - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Migrations are typically included along with the schemas as public APIs you can call within your project's migrations.","ref":"Needle.html#writing-migrations"},{"type":"extras","title":"Virtuals - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Most virtuals are incredibly simple to migrate for:\n\n```elixir\ndefmodule Bonfire.Data.Social.Post.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Post\n\n def migrate_post(), do: migrate_virtual(Post)\n\nend\n```\n\nIf you need to do more work, it can be a little trickier. Here's an example for `block`, which also creates a unique index on another table:\n\n```elixir\ndefmodule Bonfire.Data.Social.Block.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n import Bonfire.Data.Edges.Edge.Migration\n alias Bonfire.Data.Social.Block\n\n def migrate_block_view(), do: migrate_virtual(Block)\n\n def migrate_block_unique_index(), do: migrate_type_unique_index(Block)\n\n def migrate_block(dir \\\\ direction())\n\n def migrate_block(:up) do\n migrate_block_view()\n migrate_block_unique_index()\n end\n\n def migrate_block(:down) do\n migrate_block_unique_index()\n migrate_block_view()\n end\n\nend\n```\n\nNotice how we have to write our `up` and `down` versions separately to get the correct ordering of operations.","ref":"Needle.html#virtuals"},{"type":"extras","title":"Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Migration example for a `Pointable`:\n\n```elixir\ndefmodule Bonfire.Data.Social.APActivity.Migration do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.APActivity\n\n defp make_apactivity_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_pointable_table(Bonfire.Data.Social.APActivity) do\n Ecto.Migration.add :json, :jsonb\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_apactivity_table, do: make_apactivity_table([])\n defmacro create_apactivity_table([do: body]), do: make_apactivity_table(body)\n\n def drop_apactivity_table(), do: drop_pointable_table(APActivity)\n\n defp maa(:up), do: make_apactivity_table([])\n defp maa(:down) do\n quote do: Bonfire.Data.Social.APActivity.Migration.drop_apactivity_table()\n end\n\n defmacro migrate_apactivity() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(maa(:up)),\n else: unquote(maa(:down))\n end\n end\n\nend\n```\n\nAs you can see, this `Pointable` migration a little trickier to define than a `Virtual` because we wanted to preserve the ability for the user to define extra fields in config. There are some questions about how useful this is in practice, so you could also go for a simpler option:\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Greeting do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def up() do\n create_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\") do\n add :greeting, :text, null: false\n end\n end\n\n def down() do\n drop_pointable_table(:greeting, \"GREET1NGSFR0MD0CEXAMP1E000\")\n end\nend\n```\n\n> As you can see, it's pretty similar to defining a regular migration, except you use `create_pointable_table` and\n`drop_pointable_table`. Notice that our sentinel UID makes an appearance again here. It's *very* important that these match what we declared in the schema.","ref":"Needle.html#pointables"},{"type":"extras","title":"Mixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Mixins look much like pointables:\n\n```elixir\ndefmodule Bonfire.Data.Social.Profile.Migration do\n\n import Needle.Migration\n alias Bonfire.Data.Social.Profile\n\n # create_profile_table/{0,1}\n\n defp make_profile_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.Profile) do\n Ecto.Migration.add :name, :text\n Ecto.Migration.add :summary, :text\n Ecto.Migration.add :website, :text\n Ecto.Migration.add :location, :text\n Ecto.Migration.add :icon_id, strong_pointer(Bonfire.Files.Media)\n Ecto.Migration.add :image_id, strong_pointer(Bonfire.Files.Media)\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_profile_table(), do: make_profile_table([])\n defmacro create_profile_table([do: {_, _, body}]), do: make_profile_table(body)\n\n # drop_profile_table/0\n\n def drop_profile_table(), do: drop_mixin_table(Profile)\n\n # migrate_profile/{0,1}\n\n defp mp(:up), do: make_profile_table([])\n\n defp mp(:down) do\n quote do\n Bonfire.Data.Social.Profile.Migration.drop_profile_table()\n end\n end\n\n defmacro migrate_profile() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mp(:up)),\n else: unquote(mp(:down))\n end\n end\n\nend\n```","ref":"Needle.html#mixins"},{"type":"extras","title":"Multimixins - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Similar to mixins:\n\n```elixir\ndefmodule Bonfire.Data.Social.FeedPublish.Migration do\n\n import Ecto.Migration\n import Needle.Migration\n alias Bonfire.Data.Social.FeedPublish\n\n @feed_publish_table FeedPublish.__schema__(:source)\n\n # create_feed_publish_table/{0,1}\n\n defp make_feed_publish_table(exprs) do\n quote do\n require Needle.Migration\n Needle.Migration.create_mixin_table(Bonfire.Data.Social.FeedPublish) do\n Ecto.Migration.add :feed_id,\n Needle.Migration.strong_pointer(), primary_key: true\n unquote_splicing(exprs)\n end\n end\n end\n\n defmacro create_feed_publish_table(), do: make_feed_publish_table([])\n defmacro create_feed_publish_table([do: {_, _, body}]), do: make_feed_publish_table(body)\n\n def drop_feed_publish_table(), do: drop_pointable_table(FeedPublish)\n\n def migrate_feed_publish_feed_index(dir \\\\ direction(), opts \\\\ [])\n def migrate_feed_publish_feed_index(:up, opts),\n do: create_if_not_exists(index(@feed_publish_table, [:feed_id], opts))\n def migrate_feed_publish_feed_index(:down, opts),\n do: drop_if_exists(index(@feed_publish_table, [:feed_id], opts))\n\n defp mf(:up) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.create_feed_publish_table()\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n end\n end\n\n defp mf(:down) do\n quote do\n Bonfire.Data.Social.FeedPublish.Migration.migrate_feed_publish_feed_index()\n Bonfire.Data.Social.FeedPublish.Migration.drop_feed_publish_table()\n end\n end\n\n defmacro migrate_feed_publish() do\n quote do\n if Ecto.Migration.direction() == :up,\n do: unquote(mf(:up)),\n else: unquote(mf(:down))\n end\n end\n\n defmacro migrate_feed_publish(dir), do: mf(dir)\n\nend\n```","ref":"Needle.html#multimixins"},{"type":"extras","title":"More examples - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Take a look at a few of the migrations in our data libraries. Between them, they cover most\nscenarios by now:\n\n* [bonfire_data_social](https://github.com/bonfire-networks/bonfire_data_social/)\n* [bonfire_data_access_control](https://github.com/bonfire-networks/bonfire_data_access_control/)\n* [bonfire_data_identity](https://github.com/bonfire-networks/bonfire_data_identity/)\n* [bonfire_data_edges](https://github.com/bonfire-networks/bonfire_data_edges/) (feat. bonus triggers)\n\nIf you want to know exactly what's happening, you may want to read the code for\n[Needle.Migration](https://github.com/bonfire-networks/needle/blob/main/lib/migration.ex).","ref":"Needle.html#more-examples"},{"type":"extras","title":"Configuration and overrides - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Every pointable or mixin schema is overrideable with configuration\nduring compilation (this is why using them requires an `:otp_app` to\nbe specified). For example, we could override `Needle.Table` (which\nis a pointable table) thus:\n\n```elixir\nconfig :needle, Needle.Table, source: \"my_pointers_table\"\n```\n\nThe `table_id` is also configurable, but we don't recommend you change it.\n\nIn addition, all pointable and mixin schemas permit extension with [Exto](https://github.com/bonfire-networks/exto). See the `Exto`'s docs for more information about how to extend schemas via configuration. You will probably at the very least want to insert some `has_one` for mixins off your pointables.","ref":"Needle.html#configuration-and-overrides"},{"type":"extras","title":"Referencing Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Ecto does not know anything about our scheme, so unless we specifically want something to reference one of the pointed tables, we typically `belongs_to` with `Needle.Pointer`. The table in which we do this does not itself need to necessarily be a `Pointable`.\n\n```elixir\ndefmodule MyApp.Foo do\n\n use Ecto.Schema\n\n # regular ecto table, not pointable!\n schema \"hello\" do\n belongs_to :pointer, Needle.Pointer # who knows what it points to?\n end\nend\n```\n\nYou may choose to reference a specific schema rather than Pointer if it\nwill only point to a single table. If you do this, you must ensure\nthat the referenced record exists in that table in the normal\nway. There may be some performance benefit, we didn't benchmark it.\n\nThe migration is slightly more complex, we have to decide what type of\na pointer it is. Needle come in three categories:\n\n* A strong pointer is not nullable and is deleted when the object it\n points to is deleted.\n* A weak pointer is nullable and is nilified when the object it points\n to is deleted.\n* An unbreakable pointer will raise when you attempt to delete the\n object it points to.\n\n| Type | Nullable? | On Delete |\n|-------------|-----------|-------------|\n| Strong | No | Cascade |\n| Weak | Yes | Set Null |\n| Unbreakable | No | Raise |\n\nIn this case we will use a strong pointer, because we want it to be\ndeleted if the pointed object is deleted.\n\n```elixir\ndefmodule MyApp.Repo.Migrations.Hello do\n @moduledoc false\n use Ecto.Migration\n import Needle.Migration\n\n def change() do\n create_if_not_exists table(:hello) do\n add :pointer, strong_pointer(), null: false\n add :greeting, :text, null: false\n end\n end\nend\n```\n\nIf you are pointing to a specific table instead of pointer,\n`strong_pointer/1` allows you to pass the name of that module\n(`strong_pointer/0` calls this with `Needle.Pointer`).","ref":"Needle.html#referencing-pointables"},{"type":"extras","title":"Dereferencing Pointables - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"It is common that even though you have a universal foreign key, you\nwill want to issue different queries based upon the type that is being\npointed to. For this reason, it is up to you to decide how to perform\nan onward query.\n\n`Needle.Pointers.schema/1` turns a `Pointer` into an Ecto schema module name\nyou can switch against. `Needle.Pointers.plan` breaks down a list of Needle\ninto a map of ids keyed by schema module. It is handy to define some\nfunctions in your (non-library) application that can load any type of\npointer in given contexts.","ref":"Needle.html#dereferencing-pointables"},{"type":"extras","title":"Inserting data - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"","ref":"Needle.html#inserting-data"},{"type":"extras","title":"Elixir-based logic - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"The practical result of needle is that it pushes a certain amount of\nvalidation and consistency logic back into elixir land. It is\ntherefore your elixir code's responsibility to ensure that data is\ninserted into the appropriate mixin tables when inserting a pointable\nobject and to manage deletions as appropriate.\n\nWhen assembling queries with mixin tables, pay careful attention to\nthe type of join you are performing. An inner join is explicitly\nasking not to be shown objects that do not have a record for that\nmixin. You quite possibly wanted to left join.","ref":"Needle.html#elixir-based-logic"},{"type":"extras","title":"Querying Needle - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Since `Pointer` has a table, you can use its `table_id` field to\nfilter by pointed type. `Needle.Tables.id!/1` (or `ids!/1` for a\nlist) can be used to obtain the IDs for a table or tables.","ref":"Needle.html#querying-needle"},{"type":"extras","title":"Tradeoffs - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"All solutions to the universal primary key problem have tradeofs. Here\nare what we see as the deficiencies in our approach:\n\n1. It forces a UUIDv7 or ULID on you. This is great for us, but not\n everyone. They both expose a timestamp with millisecond precision. \n If the time of creation of a resource is sensitive information for\n your purposes, they may not going to be suitable for you.\n2. Ecto has no knowledge of the specialty of `Pointer`,\n e.g. `Repo.preload` does not work and you need to specify a join\n condition to join through a pointer. Use our functions or add extra\n associations with exto configuration.\n3. Dereferencing a list of needle requires a select query per table\n type that occurs in the input set.\n4. Reliance on user attention. You have to follow the instructions\n correctly to make the system work at all.\n5. There is likely some performance impact from postgres not\n understanding the relationships between the various tables\n properly. It's hard to gauge and we haven't even tried.\n\nThese are not likely to change. If you're going to pick\nthis library, do so in the full knowledge of the tradeoffs it makes.\n\nAlternatives include (I'm sure you can think of others):\n\n* Storing the table name in a second column alongside every foreign key.\n* A compound datatype of id and table name.\n* Byte/String manipulation tricks.\n* Evil SQL hacks based upon compile time configuration.\n\nWhile we have our gripes with this approach, once you've gotten the\nhang of using it, it works out pretty well for most purposes and it's\none of the simpler options to work with.","ref":"Needle.html#tradeoffs"},{"type":"extras","title":"Copyright and License - Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","doc":"Copyright (c) 2020 needle Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Needle.html#copyright-and-license"},{"type":"extras","title":"Email Delivery in Bonfire","doc":"# Email Delivery in Bonfire\n\nEmail delivery is a crucial component of many web applications, including your Bonfire instance. It's used for various purposes such as:\n\n- Sending signup confirmation emails\n- Delivering password reset links\n- Notifying users of new messages or activities\n- Sending alerts to administrators or moderators\n\nTo set up email delivery for your Bonfire instance, you'll need to choose an email delivery method and configure it properly. This guide will help you through that process.","ref":"Bonfire.Mailer.html"},{"type":"extras","title":"Before You Begin - Email Delivery in Bonfire","doc":"1. **Choose Email Delivery Method and/or Provider**: You may choose to sign up with one of the email service providers listed in this guide. Each provider has its own pricing, features, and delivery rates.\n\n2. **Domain Configuration**: To ensure reliable email delivery and avoid spam filters, you should configure your [email-related DNS settings](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance's domain name. This typically involves setting up:\n - MX (Mail Exchanger) records\n - SPF (Sender Policy Framework) records\n - DKIM (DomainKeys Identified Mail) records\n - DMARC (Domain-based Message Authentication, Reporting, and Conformance) records\n\nYour chosen email provider should provide instructions on how to set these up for your domain.\n\n3. **Environment Variables**: Bonfire uses environment variables for configuration. You'll need to set these variables in your deployment environment or in a `.env` file if you're running Bonfire locally or using Co-op Cloud.\n\nFor all email delivery methods, you'll need to set the following environment variables:\n\n- `MAIL_BACKEND` environment variable to choose your email delivery method or provider. \n- `MAIL_DOMAIN` or `HOSTNAME`: Your domain name\n- `MAIL_FROM`: The email address from which emails will be sent (this should match the domain name you set up with SPF/DKIM/DMARC, which will usually be your instance's domain)","ref":"Bonfire.Mailer.html#before-you-begin"},{"type":"extras","title":"Choosing an Email Delivery Method - Email Delivery in Bonfire","doc":"","ref":"Bonfire.Mailer.html#choosing-an-email-delivery-method"},{"type":"extras","title":"1. Default Behaviour: Direct SMTP Delivery - Email Delivery in Bonfire","doc":"If no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers. Here's what you need to know about this default behaviour:\n\n- **What it means**: Your server will try to connect directly to the recipient's email server (e.g. a provider such as Gmail or an organisation's own mail server) to deliver the email.\n\n- **Pros**: It requires no additional configuration and can work for basic setups.\n\n- **Cons**: This method is often unreliable and prone to several issues:\n 1. **Spam Filters**: Emails sent this way are more likely to be marked as spam or rejected entirely.\n 2. **Deliverability**: Many recipient servers may flat-out reject IP addresses not properly set up for email sending.\n 3. **DNS Configuration**: Without proper DNS records (SPF, DKIM, DMARK, etc.), your emails are more likely to be treated as suspicious.\n 4. **IP Reputation**: If your server's IP address isn't established as a legitimate email sender, deliverability will suffer.\n\n- **Important**: While this default method can work for testing or in very small-scale scenarios, it is strongly recommended to configure a proper email delivery service for any production use of Bonfire. If you want to try this method anyway, make sure to configure [SPF, DKIM, DMARK, etc.](https://www.cloudflare.com/en-gb/learning/email-security/dmarc-dkim-spf/) for your instance domain name and IP address.","ref":"Bonfire.Mailer.html#1-default-behaviour-direct-smtp-delivery"},{"type":"extras","title":"2. Managed Email Service Providers - Email Delivery in Bonfire","doc":"These providers offer comprehensive email delivery services, usually featuring analytics, bounce handling, high deliverability rates, etc.\n\n> Note: the information about free tiers and pricing are only meant to serve as a rough indication of the options available and may be outdated or inaccurate (we'd welcome PRs with any updates of course). Please check with each provider's website for more details.\n\n\n#### Brevo (formerly Sendinblue)\n- Website: [brevo.com](https://www.brevo.com/)\n- Free Tier: 300 emails per day, then $15+/month or pay-as-you-go ($59 per 10,000 emails) \n```\nMAIL_BACKEND=brevo\nMAIL_KEY=your_brevo_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailjet\n- Website: [mailjet.com](https://www.mailjet.com/)\n- Free Tier: 200 emails per day, then $17+/month\n```\nMAIL_BACKEND=mailjet\nMAIL_KEY=your_mailjet_api_key\nMAIL_PRIVATE_KEY=your_mailjet_secret_key\nMAIL_FROM=email@instance.domain\n```\n\n#### SMTP2GO\n- Website: [smtp2go.com](https://www.smtp2go.com/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $10+/month\n```\nMAIL_BACKEND=SMTP2GO\nMAIL_KEY=your_smtp2go_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailtrap \n- Website: [mailtrap.io](https://mailtrap.io/)\n- Free Tier: 200 emails per day (up to 1,000 emails per month), then $15+/month\n```\nMAIL_BACKEND=mailtrap\nMAIL_KEY=your_mailtrap_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mailgun\n- Website: [www.mailgun.com](https://www.mailgun.com/)\n- Free Tier: 100 emails per day, then $15+/month\n```\nMAIL_BACKEND=mailgun\nMAIL_KEY=your_mailgun_api_key\nMAIL_BASE_URI=https://api.eu.mailgun.net/v3\nMAIL_FROM=email@instance.domain\n```\nNote: The `MAIL_BASE_URI` depends on your Mailgun registration region. The default is set to EU, adjust if necessary.\n\n#### Twilio SendGrid \n- Website: [sendgrid.com](https://sendgrid.com/)\n- Free Tier: 100 emails per day, then $20+/month\n```\nMAIL_BACKEND=sendgrid\nMAIL_KEY=your_sendgrid_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Postmark\n- Website: [postmarkapp.com](https://postmarkapp.com/)\n- Free Tier: 100 emails per month, then $15+/month\n```\nMAIL_BACKEND=postmark\nMAIL_KEY=your_postmark_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Zoho ZeptoMail\n- Website: [zoho.com](https://www.zoho.com/zeptomail/)\n- First 10,000 emails are free, then €2,50 per 10,000 emails\n```\nMAIL_BACKEND=zepto\nMAIL_KEY=your_zeptomail_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Scaleway\n- Website: [scaleway.com](https://www.scaleway.com/en/transactional-email-tem/)\n- No free tier, pay-as-you-go pricing (€2.50 per 10,000 emails)\n```\nMAIL_BACKEND=scaleway\nMAIL_KEY=your_scaleway_api_key\nMAIL_PROJECT_ID=your_scaleway_project_id\nMAIL_PRIVATE_KEY=your_scaleway_secret_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Gmail\n- Website: [gmail.com](https://developers.google.com/gmail/api)\n- Free Tier: 500 emails per day\n```\nMAIL_BACKEND=gmail\nMAIL_KEY=your_gmail_api_key \nMAIL_FROM=email@instance.domain\n# ^ OAuth2 access token with `gmail.compose` scope\n```\nNote: Using Gmail for sending application email is generally not recommended for production use.\n\n#### MailPace\n- Website: [mailpace.com](https://mailpace.com/)\n- No free tier, starts at £2.50 per month for up to 1,000 emails\n```\nMAIL_BACKEND=mailpace\nMAIL_KEY=your_mailpace_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Mandrill (Mailchimp Transactional)\n- Website: [mailchimp.com](https://mailchimp.com/features/transactional-email/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=mandrill\nMAIL_KEY=your_mandrill_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Bird / SparkPost\n- Website: [bird.com](https://bird.com/api/email)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=sparkpost\nMAIL_KEY=your_sparkpost_api_key\nMAIL_BASE_URI=https://api.eu.sparkpost.com\nMAIL_FROM=email@instance.domain\n```\nNote: The `MAIL_BASE_URI` depends on your SparkPost registration region. The default is set to EU, adjust if necessary.\n\n#### Sendcloud (China)\n- Website: [sendcloud.net](https://www.sendcloud.net/)\n- Free Tier: 10 emails per day\n```\nMAIL_BACKEND=sendcloud\nMAIL_KEY=your_sendcloud_api_key\nMAIL_USER=your_sendcloud_api_user\nMAIL_FROM=email@instance.domain\n```\n\n#### SocketLabs\n- Website: [socketlabs.com](https://www.socketlabs.com/)\n- No free tier\n```\nMAIL_BACKEND=socketlabs\nMAIL_KEY=your_socketlabs_api_key\nMAIL_SERVER=your_socketlabs_server_id\nMAIL_PRIVATE_KEY=your_socketlabs_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Campaign Monitor\n- Website: [campaignmonitor.com](https://www.campaignmonitor.com/)\n- No free tier, pay-as-you-go pricing\n```\nMAIL_BACKEND=campaign_monitor\nMAIL_KEY=your_campaign_monitor_api_key\nMAIL_FROM=email@instance.domain\n```\n\n#### Amazon AWS SES\n- Website: [aws.amazon.com](https://aws.amazon.com/ses/)\n- Free Tier: 3,000 message / month (only for the first 12 months, and extra AWS charges may still apply)\n\nAmazon SES can be configured in two ways:\n\n1. Using existing AWS credentials (if already configured for S3 file storage, you can simplify configuration and use the same AWS credentials for both file storage and email delivery):\n```\nMAIL_BACKEND=aws\nMAIL_FROM=email@instance.domain\n```\nNote: This method will automatically use the credentials set by `UPLOADS_S3_ACCESS_KEY_ID` and `UPLOADS_S3_SECRET_ACCESS_KEY`. No additional configuration is needed if these are already set up for a Bonfire extension (such as `Bonfire.Files`) which uses S3 file storage.\n\n2. Using dedicated credentials, if you don't use AWS for S3 file storage or you want to use different AWS accounts for file storage and email delivery:\n```\nMAIL_BACKEND=aws\nMAIL_KEY=your_aws_access_key_id\nMAIL_PRIVATE_KEY=your_aws_secret_access_key\nMAIL_REGION=your_aws_region\nMAIL_FROM=email@instance.domain\n```\n\nNote: \n- If not specified, `MAIL_REGION` defaults to \"eu-west-1\".","ref":"Bonfire.Mailer.html#2-managed-email-service-providers"},{"type":"extras","title":"3. Direct Email Sending Methods - Email Delivery in Bonfire","doc":"These methods involve sending emails directly or through your own mail server. They require more setup and maintenance but offer more control.\n\n#### Default: Direct SMTP Delivery\n- When no specific email configuration is set, Bonfire will attempt to deliver emails directly to the recipients' SMTP servers.\n- No additional configuration is needed as this is the default behaviour, but it's not recommended for production use due to deliverability issues ([see above](#module-default-behaviour-direct-smtp-delivery)).\n\n#### SMTP\nSMTP (Simple Mail Transfer Protocol) is the standard method for sending emails across the internet. It's like the postal service for digital messages, ensuring your emails reach their destination regardless of the systems involved. While many opt for using a dedicated email delivery provider (see above), if you already run your own email server or use a provider that's not listed above which provides you with SMTP credentials, you can configure Bonfire to use that:\n\n```\nMAIL_BACKEND=smtp\nMAIL_SERVER=your_smtp_server\nMAIL_PORT=587\nMAIL_USER=your_smtp_username\nMAIL_PASSWORD=your_smtp_password\nMAIL_FROM=email@instance.domain\n```\n\nNotes: \n- `MAIL_PORT` defaults to 587 if not specified.\n\n#### Sendmail\n- Built into many Unix-like operating systems\n```\nMAIL_BACKEND=sendmail\nMAIL_SERVER=/path/to/sendmail\n# MAIL_ARGS=\nMAIL_QMAIL=true_or_false\nMAIL_FROM=email@instance.domain\n```\n\nNotes: \n- `MAIL_SERVER` defaults to `/usr/bin/sendmail` if not specified.\n- `MAIL_ARGS` defaults to `-N delay,failure,success` if not specified.\n- While sendmail can send mail directly (similar to the default behaviour), it can be set up to hand off emails to a local or remote SMTP server for delivery.\n- Using sendmail usually provides more control and logging capabilities compared to the default direct SMTP delivery.\n\n#### Postal\n- Self-hosted email delivery platform\n- Website: [postalserver.io](https://docs.postalserver.io)\n```\nMAIL_BACKEND=postal\nMAIL_KEY=your_postal_api_key\nMAIL_BASE_URI=https://your_postal_server_api.uri/\nMAIL_FROM=email@instance.domain\n```","ref":"Bonfire.Mailer.html#3-direct-email-sending-methods"},{"type":"extras","title":"Copyright and License - Email Delivery in Bonfire","doc":"Copyright (c) 2024 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Mailer.html#copyright-and-license"},{"type":"extras","title":"Boundaries for Access Control","doc":"# Boundaries for Access Control\n\nBonfire's boundaries framework provides a flexible way to control user access to specific actions and data. It ensures that users can only see and do what they're authorized to.\n\nYou can create custom groups of contacts (circles) and grant them specific permissions to interact with you and your content. They can help you take control of your online presence and ensure that your data is shared only with the people you want.\n\n> Boundaries are limits that you set for yourself or others to define what you're comfortable with.\n> These limits can be physical, like curtains or doors; digital, like sharing settings on social media; in writing, like codes of conduct; emotional, like feeling comfortable to take time for self-care; or mental, like choosing what you pay attention to. In Bonfire, boundaries can help limit the type of interactions that others may have with you or things you post.\n> Boundaries are important because they help you protect yourself, maintain your autonomy, and communicate your needs and expectations clearly.","ref":"Bonfire.Boundaries.html"},{"type":"extras","title":"Glossary - Boundaries for Access Control","doc":"| Term | Definition |\n| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **Subject** or **User** | An individual who interacts with the system. |\n| **[Circle](Bonfire.Boundaries.Circles.html)** | A categorization method for users, allowing users to group other users (e.g., colleagues, friends). |\n| **[Verb](Bonfire.Boundaries.Verbs.html)** | An action that a user can perform (e.g., read, reply). |\n| **Permission** | A value indicating whether an action is allowed (`true`), denied (`false`), or `nil`. |\n| **[Grant](Bonfire.Boundaries.Grants.html)** | Links a user or circle with a verb and permission. |\n| **[ACL](Bonfire.Boundaries.Acls.html)** | Access Control List, a collection of grants. Also called \"boundary\" or \"boundary preset\" in the app. |\n| **[Controlled](Bonfire.Boundaries.Controlleds.html)** | Links an object to one or more ACLs, to determine access based on the grants. |\n| **[Role](Bonfire.Boundaries.Roles.html)** | A group of verbs linked to a permission. |","ref":"Bonfire.Boundaries.html#glossary"},{"type":"extras","title":"Users and Circles - Boundaries for Access Control","doc":"Circles are a way of categorizing users. Each user can have their own set of circles to categorize other users. Circles allow a user to group work colleagues differently from friends for example, and to allow different interactions for users in each circle or limit content visibility on a per-item basis.","ref":"Bonfire.Boundaries.html#users-and-circles"},{"type":"extras","title":"Verbs - Boundaries for Access Control","doc":"Verbs represent actions users can perform, such as reading a post or replying to a message. Each verb has a unique ID and are defined in configuration.","ref":"Bonfire.Boundaries.html#verbs"},{"type":"extras","title":"Permissions - Boundaries for Access Control","doc":"A permission is a decision about whether the action may be performed or not. There are 3 possible values:\n\n- `true`: yes, the action is allowed\n- `false`: no, the action is explicitly denied (i.e. never permit)\n- `null`/`nil`: unknown, the action isn't explicitly allowed (defaults to not allowed)","ref":"Bonfire.Boundaries.html#permissions"},{"type":"extras","title":"Grants - Boundaries for Access Control","doc":"A `Grant` links a `subject` (user or circle) with a `Verb` and a permission. It defines the access rights for a specific user or circle in relation to a particular action.","ref":"Bonfire.Boundaries.html#grants"},{"type":"extras","title":"ACLs - Boundaries for Access Control","doc":"An `Acl` is a list of `Grant`s used to define access permissions for objects.\n\nBecause a user could be in more than one circle and each circle may have a different permission, when a user attempts an action on an object, the system combines all relevant grants to determine the final permission. This combination prioritizes permissions as follows: `false > true > nil`, resulting in:\n\n| input | input | result |\n| :------ | :------ | :------ |\n| `nil` | `nil` | `nil` |\n| `nil` | `true` | `true` |\n| `nil` | `false` | `false` |\n| `true` | `nil` | `true` |\n| `true` | `true` | `true` |\n| `true` | `false` | `false` |\n| `false` | `nil` | `false` |\n| `false` | `true` | `false` |\n| `false` | `false` | `false` |\n\nIn simpler terms, a final permission is granted only if the combined result is `true`. Think of it as requiring an explicit \"yes\" for permission, while \"no\" always takes precedence. Notably, `nil` acts as a sort of \"weak no,\" it can be overridden by a `true` but not granting access on its own. This approach provides flexibility for implementing features like user blocking (`false` is crucial here).\n\nFor efficiency, `nil` is the assumed default and not stored in the database.","ref":"Bonfire.Boundaries.html#acls"},{"type":"extras","title":"Controlled - Applying boundaries to an object - Boundaries for Access Control","doc":"The `Controlled` [multimixin](./DATABASE.md#multimixins) link an object to one or more ACLs. This allows for applying multiple boundaries to the same object. In case of overlapping permissions, the system combines them following the logic described above.","ref":"Bonfire.Boundaries.html#controlled-applying-boundaries-to-an-object"},{"type":"extras","title":"Roles - Boundaries for Access Control","doc":"Roles are groups of verbs associated with permissions. While not stored in the database, they are defined at the configuration level to enhance readability and user experience.","ref":"Bonfire.Boundaries.html#roles"},{"type":"extras","title":"Practical example: Surprise birthday party - Boundaries for Access Control","doc":"Let's illustrate how boundaries work with a real-world example: planning a surprise party without the birthday girl finding out.","ref":"Bonfire.Boundaries.html#practical-example-surprise-birthday-party"},{"type":"extras","title":"1. Setting up users - Boundaries for Access Control","doc":"```elixir\niex> import Bonfire.Me.Fake\niex> organizer = fake_user!()\niex> birthday_girl = fake_user!()\niex> friends = [fake_user!(), fake_user!()]\niex> family = [fake_user!(), fake_user!()]\n```","ref":"Bonfire.Boundaries.html#1-setting-up-users"},{"type":"extras","title":"2. Define your Circles - Boundaries for Access Control","doc":"Organize users into relevant circles (friends and family).\n\n```elixir\niex> alias Bonfire.Boundaries.Circles\niex> {:ok, friends_circle} = Circles.create(organizer, %{named: %{name: \"friends\"}})\niex> Circles.add_to_circles(friends, friends_circle)\niex> Circles.is_encircled_by?(List.first(friends), friends_circle)\ntrue\niex> {:ok, family_circle} = Circles.create(organizer, %{named: %{name: \"family\"}})\niex> Circles.add_to_circles(family, family_circle)\n```","ref":"Bonfire.Boundaries.html#2-define-your-circles"},{"type":"extras","title":"3. Create the ACL (boundary preset) - Boundaries for Access Control","doc":"This boundary will control access to the surprise party plans.\n\n```elixir\niex> alias Bonfire.Boundaries.Acls\niex> {:ok, boundary} = Acls.simple_create(organizer, \"Surprise party\")\n```","ref":"Bonfire.Boundaries.html#3-create-the-acl-boundary-preset"},{"type":"extras","title":"4. Grant permissions - Boundaries for Access Control","doc":"Allow friends to discover, read, and respond to party plans, while family members can also edit details and send invitations.\n\n```elixir\niex> alias Bonfire.Boundaries.Grants\niex> Grants.grant(friends_circle.id, boundary.id, [:see, :read, :reply], true, current_user: organizer)\niex> Grants.grant(family_circle.id, boundary.id, [:see, :read, :reply, :edit, :invite], true, current_user: organizer)\n```\n\nPrevent the birthday person from accessing any party information.\n\n```elixir\niex> Grants.grant(birthday_girl.id, boundary.id, [:see, :read], false, current_user: organizer)\n```","ref":"Bonfire.Boundaries.html#4-grant-permissions"},{"type":"extras","title":"5. Post about the party - Boundaries for Access Control","doc":"```elixir\niex> alias Bonfire.Posts\niex> {:ok, party_plan} = Posts.publish(\n current_user: organizer,\n boundary: boundary.id,\n post_attrs: %{post_content: %{name: \"Surprise party!\"}})\n```","ref":"Bonfire.Boundaries.html#5-post-about-the-party"},{"type":"extras","title":"6. Double-check applied boundaries - Boundaries for Access Control","doc":"```elixir\niex> Boundaries.can?(List.first(friends).id, :read, party_plan.id)\ntrue\niex> Boundaries.can?(List.first(family).id, :invite, party_plan.id)\ntrue\niex> Boundaries.can?(birthday_girl.id, :see, party_plan.id)\nfalse\niex> Boundaries.load_pointer(party_plan.id, current_user: birthday_girl)\nnil\n```\n\nBy following these steps, the organizer can effectively manage access to ensure the birthday girl cannot see the party plans, while friends and family can.","ref":"Bonfire.Boundaries.html#6-double-check-applied-boundaries"},{"type":"extras","title":"Copyright and License - Boundaries for Access Control","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Boundaries.html#copyright-and-license"},{"type":"extras","title":"Bonfire.API.GraphQL","doc":"# Bonfire.API.GraphQL","ref":"Bonfire.API.Graphql.html"},{"type":"extras","title":"GraphQL Introduction - Bonfire.API.GraphQL","doc":"Go to http://your-instance-url/api/ to start playing with the GraphQL API. The GraphiQL UI should autocomplete types, queries and mutations for you, and you can also explore the schema there.\n\nLet's start with a simple GraphQL thoeretical query:\n\n```graphql\nquery {\n greetings(limit: 10) {\n greeting\n to {\n name\n }\n }\n}\n```\n\nLet's break this apart:\n\n- `query {}` is how you retrieve information from GraphQL.\n- `greetings` is a `field` within the query.\n- `greetings` takes a `limit` argument, a positive integer.\n- `greetings` has two fields, `greeting` and `to`.\n- `to` has one `field`, `name`.\n\nThis query is asking for a list of (up to) 10 greetings and the people\nthey are for. Notice that the result of both `greetings` and `to` are\nmap/object structures with their own fields and that if the type has\nmultiple fields, we can select more than one field.\n\nHere is some possible data we could get returned\n\n```elixir\n%{greetings: [\n %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]}\n```\n\nWhere is the magic? Typically an object type will reside in its own\ntable in the database, so this query is actually querying two tables\nin one go. In fact, given a supporting schema, you can nest queries\narbitrarily and the backend will figure out how to run them.\n\nThe fact that you can represent arbitrarily complex queries puts quite\na lot of pressure on the backend to make it all efficient. This is\nstill a work in progress at this time.","ref":"Bonfire.API.Graphql.html#graphql-introduction"},{"type":"extras","title":"Absinthe Introduction - Bonfire.API.GraphQL","doc":"Every `field` is filled by a resolver. Let's take our existing query\nand define a schema for it in Absinthe's query DSL:\n\n```elixir\ndefmodule MyApp.Schema do\n # the schema macro language\n use Absinthe.Schema.Notation\n # where we will actually resolve the fields\n alias MyApp.Resolver\n\n # Our user object is pretty simple, just a name\n object :user do\n field :name, non_null(:string)\n end\n\n # This one is slightly more complicated, we have that nested `to`\n object :greeting do\n # the easy one\n field :greeting, non_null(:string)\n # the hard one. `edge` is the term for when we cross an object boundary.\n field :to, non_null(:user), do: resolve(&Resolver.to_edge/3)\n end\n\n # something to put our top level queries in, because they're just fields too!\n object :queries do\n field :greetings, non_null(list_of(non_null(:string))) do\n arg :limit, :integer # optional\n resolve &Resolver.greetings/2 # we need to manually process this one\n end\n end\n\nend\n```\n\nThere are a couple of interesting things about this:\n\n- Sprinklings of `not_null` to require that values be present (if you\n don't return them, absinthe will get upset).\n- Only two fields have explicit resolvers. Anything else will default\n to a map key lookup (which is more often than not what you want).\n- `greeting.to_edge` has a `/3` resolver and `queries.greetings` a\n `/2` resolver.\n\nTo understand the last one (and partially the middle one), we must\nunderstand how resolution works and what a parent is. The best way of\ndoing that is probably to look at the resolver code:\n\n```elixir\ndefmodule MyApp.Resolver do\n\n # For purposes of this, we will just fake the data out\n defp greetings_data() do\n [ %{greeting: \"hello\", to: %{ name: \"dear reader\"}}, # english\n %{greeting: \"hallo\", to: %{ name: \"beste lezer\"}}, # dutch\n ]\n end\n\n # the /2 resolver takes only arguments (which in this case is just limit)\n # and an info (which we'll explain later)\n def greetings(%{limit: limit}, _info) when is_integer(limit) and limit > 0 do\n {:ok, Enum.take(greetings_data(), limit)} # absinthe expects an ok/error tuple\n end\n def greetings(_args, _info), do: {:ok, greetings_data()} # no limit\n\n # the /3 resolver takes an additional parent argument in first position.\n # `parent` here will be the `greeting` we are resolving `to` for.\n def to_edge(parent, args, info), do: Map.get(parent, :to)\n\nend\n```\n\nThe keen-eyed amongst you may have noticed I said the default resolver\nis a map lookup and our `to_edge/3` is a map lookup too, so\ntechnically we didn't need to write it. But then you wouldn't have an\nexample of a `/3` resolver! In most of the app, these will be querying\nfrom the database, not looking up in a constant.\n\nSo for every field, a resolver function is run. It defaults to a map\nlookup, but you can override it with `resolve/1`. It may or may not\nhave arguments. And all absinthe resolvers return an ok/error tuple.","ref":"Bonfire.API.Graphql.html#absinthe-introduction"},{"type":"extras","title":"Copyright and License - Bonfire.API.GraphQL","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.API.Graphql.html#copyright-and-license"},{"type":"extras","title":"Bonfire Community","doc":"# Bonfire Community \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.UI.Groups](https://github.com/bonfire-ecosystem/bonfire_ui_groups) - groups\n- [Bonfire.UI.Topics](https://github.com/bonfire-ecosystem/bonfire_ui_topics) - topics","ref":"blog.html"},{"type":"extras","title":"More information - Bonfire Community","doc":"See the [main docs](../../README.md).","ref":"blog.html#more-information"},{"type":"extras","title":"Bonfire Classic","doc":"# Bonfire Classic\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) ecosystem and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places","ref":"classic.html"},{"type":"extras","title":"More information - Bonfire Classic","doc":"See the [main docs](../../README.md).","ref":"classic.html#more-information"},{"type":"extras","title":"Bonfire Community","doc":"# Bonfire Community \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.UI.Groups](https://github.com/bonfire-ecosystem/bonfire_ui_groups) - groups\n- [Bonfire.UI.Topics](https://github.com/bonfire-ecosystem/bonfire_ui_topics) - topics","ref":"community.html"},{"type":"extras","title":"More information - Bonfire Community","doc":"See the [main docs](../../README.md).","ref":"community.html#more-information"},{"type":"extras","title":"Bonfire Cooperation","doc":"# Bonfire Cooperation \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire.Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire.ValueFlows.Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire.Breadpub](https://github.com/bonfire-networks/bonfire_breadpub) - needs & offers for mutual aid","ref":"cooperation.html"},{"type":"extras","title":"More information - Bonfire Cooperation","doc":"See the [main docs](../../README.md).","ref":"cooperation.html#more-information"},{"type":"extras","title":"Bonfire Coordination","doc":"# Bonfire Coordination \n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.UI.Coordination](https://github.com/bonfire-networks/bonfire_ui_coordinatio) - basic coordination UI for projects and communities\n- [Bonfire.UI.Kanban](https://github.com/bonfire-networks/bonfire_ui_kanban) - coordination tools with drag-and-drop card based UI","ref":"coordination.html"},{"type":"extras","title":"More information - Bonfire Coordination","doc":"See the [main docs](../../README.md).","ref":"coordination.html#more-information"},{"type":"extras","title":"Open Science Network","doc":"# Open Science Network\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) ecosystem and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- Etc...","ref":"open-science.html"},{"type":"extras","title":"More information - Open Science Network","doc":"See the [main docs](../../README.md).","ref":"open-science.html#more-information"},{"type":"extras","title":"Reflow","doc":"# Reflow\n\nThis app is part of the [Bonfire](https://bonfirenetworks.org/) and [ValueFlows](http://valueflo.ws/) ecosystems and bundles the following extensions:\n\n- [Bonfire.Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire.UI.Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire.Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire.Federate.ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire.Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire.Classify\n- [Bonfire.Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire.Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire.Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire.ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire.ValueFlows.Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire.API.GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire.UI.ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire.UI.Reflow](https://github.com/bonfire-networks/bonfire_ui_reflow) - frontend for the Reflow project","ref":"reflow.html"},{"type":"extras","title":"More information - Reflow","doc":"See the [main docs](../../README.md).","ref":"reflow.html#more-information"},{"type":"extras","title":"Upcycle","doc":"# Upcycle\n\nThis app is a flavour of [Bonfire](https://bonfirenetworks.org/) and bundles the following extensions:\n\n- [Bonfire:Common](https://github.com/bonfire-networks/bonfire_common) - common utils\n- [Bonfire:Me](https://github.com/bonfire-networks/bonfire_me) - accounts, user profiles...\n- [Bonfire:Social](https://github.com/bonfire-networks/bonfire_social) - feeds, activities, posts, boosting, flagging, etc...\n- [Bonfire:UI:Social](https://github.com/bonfire-ecosystem/bonfire_ui_social) - interface for basic social activities \n- [Bonfire:Boundaries](https://github.com/bonfire-networks/bonfire_boundaries) - define circles and associated privacy or permissions\n- [Bonfire:Federate:ActivityPub](https://github.com/bonfire-networks/bonfire_federate_activitypub) - federates activities with ActivityPub to participate in the fediverse\n- [Bonfire:Tag](https://github.com/bonfire-ecosystem/bonfire_tag) - @ mentions, hashtags, and tagging using topics/categories from Bonfire:Classify\n- [Bonfire:Classify](https://github.com/bonfire-ecosystem/bonfire_classify) - categories & classifications in taxonomies\n- [Bonfire:Geolocate](https://github.com/bonfire-ecosystem/bonfire_geolocate) - places\n- [Bonfire:Quantify](https://github.com/bonfire-ecosystem/bonfire_quantify) - units & measures\n- [Bonfire:ValueFlows](https://github.com/bonfire-ecosystem/bonfire_valueflows) - economic activities with ValueFlows\n- [Bonfire:ValueFlows:Observe](https://github.com/bonfire-ecosystem/bonfire_valueflows_observe) - observation of economic resources\n- [Bonfire:API:GraphQL](https://github.com/bonfire-ecosystem/bonfire_api_graphql) - a GraphQL client API\n- [Bonfire:UI:ValueFlows](https://github.com/bonfire-networks/bonfire_ui_valueflows) - reusable frontend components for economic activities \n- [Bonfire:UI:Coordination](https://github.com/bonfire-networks/bonfire_ui_valueflows) - basic coordination UI for projects and communities\n- [Bonfire:Kanban](https://github.com/bonfire-networks/bonfire_breadpub) - coordination tools with drag-and-drop card UI\n- [Bonfire:Breadpub](https://github.com/bonfire-networks/bonfire_breadpub) - needs & offers for mutual aid\n- [Bonfire:Files](https://github.com/bonfire-networks/bonfire_files) - file management for bonfire apps\n- [Bonfire:Data:SharedUser](https://github.com/bonfire-networks/bonfire_data_shared_user) - database models for shared users in the bonfire ecosystem\n- [Bonfire:Upcycle](https://gitlab.com/msoe.edu-public/sdl/y22sdl/upcycle/bonfire_upcycle/-/tree/master) - Upcycle UI","ref":"upcycle.html"},{"type":"extras","title":"More information - Upcycle","doc":"See the [main docs](../../README.md).","ref":"upcycle.html#more-information"},{"type":"extras","title":"Bonfire.Data.Assort","doc":"# Bonfire.Data.Assort\n\nVarious assorted database schemas for:\n- Ranked linked items\n- TODO: move schemas from bonfire_classify and bonfire_tag here?","ref":"Bonfire.Data.Assort.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Assort","doc":"Copyright (c) 2020 Bonfire Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Assort.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.AccessControl","doc":"# Bonfire.Data.AccessControl\n\nSee `Bonfire.Boundaries` for docs: https://github.com/bonfire-networks/bonfire_boundaries","ref":"Bonfire.Data.AccessControl.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.AccessControl","doc":"Copyright (c) 2020 James Laver, `bonfire_data_access_control` Contributors\n\nThis Source Code Form is subject to the terms of the Mozilla Public\nLicense, v. 2.0. If a copy of the MPL was not distributed with this\nfile, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.AccessControl.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.ActivityPub","doc":"# Bonfire.Data.ActivityPub\n\n\n\nActor schema.","ref":"Bonfire.Data.ActivityPub.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.ActivityPub","doc":"Copyright (c) 2020 James Laver, bonfire_data_activity_pub Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.ActivityPub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Identity","doc":"# Bonfire.Data.Identity\n\nSchemas for accounts, users, etc.","ref":"Bonfire.Data.Identity.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Identity","doc":"Copyright (c) 2020 James Laver, bonfire_data_identity Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Identity.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Social","doc":"# Bonfire.Data.Social\n\n\n\nSchemas for social activities, posts, feeds, etc","ref":"Bonfire.Data.Social.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.Social","doc":"Copyright (c) 2020 James Laver, bonfire_data_social Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Data.Edges","doc":"# Bonfire.Data.Edges","ref":"Bonfire.Data.Edges.html"},{"type":"extras","title":"Bonfire.Data.SharedUser","doc":"# Bonfire.Data.SharedUser","ref":"Bonfire.Data.SharedUser.html"},{"type":"extras","title":"Copyright and License - Bonfire.Data.SharedUser","doc":"Copyright (c) 2020 Bonfire Contributors\n \n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.","ref":"Bonfire.Data.SharedUser.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Common","doc":"# Bonfire.UI.Common\n\nA library of common utils and helpers used across Bonfire extensions\n\n- Many common functions for web UIs \n- Common and generic re-usable components\n- Etc","ref":"Bonfire.UI.Common.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Common","doc":"","ref":"Bonfire.UI.Common.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Common","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Common.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Me","doc":"# Bonfire.UI.Me\n![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Me](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) for functionality around accounts, users, profiles, authentication, etc.\n\nThis extension is meant to be used by other extensions like [Bonfire.Me](https://github.com/bonfire-networks/bonfire_me), which provide logic for the UI to work with.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Me.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Me.html"},{"type":"extras","title":"Stack - Bonfire.UI.Me","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Me.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Me","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_me/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Me.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Me","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Me.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Me","doc":"Copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Me.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Social","doc":"# Bonfire.UI.Social\n![](https://i.imgur.com/XoQvDCW.png)\n\n[Bonfire.UI.Social](http://bonfirenetworks.org/extensions/ui_social.html) is an extension that includes the main User Interfaces (routes, pages and components) required to have a fully working federated social network app.\n\nThis extension is meant to be used by other extensions like [Bonfire.Social](https://github.com/bonfire-networks/bonfire_social), which provides logic for the UI to work with/\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Social.html"},{"type":"extras","title":"Stack - Bonfire.UI.Social","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Social.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Social","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_social/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Social.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Social","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Social.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Social","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Social.Graph","doc":"# Bonfire.UI.Social.Graph\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Social.Graph` is an extension that includes some User Interfaces (routes, pages and components) for following and otherwise managing one's network in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.SocialGraph.html"},{"type":"extras","title":"Stack - Bonfire.UI.Social.Graph","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.SocialGraph.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Social.Graph","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_social_graph/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.SocialGraph.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Social.Graph","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.SocialGraph.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Social.Graph","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.SocialGraph.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Posts","doc":"# Bonfire.UI.Posts\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Posts` is an extension that includes some User Interfaces (routes, pages and components) for writing and reading posts in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Posts.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Posts.html"},{"type":"extras","title":"Stack - Bonfire.UI.Posts","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Posts.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Posts","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_posts/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Posts.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Posts","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Posts.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Posts","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Posts.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Messages","doc":"# Bonfire.UI.Messages\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Messages` is an extension that includes some User Interfaces (routes, pages and components) for messaging in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Messages.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Messages.html"},{"type":"extras","title":"Stack - Bonfire.UI.Messages","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Messages.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Messages","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_messages/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Messages.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Messages","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Messages.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Messages","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Messages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Reactions","doc":"# Bonfire.UI.Reactions\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Reactions` is an extension that includes some User Interfaces (routes, pages and components) for liking, boosting, pinning, bookmarking, etc, in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Reactions.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Reactions.html"},{"type":"extras","title":"Stack - Bonfire.UI.Reactions","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Reactions.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Reactions","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_reactions/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Reactions.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Reactions","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Reactions.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Reactions","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Reactions.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Moderation","doc":"# Bonfire.UI.Moderation\n![](https://i.imgur.com/XoQvDCW.png)\n\n`Bonfire.UI.Moderation` is an extension that includes some User Interfaces (routes, pages and components) for flagging content and moderation in Bonfire.\n\nYou can customise it by forking, but we recommend creating an extension which uses this one as a dependency, and defines your custom components, views, and/or routes (you can then comment `Bonfire.UI.Social.Routes` from your top-level Router to use your custom routes and views instead).","ref":"Bonfire.UI.Moderation.html"},{"type":"extras","title":"Stack - Bonfire.UI.Moderation","doc":"So far, Bonfire UI extensions are built with the PETALS stack (note that is not a requirement), which means:\n\n- [Phoenix](https://www.phoenixframework.org/)\n- [Elixir](https://elixir-lang.org/)\n- [TailwindCSS](https://tailwindcss.com/)\n- [Alpine.js](https://alpinejs.dev/)\n- [LiveView](https://github.com/phoenixframework/phoenix_live_view#readme)\n- [Surface](https://surface-ui.org/)\n\nSurface is a server-side rendering component library (built on top of Phoenix and LiveView) that inherits a lot of design patterns from popular JS framework like Vue.js and React, while being almost JavaScript-free compared to common SPAs.","ref":"Bonfire.UI.Moderation.html#stack"},{"type":"extras","title":"Scaffolding - Bonfire.UI.Moderation","doc":"The relevant folders are:\n- [Components](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/lib/components): Surface stateless and stateful components.\n- [Views](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/lib/views): The main pages that are rendered when navigating to a specific route\n- [Test](https://github.com/bonfire-networks/bonfire_ui_moderation/tree/main/test): All the unit tests for the specific module.","ref":"Bonfire.UI.Moderation.html#scaffolding"},{"type":"extras","title":"Other resources - Bonfire.UI.Moderation","doc":"- [A blog post that introduces the concept of themeable bonfire apps](https://bonfirenetworks.org/posts/let_thousand_bonfires_bloom/)","ref":"Bonfire.UI.Moderation.html#other-resources"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Moderation","doc":"Copyright (c) 2020 Bonfire, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Moderation.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Topics","doc":"# Bonfire.UI.Topics\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles UI for:\n\n- Browsing and using topics\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Topics.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Topics","doc":"","ref":"Bonfire.UI.Topics.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Topics","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Topics.html#copyright-and-license"},{"type":"extras","title":"Bonfire UI Groups","doc":"# Bonfire UI Groups\n\nPages and UI components for groups in Bonfire.\n\nIt builds upon the schemas and functionality in `Bonfire.Classify` and `Bonfire.Tag`.","ref":"Bonfire.UI.Groups.html"},{"type":"extras","title":"Roadmap - Bonfire UI Groups","doc":"[Group Milestone](https://github.com/bonfire-networks/bonfire-app/milestone/33)","ref":"Bonfire.UI.Groups.html#roadmap"},{"type":"extras","title":"Sponsors - Bonfire UI Groups","doc":"[Nlnet](https://nlnet.nl/project/Bonfire-FederatedGroups/index.html) | [Become a sponsor](https://opencollective.com/bonfire-networks)","ref":"Bonfire.UI.Groups.html#sponsors"},{"type":"extras","title":"📖 Documentation - Bonfire UI Groups","doc":"* [Website](https://bonfirenetworks.org) \n* [Set up an instance](docs/DEPLOY.md) - for testing and evaluation only!\n* [Hacking on Bonfire](docs/HACKING.md) \n* [Code documentation](https://doc.bonfirenetworks.org/api-reference.html#content) \n* [Community chat](https://matrix.to/#/%23bonfire-networks:matrix.org)","ref":"Bonfire.UI.Groups.html#documentation"},{"type":"extras","title":"Copyright and License - Bonfire UI Groups","doc":"Copyright (c) 2020-2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Groups.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.ValueFlows","doc":"# Bonfire.UI.ValueFlows\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Valueflows.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.ValueFlows","doc":"","ref":"Bonfire.UI.Valueflows.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.ValueFlows","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Valueflows.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Kanban","doc":"# Bonfire.UI.Kanban\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for a kanban app","ref":"Bonfire.UI.Kanban.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Kanban","doc":"","ref":"Bonfire.UI.Kanban.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Kanban","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Kanban.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Coordination","doc":"# Bonfire.UI.Coordination\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Coordination.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Coordination","doc":"","ref":"Bonfire.UI.Coordination.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Coordination","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Coordination.html#copyright-and-license"},{"type":"extras","title":"Bonfire.UI.Reflow","doc":"# Bonfire.UI.Reflow\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.UI.Reflow.html"},{"type":"extras","title":"Handy commands - Bonfire.UI.Reflow","doc":"","ref":"Bonfire.UI.Reflow.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.UI.Reflow","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.UI.Reflow.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Files","doc":"# Bonfire.Files\n\nFile management extension for Bonfire. \n\nBonfire Files wraps the `Entrepot` a file management library, \nadding support for media type checking, image resizing, and the like, \nalong with creating a [pointable][1] table for storage of file data.\n\n[1]: https://github.com/bonfire-networks/needle","ref":"Bonfire.Files.html"},{"type":"extras","title":"Configuration - Bonfire.Files","doc":"","ref":"Bonfire.Files.html#configuration"},{"type":"extras","title":"TODO's - Bonfire.Files","doc":"- Generate docs\n- More tests","ref":"Bonfire.Files.html#todo-s"},{"type":"extras","title":"Bonfire.Common","doc":"# Bonfire.Common\n\nA library of common utils and helpers used across Bonfire extensions.\n\nAn extension for [Bonfire](https://bonfire.cafe/) that contains:\n\n- Many common functions in `Bonfire.Common.Utils`\n- Path and URL generators in `Bonfire.Common.URIs`\n- Date and time helpers in `Bonfire.Common.DatesTimes`\n- Etc","ref":"Bonfire.Common.html"},{"type":"extras","title":"Handy commands - Bonfire.Common","doc":"","ref":"Bonfire.Common.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Common","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Common.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Epics","doc":"# Bonfire.Epics\n\nEpics are a extensible way of structuring tasks.\n\nThis library is designed to provide a structured way to define and execute complex workflows in Elixir applications. It introduces the concept of \"Epics\" and \"Acts\" to organize and run sequences of operations.","ref":"Bonfire.Epics.html"},{"type":"extras","title":"Key components and concepts: - Bonfire.Epics","doc":"- `Bonfire.Epics.Epic`: An Epic represents a complete workflow or process. It's a container that holds a sequence of Acts to be executed, along with state information, errors, and assigned values.\n- `Bonfire.Epics.Act`: An Act is an individual step or operation within an Epic. Each Act is typically a module that implements a specific task or functionality.\n- Execution Flow & Parallel Execution: Epics are executed by running their Acts in sequence. The library provides mechanisms to define, modify, and run these sequences. The library supports running multiple Acts in parallel for improved performance in certain scenarios.\n- Shared State: An Epic can maintain state throughout its execution using the 'assigns' map, allowing data to be passed between Acts.\n- Configurable: Epics can be defined in configuration, including at runtime, making it easy to set up and modify workflows without changing code.\n- Database Transactions: See the `Bonfire.Ecto` library for helpers to queue changeset operations within Acts and then run them all together in a single transaction: https://github.com/bonfire-networks/bonfire_ecto\n- Error Handling: The library includes built-in error handling, allowing errors to be captured and associated with specific Acts within an Epic.\n\nThis library is particularly useful for applications that need to manage complex, multi-step tasks with error handling and state management. It provides a flexible and extensible way to define, configure, and execute these processes, making it easier to maintain and modify complex workflows.","ref":"Bonfire.Epics.html#key-components-and-concepts"},{"type":"extras","title":"How it works - Bonfire.Epics","doc":"1. Each Act is implemented as a module with a `run/2` function that performs a specific task.\n2. Users define an Epic, either in code or configuration, as sequences of Acts.\n3. When the Epic is run, it executes each Act in sequence (or with some Acts optionally running in parallel), maintaining state and handling errors along the way. Acts can update the Epic's state, adding errors, and assigning values that can be used by subsequent Acts.\n4. After all Acts are executed, the final state of the Epic is returned, including any errors or assigned values.","ref":"Bonfire.Epics.html#how-it-works"},{"type":"extras","title":"1. How to write an Act - Bonfire.Epics","doc":"Write a module with a `run/2` function that takes an Epic and an Act, performs a specific task, and returns an Epic.\n\n```elixir\ndefmodule Bonfire.Label.Acts.LabelObject do\n @moduledoc \"\"\"\n Takes an object and label and returns a changeset for labeling that object. \n Implements `Bonfire.Epics.Act`.\n\n Epic Options:\n * `:current_user` - user that will create the page, required.\n\n Act Options:\n * `:as` - key to where we find the label(s) to add, and then assign changeset to, default: `:label`.\n * `:object` (configurable) - id to use for the thing to label\n * `:attrs` - epic options key to find the attributes at, default: `:attrs`.\n \"\"\"\n\n use Arrows\n import Bonfire.Epics\n\n @doc false\n def run(epic, act) do\n current_user = Bonfire.Common.Utils.current_user(epic.assigns[:options])\n\n cond do\n epic.errors != [] ->\n maybe_debug(\n epic,\n act,\n length(epic.errors),\n \"Skipping due to epic errors\"\n )\n\n epic\n\n not (is_struct(current_user) or is_binary(current_user)) ->\n maybe_debug(\n epic,\n act,\n current_user,\n \"Skipping due to missing current_user\"\n )\n\n epic\n\n true ->\n as = Keyword.get(act.options, :as) || Keyword.get(act.options, :on, :label)\n object_key = Keyword.get(act.options, :object, :object)\n\n label = Keyword.get(epic.assigns[:options], as, [])\n object = Keyword.get(epic.assigns[:options], object_key, nil)\n\n Bonfire.Label.Labelling.label_object(label, object,\n return: :changeset,\n current_user: current_user\n )\n |> Map.put(:action, :insert)\n |> Bonfire.Epics.Epic.assign(epic, as, ...)\n |> Bonfire.Ecto.Acts.Work.add(:label)\n end\n end\nend\n```","ref":"Bonfire.Epics.html#1-how-to-write-an-act"},{"type":"extras","title":"2. How to define an Epic - Bonfire.Epics","doc":"","ref":"Bonfire.Epics.html#2-how-to-define-an-epic"},{"type":"extras","title":"Simple Epic where each Act executes sequentially - Bonfire.Epics","doc":"```elixir\n @page_act_opts [on: :page, attrs: :page_attrs]\n\n config :bonfire_pages, Bonfire.Pages,\n epics: [\n create: [\n # Create a changeset for insertion\n {Bonfire.Pages.Acts.Page.Create, @page_act_opts},\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, @page_act_opts},\n # a caretaker,\n {Bonfire.Me.Acts.Caretaker, @page_act_opts},\n # and a creator,\n {Bonfire.Me.Acts.Creator, @page_act_opts},\n # and possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, @page_act_opts},\n # possibly with uploaded files,\n {Bonfire.Files.Acts.AttachMedia, @page_act_opts},\n # with extracted tags fully hooked up,\n {Bonfire.Tag.Acts.Tag, @page_act_opts},\n # and the appropriate boundaries established,\n {Bonfire.Boundaries.Acts.SetBoundaries, @page_act_opts},\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, @page_act_opts}\n ]\n ]\n```","ref":"Bonfire.Epics.html#simple-epic-where-each-act-executes-sequentially"},{"type":"extras","title":"Advanced Epic, where some Acts execute in parallel - Bonfire.Epics","doc":"```elixir\n config :bonfire_posts, Bonfire.Posts,\n epics: [\n publish: [\n # Create a changeset for insertion\n Bonfire.Posts.Acts.Posts.Publish,\n # These next 3 Acts are run in parallel\n [\n # with a sanitised body and tags extracted,\n {Bonfire.Social.Acts.PostContents, on: :post},\n\n # assign a caretaker,\n {Bonfire.Me.Acts.Caretaker, on: :post},\n\n # record the creator,\n {Bonfire.Me.Acts.Creator, on: :post}\n ],\n # These next 4 Acts are run in parallel (they run after the previous 3 because they depend on the outputs of those Acts)\n [\n # possibly fetch contents of URLs,\n {Bonfire.Files.Acts.URLPreviews, on: :post},\n\n # possibly occurring in a thread,\n {Bonfire.Social.Acts.Threaded, on: :post},\n\n # with extracted tags/mentions fully hooked up,\n {Bonfire.Tag.Acts.Tag, on: :post},\n\n # maybe set as sensitive,\n {Bonfire.Social.Acts.Sensitivity, on: :post}\n ],\n # These next 3 Acts are run in parallel (they run after the previous 4 because they depend on the outputs of those Acts)\n [\n # possibly with uploaded/linked media (optionally depends on URLPreviews),\n {Bonfire.Files.Acts.AttachMedia, on: :post},\n\n # with appropriate boundaries established (depends on Threaded),\n {Bonfire.Boundaries.Acts.SetBoundaries, on: :post},\n\n # summarised by an activity (possibly appearing in feeds),\n {Bonfire.Social.Acts.Activity, on: :post}\n ],\n\n # Now we open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Preload data & Publish live feed updates via (in-memory) PubSub\n {Bonfire.Social.Acts.LivePush, on: :post},\n\n # These steps are run in parallel\n [\n # Enqueue for indexing by meilisearch\n {Bonfire.Search.Acts.Queue, on: :post},\n\n # Prepare JSON for federation and add to queue (oban).\n {Bonfire.Social.Acts.Federate, on: :post}\n ],\n\n # Once the activity/object exists (depends on federation being done)\n {Bonfire.Tags.Acts.AutoBoost, on: :post}\n ]\n ]\n```","ref":"Bonfire.Epics.html#advanced-epic-where-some-acts-execute-in-parallel"},{"type":"extras","title":"3. How to run an Epic - Bonfire.Epics","doc":"```elixir\nBonfire.Epics.run_epic(Bonfire.Posts, :publish, on: :post)\n```","ref":"Bonfire.Epics.html#3-how-to-run-an-epic"},{"type":"extras","title":"Copyright and License - Bonfire.Epics","doc":"Copyright (c) 2022 Bonfire Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Bonfire.Epics.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Ecto","doc":"# Bonfire.Ecto\n\n`Bonfire.Ecto` contains `Ecto` transactional support as acts for `Bonfire.Epics`","ref":"Bonfire.Ecto.html"},{"type":"extras","title":"Introduction - Bonfire.Ecto","doc":"`Bonfire.Ecto` is designed to facilitate complex Ecto transaction handling within an Elixir application that uses `Bonfire.Epics` to execute a sequence of operations (or `Acts`). These modules provide a structured way to manage database transactions as a series of acts and managing them within an `Epic`, offering flexibility and control over database interactions, ensuring that transactions are executed efficiently.","ref":"Bonfire.Ecto.html#introduction"},{"type":"extras","title":"Modules Overview - Bonfire.Ecto","doc":"1. `Bonfire.Ecto.Acts.Begin`\n - Responsible for initiating a transaction if certain conditions are met. It ensures that the transaction is only started when it is sensible to do so, based on the current state of the `Epic`.\n\n2. `Bonfire.Ecto.Acts.Work`\n - Handles queued database operations within a transaction. Operations are queued using the `Bonfire.Ecto.Acts.Work.add/2` function and executed if there are no errors in the `Epic` or changesets.\n\n3. `Bonfire.Ecto.Acts.Commit`\n - A placeholder marker used by `Bonfire.Ecto.Acts.Begin` to identify when to commit the transaction.","ref":"Bonfire.Ecto.html#modules-overview"},{"type":"extras","title":"Usage - Bonfire.Ecto","doc":"#### 1. Initial Setup\n\nEnsure that you have `Ecto` and `Bonfire.Epics` installed and configured in your application, and then install this linrary.\n\n#### 2. Using `Bonfire.Ecto.Acts.Begin`\n\nRefer to `Bonfire.Epics` docs to define some `Act`s and `Epic`s: https://github.com/bonfire-networks/bonfire_epics\n\n#### 3. Queue database operation(s) in an Act \n\nQueue operations by calling the `Bonfire.Ecto.Acts.Work.add/2` function, providing the epic and a key representing the changeset to be processed.\n\n```elixir\nepic = Bonfire.Ecto.Acts.Work.add(epic, :some_changeset)\n```\n\n#### 3. Add the three `Bonfire.Ecto` Acts to your Epic\n```\n # First come the Acts that prepare the changeset and call `Bonfire.Ecto.Acts.Work.add/2` to queue it\n\n # Open a Postgres transaction and actually do the insertions in DB\n Bonfire.Ecto.Acts.Begin,\n\n # Run our inserts\n Bonfire.Ecto.Acts.Work,\n Bonfire.Ecto.Acts.Commit,\n\n # Then can come some Acts that process the result of the transaction \n```","ref":"Bonfire.Ecto.html#usage"},{"type":"extras","title":"Bonfire.Classify","doc":"# Bonfire.Classify\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Defining categories/topics\n- Defining relationships (parent or related) between categories to create taxonomies\n\nUse Bonfire.Tag if you want to tag/classify posts or other objects with these categories/topics.","ref":"Bonfire.Classify.html"},{"type":"extras","title":"Handy commands - Bonfire.Classify","doc":"","ref":"Bonfire.Classify.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Classify","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Classify.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Tag","doc":"# Bonfire.Tag\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles tagging posts or other things:\n- @ mentions \n- #hashtags\n- others (e.g. with a Category from Bonfire.Classify or a location from Bonfire.Geolocate)","ref":"Bonfire.Tag.html"},{"type":"extras","title":"Handy commands - Bonfire.Tag","doc":"","ref":"Bonfire.Tag.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Tag","doc":"Copyright (c) 2020 Bonfire, Haha Academy, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Tag.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Label","doc":"# Bonfire.Label\n\nBonfire.Label is a powerful and flexible extension designed to enhance content moderation and improve online safety. Inspired by the design principles outlined by Prosocial Design (specifically the [Label Misleading Content & Add Links to Reliable Related Content](https://www.prosocialdesign.org/library/label-misleading-content-add-links-to-reliable-related-content) pattern), this library enables the addition of custom labels and descriptions to user-generated posts. \n\nThis feature aids in identifying and marking potentially misleading, harmful, or unsafe content, while also providing users with links to reliable and related information.","ref":"Bonfire.Label.html"},{"type":"extras","title":"Features - Bonfire.Label","doc":"- **Custom Labeling**: Easily add custom labels to posts, categorizing them based on content, reliability, and safety.\n- **Dynamic Descriptions**: Append descriptions to posts to provide context, warnings, or additional information.\n- **Link to Reliable Sources**: Option to include up to 3 links to authoritative sources for further reading or fact-checking.\n- **Configurable Settings**: Tailor the permission system to fit the specific governance of your platform.\n- **User-friendly Interface**: Intuitive tools for moderators and administrators to manage labels and descriptions.","ref":"Bonfire.Label.html#features"},{"type":"extras","title":"Copyright and License - Bonfire.Label","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Label.html#copyright-and-license"},{"type":"extras","title":"Bonfire.OpenScience","doc":"# Bonfire.OpenScience\n\nSee https://bonfirenetworks.org/app/open-science/","ref":"Bonfire.OpenScience.html"},{"type":"extras","title":"Copyright and License - Bonfire.OpenScience","doc":"Copyright (c) 2024 Bonfire and Open Science Network Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenScience.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Poll","doc":"# Bonfire.Poll\n\nAn extensions for asking questions, collecting options, and conducting ranked voting on [Bonfire](https://bonfire.cafe/)","ref":"Bonfire.Poll.html"},{"type":"extras","title":"Copyright and License - Bonfire.Poll","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Poll.html#copyright-and-license"},{"type":"extras","title":"Bonfire.OpenID","doc":"# Bonfire.OpenID\n\nAn extension to enable:\n- authenticating on Bonfire using an external identity using OpenID Connect\n- using your Bonfire identity to authenticate in other apps with OpenID Connect 1.0 or OAuth 2.0","ref":"Bonfire.OpenId.html"},{"type":"extras","title":"Copyright and License - Bonfire.OpenID","doc":"Powered by these libraries: \n- https://hex.pm/packages/boruta (MIT license)\n- https://hex.pm/packages/openid_connect (MIT license)\n\nExtension copyright (c) 2022 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.OpenId.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Search","doc":"# Bonfire.Search\n\nAn extension for [Bonfire](https://bonfire.cafe/) to handle:\n\n- Search indexing\n- Ultra-fast search\n- LiveView search UI\n\nYou can implement adapters for your prefered search backend. Currently adapters are included for:\n- Database\n- [Meili Search](https://www.meilisearch.com/)","ref":"Bonfire.Search.html"},{"type":"extras","title":"Development & Deployment Documentation - Bonfire.Search","doc":"This extension is meant to be used inside of a Bonfire app, so please refer to the main repo at: https://github.com/bonfire-networks/bonfire-app","ref":"Bonfire.Search.html#development-deployment-documentation"},{"type":"extras","title":"Copyright and License - Bonfire.Search","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Search.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Federate.ActivityPub","doc":"# Bonfire.Federate.ActivityPub\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Extensible/configurable tools for translating Bonfire data to/from ActivityStreams\n- Bonfire Adapter for the [ActivityPub federation library ](https://github.com/bonfire-networks/activity_pub)","ref":"Bonfire.FederateActivitypub.html"},{"type":"extras","title":"Testing - Bonfire.Federate.ActivityPub","doc":"There are unit tests both in this repo, and in the activity_pub lib, but they can't cover every possible federation case, so manual testing with e.g. `curl -H \"Accept: application/activity+json\" -v \"http://localhost:4001/pub/actors/my_username\" | jq '.'` and by trying out federation flows between instances of Bonfire and other ActivityPub implementation is a must.","ref":"Bonfire.FederateActivitypub.html#testing"},{"type":"extras","title":"Handy commands - Bonfire.Federate.ActivityPub","doc":"","ref":"Bonfire.FederateActivitypub.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Federate.ActivityPub","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.FederateActivitypub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Editor.Milkdown","doc":"# Bonfire.Editor.Milkdown\n\nBonfire composer based on the [Milkdown](https://milkdown.dev/) markdown editor","ref":"Bonfire.Editor.Milkdown.html"},{"type":"extras","title":"ROADMAP - Bonfire.Editor.Milkdown","doc":"- [x] Add emojis using gemoji convention\n- [x] Show emojis suggestions when typing : followed by 2 chars\n- [x] Show mentions suggestions when typing @ followed by 2 chars\n- [x] Show formatting suggestions when typing /\n- [x] Insert emojis from the suggestions list\n- [x] Insert mentions from the suggestions list\n- [ ] Insert formatting from the suggestions list\n- [x] Add placeholder when missing text\n- [ ] Upload images by dragging them in the editor","ref":"Bonfire.Editor.Milkdown.html#roadmap"},{"type":"extras","title":"Copyright and License - Bonfire.Editor.Milkdown","doc":"Copyright (c) 2023 Bonfire, Milkdown, ProseMirror and Remark Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Editor.Milkdown.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Me","doc":"# Bonfire.Me\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Account creation\n- Email verification\n- Authentication\n- User/Profile creation\n- User/Profile switching\n- User Profile\n- Settings","ref":"Bonfire.Me.html"},{"type":"extras","title":"Handy commands - Bonfire.Me","doc":"","ref":"Bonfire.Me.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Me","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Me.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Social","doc":"# Bonfire.Social \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Feeds / Timelines\n- Activities\n- Threads\n- Boosting\n- Liking\n- Flagging\n- etc","ref":"Bonfire.Social.html"},{"type":"extras","title":"Handy commands - Bonfire.Social","doc":"","ref":"Bonfire.Social.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Social","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Social.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Social.Graph","doc":"# Bonfire.Social.Graph \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Following\n- Follow Requests\n- Social graph analysis","ref":"Bonfire.SocialGraph.html"},{"type":"extras","title":"Handy commands - Bonfire.Social.Graph","doc":"","ref":"Bonfire.SocialGraph.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Social.Graph","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.SocialGraph.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Posts","doc":"# Bonfire.Posts \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Creating and reading posts","ref":"Bonfire.Posts.html"},{"type":"extras","title":"Handy commands - Bonfire.Posts","doc":"","ref":"Bonfire.Posts.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Posts","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Posts.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Messages","doc":"# Bonfire.Messages \n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- DM\n- Group messaging","ref":"Bonfire.Messages.html"},{"type":"extras","title":"Handy commands - Bonfire.Messages","doc":"","ref":"Bonfire.Messages.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Messages","doc":"Copyright (c) 2023 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Messages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Invite.Links","doc":"# Bonfire.Invite.Links\n\nAn extension for [Bonfire](https://bonfire.cafe/) to generate invite links","ref":"Bonfire.InviteLinks.html"},{"type":"extras","title":"Handy commands - Bonfire.Invite.Links","doc":"","ref":"Bonfire.InviteLinks.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Invite.Links","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.InviteLinks.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Pages","doc":"# Bonfire.Pages\n\nBasic CMS","ref":"Bonfire.Pages.html"},{"type":"extras","title":"Copyright and License - Bonfire.Pages","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Pages.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Quantify","doc":"# Bonfire.Quantify\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Units\n- Measures","ref":"Bonfire.Quantify.html"},{"type":"extras","title":"Handy commands - Bonfire.Quantify","doc":"","ref":"Bonfire.Quantify.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Quantify","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Quantify.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Geolocate","doc":"# Bonfire.Geolocate\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- Geolocation schema\n- Optional GraphQL API for geolocations\n- Geocoding of addresses\n- Reverse geocoding","ref":"Bonfire.Geolocate.html"},{"type":"extras","title":"Usage - Bonfire.Geolocate","doc":"If you want to use the map LiveView component, you will need to `npm add leaflet --save --prefix assets/` in your app, and import","ref":"Bonfire.Geolocate.html#usage"},{"type":"extras","title":"Handy commands - Bonfire.Geolocate","doc":"","ref":"Bonfire.Geolocate.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Geolocate","doc":"Copyright (c) 2020 Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Geolocate.html#copyright-and-license"},{"type":"extras","title":"ValueFlows","doc":"# ValueFlows\n\n`ValueFlows` is a [Bonfire](https://bonfire.cafe/) extension that implements [ValueFlows](https://valueflo.ws/) for federated networks to conduct economic activities.\n\nImplemented so far:\n\n- Intent\n- Proposal\n- Economic Event\n- Types of Action\n- Resource Specification\n- Economic Resource\n- Process Specification\n- Process\n- Claim (WIP)\n- Value Calculations (WIP)\n\nAs well as an optional GraphQL API for all of the above...","ref":"Bonfire.Valueflows.html"},{"type":"extras","title":"Handy commands - ValueFlows","doc":"","ref":"Bonfire.Valueflows.html#handy-commands"},{"type":"extras","title":"Copyright and License - ValueFlows","doc":"Copyright (c) 2021 ValueFlows, CommonsPub, Reflow & Bonfire Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Valueflows.html#copyright-and-license"},{"type":"extras","title":"Bonfire.Breadpub","doc":"# Bonfire.Breadpub\n\nAn extension for [Bonfire](https://bonfire.cafe/) that handles:\n\n- UI components and views for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows)","ref":"Bonfire.Breadpub.html"},{"type":"extras","title":"Handy commands - Bonfire.Breadpub","doc":"","ref":"Bonfire.Breadpub.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.Breadpub","doc":"Copyright (c) 2020 Bonfire, VoxPublica, and CommonsPub Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Breadpub.html#copyright-and-license"},{"type":"extras","title":"Bonfire.ValueFlows.Observe","doc":"# Bonfire.ValueFlows.Observe\n\nAn extension for [ValueFlows](https://valueflo.ws/) on [Bonfire](https://bonfire.cafe/) that handles:\n\n- Observations\n - with measurements\n - with other phenomena","ref":"Bonfire.ValueflowsObserve.html"},{"type":"extras","title":"Handy commands - Bonfire.ValueFlows.Observe","doc":"","ref":"Bonfire.ValueflowsObserve.html#handy-commands"},{"type":"extras","title":"Copyright and License - Bonfire.ValueFlows.Observe","doc":"Copyright (c) 2020 Bonfire and ValueFlows Contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.ValueflowsObserve.html#copyright-and-license"},{"type":"extras","title":"Bonfire:Upcycle","doc":"# Bonfire:Upcycle\n\nUpcycle supports a network of high school fablabs in Milwaukee that receive contributions of materials from organizations in the community and share these with each other. It is implemented as a UI for [ValueFlows](https://github.com/bonfire-networks/bonfire_valueflows), which are both available as extensions for [Bonfire](https://bonfire.cafe/). Upcycle was initially created for [LearnDeep](https://learndeep.org/) by students at [MSOE](https://www.msoe.edu/), and is now being maintained by the Bonfire team.","ref":"Bonfire.Upcycle.html"},{"type":"extras","title":"Set up - Bonfire:Upcycle","doc":"Upcycle is packaged as part of the `cooperation` flavour of Bonfire. Check out the development or deployment [docs](https://doc.bonfirenetworks.org/readme.html) to get started.","ref":"Bonfire.Upcycle.html#set-up"},{"type":"extras","title":"Copyright and License - Bonfire:Upcycle","doc":"Copyright (c) 2022 all contributors\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nAffero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public\nLicense along with this program. If not, see .","ref":"Bonfire.Upcycle.html#copyright-and-license"},{"type":"extras","title":"Bonfire","doc":"# Bonfire \n\nAn essential Bonfire extension that bootstraps any other enabled extensions and starts the app. Also includes views such as the homepage and dashboard.\n\nSee https://github.com/bonfire-networks/bonfire-app for an example umbrella app (actually a [poncho](https://embedded-elixir.com/post/2017-05-19-poncho-projects/) since Bonfire is not a monorepo) if you want to run this, and https://bonfirenetworks.org for details about Bonfire.","ref":"Bonfire.html"},{"type":"extras","title":"ActivityPub","doc":"# ActivityPub\n\nActivityPub Library for elixir.\n\n**WORK IN PROGRESS, TESTING FEDERATION WITH DIFFERENT IMPLEMENTATIONS IS UNDERWAY**","ref":"ActivityPub.html"},{"type":"extras","title":"Installation - ActivityPub","doc":"1. Add this library to your dependencies in `mix.exs`\n\n```\ndefp deps do\n [...]\n {:activity_pub, git: \"https://github.com/bonfire-networks/activity_pub.git\", branch: \"stable\"} # branch can \"stable\", or \"develop\" for the bleeding edge\nend\n```\n\n2. Create an adapter module. To start, one created at\n `lib/my_app/adapter.ex` might look like\n\n```elixir\ndefmodule MyApp.Adapter do\n @moduledoc \"\"\"\n Adapter functions delegated from the `ActivityPub` Library\n \"\"\"\n\n @behaviour ActivityPub.Federator.Adapter\nend\n```\n\nNote that, due to the defined `@behavior`, Elixir will warn you that\nthe required functions\n\n * `base_url/0`\n * `get_actor_by_id/1`\n * `get_actor_by_username/1`\n * `get_follower_local_ids/1`\n * `get_following_local_ids/1`\n * `get_redirect_url/1`\n * `handle_activity/1`\n * `maybe_create_remote_actor/1`\n * `maybe_publish_object/2`\n * `update_local_actor/2`\n * `update_remote_actor/1`\n\nhave not yet been implemented though you will be able to start your\napp. Defining these allows `ActivityPub` to handle ActivityPub HTTP\nand database calls and operations. An example of an implemented\nadaptor can be found\n[here](https://github.com/bonfire-networks/bonfire_federate_activitypub/tree/main/lib/adapter\n\"Link to file hosted on GitHub\").\n\nThen set it in config\n\n```\nconfig :activity_pub, :adapter, MyApp.Adapter\n```\n\n3. Set your application repo in config\n\n```\nconfig :activity_pub, :repo, MyApp.Repo\n```\n\n4. Create a new ecto migration and call `ActivityPub.Migration.up/0` from it\n\n5. Inject AP routes to your router by adding `use ActivityPub.Web.Router` to your app's router module\n\n6. Copy the default AP config to your app's confix.exs\n\n```\nconfig :activity_pub, :mrf_simple,\n media_removal: [],\n media_nsfw: [],\n report_removal: [],\n accept: [],\n avatar_removal: [],\n banner_removal: []\n\nconfig :activity_pub, :instance,\n hostname: \"example.com\",\n federation_publisher_modules: [ActivityPub.Federator.APPublisher],\n federation_reachability_timeout_days: 7,\n federating: true,\n rewrite_policy: []\n\nconfig :activity_pub, :http,\n proxy_url: nil,\n user_agent: \"Your app name\",\n send_user_agent: true,\n adapter: [\n ssl_options: [\n # Workaround for remote server certificate chain issues\n partial_chain: &:hackney_connect.partial_chain/1,\n # We don't support TLS v1.3 yet\n versions: [:tlsv1, :\"tlsv1.1\", :\"tlsv1.2\"]\n ]\n ]\n ```\n\n7. Change the hostname value in the instance config block to your instance's hostname \n\n8. If you don't already have Oban set up, follow the [Oban installation intructions](https://hexdocs.pm/oban/installation.html#content) and add the AP queues:\n\n```\nconfig :my_app, Oban, queues: [federator_incoming: 50, federator_outgoing: 50, remote_fetcher: 20]\n```\n\nNow you should be able to compile and run your app and move over to integration.","ref":"ActivityPub.html#installation"},{"type":"extras","title":"Needle.UID","doc":"# Needle.UID\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle_uid)](https://hex.pm/packages/needle_uid)\n[hexdocs](https://hexdocs.pm/needle_uid)\n\nHybrid prefixed UUIDv7 and ULID data type for Ecto (using [pride](https://github.com/bonfire-networks/pride) and [needle_ulid](https://github.com/bonfire-networks/needle_ulid))","ref":"Needle.Uid.html"},{"type":"extras","title":"Installation - Needle.UID","doc":"```elixir\n{:needle_uid, git: \"https://github.com/bonfire-networks/needle_uid\", branch: \"main\"}\n```","ref":"Needle.Uid.html#installation"},{"type":"extras","title":"Copyright and License - Needle.UID","doc":"Copyright (c) 2024 Bonfire contributors\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.Uid.html#copyright-and-license"},{"type":"extras","title":"Needle.ULID","doc":"# Needle.ULID\n\n[![hex.pm](https://img.shields.io/hexpm/v/needle_ulid)](https://hex.pm/packages/needle_ulid)\n[hexdocs](https://hexdocs.pm/needle_ulid)\n\nA ULID datatype and some postgres support for ULID operations (`min` and `max` functions and aggregates)\n\nOriginally forked from\n[ecto-ulid](https://github.com/TheRealReal/ecto-ulid) but the internals have been replaced with a dependency on [ex_ulid](https://github.com/omgnetwork/ex_ulid)","ref":"Needle.Ulid.html"},{"type":"extras","title":"Installation - Needle.ULID","doc":"```elixir\n{:needle_ulid, git: \"https://github.com/bonfire-networks/needle_ulid\", branch: \"main\"}\n```","ref":"Needle.Ulid.html#installation"},{"type":"extras","title":"Copyright and License - Needle.ULID","doc":"Copyright (c) 2021 Bonfire contributors.\nCopyright (c) 2018 The RealReal, Inc.\nCopyright (c) 2020 needle_ulid contributors.\n\nLicensed under the terms of the MIT License.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","ref":"Needle.Ulid.html#copyright-and-license"},{"type":"extras","title":"EctoSparkles","doc":"# EctoSparkles\n\nSome helpers to sparkle on top of [Ecto](https://hexdocs.pm/ecto/Ecto.html) \n\n- [`EctoSparkles.proload/3`](#proload-documentation) and `EctoSparkles.join_preload/2` to join and preload associations with less verbosity\n- [`EctoSparkles.reusable_join/5`](#reusable_join-documentation) to avoid duplicating joins \n- `EctoSparkles.Migrator` to run migrations, rollbacks, etc in a release and `EctoSparkles.AutoMigrator` to automatically run them at startup.\n- `EctoSparkles.DataMigration`: a behaviour implemented for data migrations (generally backfills).\n- `EctoSparkles.Log` to log slow or possible N+1 queries with telemetry (showing stacktraces)\n- `EctoSparkles.Changesets.Errors` to generate readable errors for changesets\n\nNOTE: you need to put something like `config :ecto_sparkles, :otp_app, :your_otp_app_name` in your app's config.\n\n\n## `proload` documentation\n\nA macro which tells Ecto to perform a join and preload of associations.\n\nBy default, Ecto preloads associations using a separate query for each association, which can degrade performance.\n\nYou can make it run faster by using a combination of join/preload, but that requires a bit of boilerplate (see examples below).","ref":"EctoSparkles.html"},{"type":"extras","title":"Examples using standard Ecto - EctoSparkles","doc":"```\n query\n |> join(:left, [o, activity: activity], assoc(:object), as: :object)\n |> preload([l, activity: activity, object: object], activity: {activity, [object: object]})\n```\n\nEcto requires calling three different functions for this operation: `Query.join/4`, `Query.assoc/3` and `Query.preload/2`. \n\nHere's another example:\n\n```\n Invoice\n |> join(:left, [i], assoc(i, :customer), as: :customer)\n |> join(:left, [i], assoc(i, :lines), as: :lines)\n |> preload([lines: v, customers: c], lines: v, customer: c)\n```","ref":"EctoSparkles.html#examples-using-standard-ecto"},{"type":"extras","title":"Example using proload - EctoSparkles","doc":"With `proload`, you can accomplish this with just one line of code:\n\n```\nproload(query, activity: [:object])\n```\n\nAnd for the other example:\n```\nproload(Invoice, [:customer, :lines])\n```\n\nAs a bonus, it automatically makes use of `reusable_join` so calling it multiple times with the same association has no ill effects.","ref":"EctoSparkles.html#example-using-proload"},{"type":"extras","title":"Example using join_preload - EctoSparkles","doc":"`join_preload` is `proload`'s sister macro with a slightly different syntax:\n\n```\n join_preload(query, [:activity, :object])\n```\n\nand:\n```\n Invoice\n |> join_preload(:customer)\n |> join_preload(:lines)\n```\n\n\n## `reusable_join` documentation\n\nA macro similar to `Ecto.Query.join/{4,5}`, but can be called multiple times \nwith the same alias.\n\nNote that only the first join operation is performed, the subsequent ones that use the same alias\nare just ignored. Also note that because of this behaviour, its mandatory to specify an alias when\nusing this function.\n\nThis is helpful when you need to perform a join while building queries one filter at a time,\nbecause the same filter could be used multiple times or you could have multiple filters that\nrequire the same join, which poses a problem with how the `filter/3` callback work, as you\nneed to return a dynamic with the filtering, which means that the join must have an alias,\nand by default Ecto raises an error when you add multiple joins with the same alias.\n\nTo solve this, it is recommended to use this macro instead of the default `Ecto.Query.join/{4,5}`,\nin which case there will be only one join in the query that can be reused by multiple filters.","ref":"EctoSparkles.html#example-using-join_preload"},{"type":"extras","title":"Creating reusable joins - EctoSparkles","doc":"```elixir\nquery\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_a)\n|> reusable_join(:left, [t1], t2 in \"other_table\", on: t1.id == t2.id, as: :other_b)\n```","ref":"EctoSparkles.html#creating-reusable-joins"},{"type":"extras","title":"Copyright - EctoSparkles","doc":"- Copyright (c) 2021 Bonfire developers\n- Copyright (c) 2020 Up Learn\n- Copyright (c) 2019 Joshua Nussbaum \n\n- `join_preload` was originally forked from [Ecto.Preloader](https://github.com/joshnuss/ecto_preloader), licensed under WTFPL)\n- `reusable_join` was originally forked from [QueryElf](https://gitlab.com/up-learn-uk/query-elf), licensed under Apache License Version 2.0\n- original code licensed under Apache License Version 2.0","ref":"EctoSparkles.html#copyright"},{"type":"extras","title":"Entrepôt","doc":"# Entrepôt\n\nMinimal, composable file upload, storage, and streamed data migrations for Elixir apps, flexibly and with minimal dependencies.\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot.svg)](https://hex.pm/packages/entrepot)\n[![CI status](https://github.com/bonfire-networks/entrepot/workflows/CI/badge.svg)](https://github.com/bonfire-networks/entrepot/actions)\n\n:warning: Although it's been used in production for over a year without issue, Entrepôt is experimental and still in active development. Accepting file uploads introduces specific security vulnerabilities. Use at your own risk.","ref":"Entrepot.html"},{"type":"extras","title":"Concepts - Entrepôt","doc":"Entrepôt intentionally strips file storage logic down to its most composable parts and lets you decide how you want to use them. These components are: [storage](#storage), [upload](#upload), [locator](#locator), and optionally, [uploader](#uploader), which provides a more ergonomic API for the other 3.\n\nIt is intentionally agnostic about versions, transformation, validations, etc. Most of the convenience offered by other libraries around these features comes at the cost of locking in dependence on specific tools and hiding complexity. Entrepôt puts a premium on simplicity and explicitness.\n\nSo what does it do? Here's a theoretical example of a use case with an Ecto 1 schema, which stores the file retrieved from a URL, along with some additional metadata:\n\n```\n def create_attachment(upload, user) do\n Multi.new()\n |> Multi.run(:upload, fn _, _ ->\n YourStorage.put(upload, prefix: :crypto.hash(:md5, [user.id, url]) |> Base.encode16())\n end)\n |> Multi.insert(:attachment, fn %{upload: file_id} ->\n %Attachment{file_data: Locator.new!(id: file_id, storage: YourStorage, metadata: %{type: \"document\"})\n end)\n |> Repo.transaction()\n end\n```\n\nThen to access the file:\n\n```\n%Attachment{file_data: file} = attachment\n\n{:ok, contents} = Disk.read(file.id)\n```\n\n 1 *See [integrations](#integrations) for streamlined use with Ecto.*","ref":"Entrepot.html#concepts"},{"type":"extras","title":"Storage - Entrepôt","doc":"A \"storage\" is a [behaviour](https://elixirschool.com/en/lessons/advanced/behaviours/) that implements the following \"file-like\" callbacks:\n\n* read\n* put\n* delete\n\nImplementing your own storage is as easy as creating a module that quacks this way. Each callback should accept an optional list of options as the last arg. Which options are supported is up to the module that implements the callbacks.","ref":"Entrepot.html#storage"},{"type":"extras","title":"Upload - Entrepôt","doc":"Upload is a [protocol](https://elixir-lang.org/getting-started/protocols.html) consisting of the following two functions:\n\n* contents\n* name\n\nA storage uses this interface to figure how to extract the file data from a given struct and how to identify it. See `Entrepot.Locator` for an example of how this protocol can be implemented.","ref":"Entrepot.html#upload"},{"type":"extras","title":"Locator - Entrepôt","doc":"Locators are the mediators between storages and uploads. They represent where an uploaded file was stored so it can be retrieved. They contain a unique id, the name of the storage to which the file was uploaded, and a map of user defined metadata.\n\nLocator also implements the upload protocol, which means moving a file from one storage to another is straightforward, and very useful for \"promoting\" a file from temporary (e.g. Disk) to permanent (e.g. S3) storage 2 :\n\n```\nold_file_data = %Locator{id: \"/path/to/file.jpg\", storage: Disk, metadata: %{}}\n{:ok, new_id} = S3.put(old_file_data)`\n```\n\nNote: always remember to take care of cleaning up the old file as Entrepot *never* automatically removes files:\n\n`Disk.delete(old_file_data.id)`","ref":"Entrepot.html#locator"},{"type":"extras","title":"Uploader - Entrepôt","doc":"This helper was added in order to support DRYing up storage access. In most apps, there are certain types of assets that will be uploaded and handled in a similar, if not the same way, if only when it comes to where they are stored. You can `use` the uploader to codify the handling for specific types of assets.\n\n```\ndefmodule AvatarUploader do\n use Entrepot.Uploader, storages: [cache: Disk, store: S3]\n\n def build_options(upload, :cache, opts) do\n Keyword.put(opts, :prefix, \"cache/#{Date.utc_today()}\")\n end\n\n def build_options(upload, :store, opts) do\n opts\n |> Keyword.put(:prefix, \"users/#{opts[:user_id]}/avatar\")\n |> Keyword.drop([:user_id])\n end\n\n def build_metadata(upload, :store, _), do: [uploaded_at: DateTime.utc_now()]\nend\n```\n\nThen you can get the files where they need to be without constructing all the options everywhere they might be uploaded: `AvatarUploader.store(upload, :store, user_id: 1)`\n\nNote: as this example demonstrates, the function can receive arbitrary data and use it to customize how it builds the storage options before they are passed on.","ref":"Entrepot.html#uploader"},{"type":"extras","title":"Built-in Integrations - Entrepôt","doc":"Entrepôt's module design is intended to make it easy to implement your own custom utilities for handling files in the way you need. However, anticipating the most common use cases, that is facilitated with the following optional modules and add-on library.\n\nThere are several implementations some common file storages (including S3/Digital Ocean) and uploads (including `Plug.Upload`).","ref":"Entrepot.html#built-in-integrations"},{"type":"extras","title":"Storages - Entrepôt","doc":"Entrepôt ships with the following storage implementations:\n\n- [Disk](#Disk)\n- [S3](#S3)\n- [RAM](#RAM)","ref":"Entrepot.html#storages"},{"type":"extras","title":"Disk - Entrepôt","doc":"This saves uploaded files to a local disk. It is useful for caching uploads while you validate other data, and/or perform some file processing.\n\n#### configuration\n\n- To set the root directory where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.Disk, root_dir: \"tmp\")`\n\n#### options\n\n- `prefix`: This should be a valid system path that will be appended to the root. If it does not exist, Disk will create it.\n- `force`: If this option is set to a truthy value, Disk will overwrite any existing file at the derived path. Use with caution!\n\n#### notes\n\nSince it is possible for files with the same name to be uploaded multiple times, Disk needs some additional info to uniquely identify the file. Disk _does not_ overwrite files with the same name by default. To ensure an upload can be stored, the combination of the `Upload.name` and `prefix` should be unique.","ref":"Entrepot.html#disk"},{"type":"extras","title":"S3 - Entrepôt","doc":"This storage uploads files to [AWS's S3](https://aws.amazon.com/s3/) service. It also works with [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/).\n\n#### configuration\n\n- To set the bucket where files will be stored: `Application.put_env(:entrepot, Entrepot.Storages.S3, bucket: \"whatever\")`\n\n#### options\n\n- prefix: A string to prepend to the upload's key\n- s3_options: Keyword list of option that will passed directly to ex_aws_s3\n\n#### dependencies\n\nSome of the implementations might require further dependencies (currently only [S3](#s3)-compatible storage) that you will also need to add to your project's deps\n```\n{:ex_aws, \"~> 2.0\"}\n{:ex_aws_s3, \"~> 2.0\"}\n```","ref":"Entrepot.html#s3"},{"type":"extras","title":"RAM - Entrepôt","doc":"Uses Elixir's [StringIO](https://hexdocs.pm/elixir/StringIO.html) module to store file contents in memory. Since the \"files\" are essentially just strings, they will not be persisted and will error if they are read back from a database, for example. However, operations are correspondingly very fast and thus suitable for tests or other temporary file operations.","ref":"Entrepot.html#ram"},{"type":"extras","title":"uploads - Entrepôt","doc":"There are implementation of the `Entrepot.Upload` protocol for the following modules:\n\n- [URI](#URI)\n- [Plug.Upload](#plugupload)","ref":"Entrepot.html#uploads"},{"type":"extras","title":"URI - Entrepôt","doc":"This is useful for transferring files already hosted elsewhere, for example in cloud storage not controlled by your application, or a [TUS server](https://tus.io/).\n\nYou can use it to allow users to post a url string in lieu of downloading and reuploading a file. A Phoenix controller action implementing this feature might look like this:\n\n```\ndef attach(conn, %{\"attachment\" => %{\"url\" => url}}) when url != \"\" do\n URI.parse(url)\n |> Disk.put(upload)\n\n # ...redirect, etc\nend\n```\n\n#### notes\n\nThis implementation imposes a hard timeout limit of 15 seconds to download the file from the remote location.","ref":"Entrepot.html#uri"},{"type":"extras","title":"Plug.Upload - Entrepôt","doc":"This supports multi-part form submissions handled by [Plug](https://hexdocs.pm/plug/Plug.Upload.html#content).\n\n## [EntrepôtEcto](https://github.com/bonfire-networks/entrepot_ecto)\n\nThere is an external library (because it needs Ecto as a dependency) which provides `Entrepot.Ecto.Type` for Ecto schema fields to easily handle persisting Locator data in your repository.\n\n---\n\nNote: Entrepôt was originally forked from [Capsule](https://github.com/elixir-capsule)","ref":"Entrepot.html#plug-upload"},{"type":"extras","title":"EntrepôtEcto","doc":"# EntrepôtEcto\n\nEcto integration for [Entrepôt](https://github.com/bonfire-networks/entrepot)\n\n[![hex package](https://img.shields.io/hexpm/v/entrepot_ecto.svg)](https://hex.pm/packages/entrepot_ecto)\n[![CI status](https://github.com/bonfire-networks/entrepot_ecto/workflows/CI/badge.svg)](https://github.com/bonfire-networks/capsulei_ecto/actions)\n\nThis package adds the following two features to support the use of Entrepôt with Ecto:\n\n1. Custom Type\n2. Changeset helper\n\n## `Entrepot.Ecto.Type`\n\nIn your Ecto schema specify your file field with the following type to get serialization of uploads (`Entrepot.Locator`) to maps:\n\n```\ndefmodule Attachment\n use Ecto.Schema\n\n schema \"attachments\" do\n field :file_data, Entrepot.Ecto.Type\n end\nend\n```\n\n## `Entrepot.Ecto.upload`\n\nCast params to uploaded data with `Entrepot.Ecto.upload`. In the style of Ecto.Multi, it accepts either an anonymous function or a module and function name, both with arity(2). The first argument passed will be a 2 element tuple representing the key/param pair and the second value will be the changeset.\n\nIt is expected to return either a success tuple with the `Locator` struct or the changeset. In the latter case the changeset will simply be passed on down the pipe.\n\nEven if you want to extract some metadata and apply a validation after you store the file, then the anonymous function may be all you need:\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], fn {_field, upload}, changeset ->\n case Entrepot.Storages.Disk.put(upload) do\n {:ok, id} -> Entrepot.Locator.new!(id: id, storage: Entrepot.Storages.Disk)\n error_tuple -> add_error(changeset, \"upload just...failed\")\n end\n end)\n |> validate_attachment\n\n ```\n\nHowever, if you want to do more complicated things with the upload before storing it (such as resizing, encrypting, etc) then creating a module is probably the way to go.\n\n ```\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(%{\"file_data\" => some_upload}, [:file_data], MyApp.Attacher, :attach)\n ```\n---","ref":"EntrepotEcto.html"},{"type":"extras","title":"Upload cleanup - EntrepôtEcto","doc":"Since the file is written to disk as part of the changeset, you will probably want to do some cleanup depending on the error status. On success you may want to move the file from a temporary location to permanent storage (especially if the latter is in the cloud and costs a network request). On failure you may want to delete the file (unless you are handling that with some sort of periodic task).\n\nOne good option is to wrap your Repo operation in another function to handle both as asynchronous Tasks so they don't block the parent process:\n\n ```\n def create_attachment(user, attrs) do\n %Attachment{}\n |> Ecto.Changeset.change()\n |> Entrepot.Ecto.upload(attrs, [:file_data], MyApp.Attacher, :attach)\n |> Repo.insert()\n |> case do\n {:ok, attachment} = success_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Attachment.promote_upload(attachment) end\n )\n\n success_tuple\n\n {:error, %{changes: %{file_data: file_data}}} = error_tuple ->\n Task.Supervisor.start_child(\n YourApp.Supervisor,\n fn -> Disk.delete(file_data.id) end\n )\n\n error_tuple\n end\n ```\n\nIn this example, `Attachment.promote_upload(attachment)` would handle moving the file and updating the file data in the db. It uses `Multi` to ensure all operations succeed or fail together:\n\n ```\n def promote_upload(attachment) do\n Multi.new()\n |> Multi.run(:copy_file, fn _, _ ->\n NetworkStorage.put(attachment.file_data.id)\n end)\n |> Multi.update(:updated_schema, fn %{move_file: new_data} ->\n Attachment.changeset(attachment, %{file_data: new_data })\n end)\n |> Multi.run(:delete_old_file, fn _, _ ->\n Disk.delete(attachment.file_data.id)\n end)\n |> Repo.transaction()\n end\n ```","ref":"EntrepotEcto.html#upload-cleanup"},{"type":"extras","title":"Testing - EntrepôtEcto","doc":"Since Locators are serialized as plain maps, it is easy to stub out file operations in fixtures/factories by inserting data directly into the db without going through a changeset:\n\n ```\n %Attachment{\n file_data: %{\n id: \"fake.jpg\",\n metadata: %{name: \"fake\"}, size: 100\n }\n }\n |> Repo.insert!()\n ```\n\nIf you want to run tests on the actual file operations, you will need to make sure the id points to an actual file location that the configured storage understands.\n\nYou can configure your test environment to use the RAM storage:\n\n ```\n {:ok, id} = Entrepot.Storages.RAM.put(some_upload)\n\n Repo.insert!(%Attachment{file_data: %{id: id, storage: Entrepot.Storages.RAM}})\n ```\n\nOr, for maximum performance, you can a simple struct that implements the `Upload` protocol:\n\n ```\n defmodule Entrepot.MockUpload do\n defstruct content: \"Hi, I'm a file\", name: \"hi\"\n\n defimpl Entrepot.Upload do\n def contents(mock), do: {:ok, mock.content}\n\n def name(mock), do: mock.name\n end\n end\n ```\n\n---\nNote: Entrepôt was originally forked from [Capsule](https://github.com/elixir-capsule)","ref":"EntrepotEcto.html#testing"},{"type":"extras","title":"Paginator","doc":"# Paginator\n\n[![Build status](https://github.com/duffelhq/paginator/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/duffelhq/paginator/actions?query=branch%3Amain)\n[![Inline docs](http://inch-ci.org/github/duffelhq/paginator.svg)](http://inch-ci.org/github/duffelhq/paginator)\n\n`Paginator` implements [cursor-based pagination](http://use-the-index-luke.com/no-offset) for Elixir [Ecto](https://github.com/elixir-ecto/ecto).\n\n[Documentation](https://hexdocs.pm/paginator)","ref":"Paginator.html"},{"type":"extras","title":"Why? - Paginator","doc":"There are several ways to implement pagination in a project and they all have pros and cons depending on your situation.","ref":"Paginator.html#why"},{"type":"extras","title":"Limit-offset - Paginator","doc":"This is the easiest method to use and implement: you just have to set `LIMIT` and `OFFSET` on your queries and the\ndatabase will return records based on this two parameters. Unfortunately, it has two major drawbacks:\n\n* Inconsistent results: if the dataset changes while you are querying, the results in the page will shift and your user\nmight end seeing records they have already seen and missing new ones.\n\n* Inefficiency: `OFFSET N` instructs the database to skip the first N results of a query. However, the database must still\nfetch these rows from disk and order them before it can returns the ones requested. If the dataset you are querying is\nlarge this will result in significant slowdowns.","ref":"Paginator.html#limit-offset"},{"type":"extras","title":"Cursor-based (a.k.a keyset pagination) - Paginator","doc":"This method relies on opaque cursor to figure out where to start selecting records. It is more performant than\n`LIMIT-OFFSET` because it can filter records without traversing all of them.\n\nIt's also consistent, any insertions/deletions before the current page will leave results unaffected.\n\nIt has some limitations though: for instance you can't jump directly to a specific page. This may\nnot be an issue for an API or if you use infinite scrolling on your website.","ref":"Paginator.html#cursor-based-a-k-a-keyset-pagination"},{"type":"extras","title":"Learn more - Paginator","doc":"* http://use-the-index-luke.com/no-offset\n* http://use-the-index-luke.com/sql/partial-results/fetch-next-page\n* https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/\n* https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines","ref":"Paginator.html#learn-more"},{"type":"extras","title":"Getting started - Paginator","doc":"```elixir\ndefmodule MyApp.Repo do\n use Ecto.Repo,\n otp_app: :my_app,\n adapter: Ecto.Adapters.Postgres\n\n use Paginator\nend\n\nquery = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id])\n\npage = MyApp.Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)\n\n# `page.edges` contains all the entries for this page.\n# `page.page_info` contains the meta-data associated with this page (cursors, limit, total count)\n```","ref":"Paginator.html#getting-started"},{"type":"extras","title":"Install - Paginator","doc":"Add `paginator` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [{:paginator, \"~> 1.0.4\"}]\nend\n```","ref":"Paginator.html#install"},{"type":"extras","title":"Usage - Paginator","doc":"1. Add `Paginator` to your repo.\n\n ```elixir\n defmodule MyApp.Repo do\n use Ecto.Repo,\n otp_app: :my_app,\n adapter: Ecto.Adapters.Postgres\n\n use Paginator\n end\n ```\n\n2. Use the `paginate` function to paginate your queries.\n\n ```elixir\n query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id])\n\n # return the first 50 posts\n %{edges: edges, page_info: page_info} = Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)\n\n # assign the `after` cursor to a variable\n cursor_after = page_info.end_cursor\n\n # return the next 50 posts\n %{edges: edges, page_info: page_info} = Repo.paginate(query, after: cursor_after, cursor_fields: [{:inserted_at, :asc}, {:id, :asc}], limit: 50)\n\n # assign the `before` cursor to a variable\n cursor_before = page_info.start_cursor\n\n # return the previous 50 posts (if no post was created in between it should be the same list as in our first call to `paginate`)\n %{edges: edges, page_info: page_info} = Repo.paginate(query, before: cursor_before, cursor_fields: [:inserted_at, :id], limit: 50)\n\n # return total count\n # NOTE: this will issue a separate `SELECT COUNT(*) FROM table` query to the database.\n %{edges: edges, page_info: page_info} = Repo.paginate(query, include_total_count: true, cursor_fields: [:inserted_at, :id], limit: 50)\n\n IO.puts \"total count: #{page_info.total_count}\"\n ```","ref":"Paginator.html#usage"},{"type":"extras","title":"Security Considerations - Paginator","doc":"`Repo.paginate/4` will throw an ArgumentError should it detect an executable term in the cursor parameters passed to it (`before`, `after`).\nThis is done to protect you from potential side-effects of malicious user input, see [paginator_test.exs](https://github.com/duffelhq/paginator/blob/master/test/paginator_test.exs#L820).","ref":"Paginator.html#security-considerations"},{"type":"extras","title":"Indexes - Paginator","doc":"If you want to reap all the benefits of this method it is better that you create indexes on the columns you are using as\ncursor fields.","ref":"Paginator.html#indexes"},{"type":"extras","title":"Example - Paginator","doc":"```elixir\n# If your cursor fields are: [:inserted_at, :id]\n# Add the following in a migration\n\ncreate index(\"posts\", [:inserted_at, :id])\n```","ref":"Paginator.html#example"},{"type":"extras","title":"Caveats - Paginator","doc":"* This method requires a deterministic sort order. If the columns you are currently using for sorting don't match that\ndefinition, just add any unique column and extend your index accordingly.\n* You need to add order_by clauses yourself before passing your query to `paginate/2`. In the future we might do that\nfor you automatically based on the fields specified in `:cursor_fields`.\n* There is an outstanding issue where Postgrex fails to properly builds the query if it includes custom PostgreSQL types.\n* This library has only be tested with PostgreSQL.","ref":"Paginator.html#caveats"},{"type":"extras","title":"Documentation - Paginator","doc":"Documentation is written into the library, you will find it in the source code, accessible from `iex` and of course, it\nall gets published to [hexdocs](http://hexdocs.pm/paginator).","ref":"Paginator.html#documentation"},{"type":"extras","title":"Contributing - Paginator","doc":"","ref":"Paginator.html#contributing"},{"type":"extras","title":"Running tests - Paginator","doc":"Clone the repo and fetch its dependencies:\n\n```\n$ git clone https://github.com/duffelhq/paginator.git\n$ cd paginator\n$ mix deps.get\n$ mix test\n```","ref":"Paginator.html#running-tests"},{"type":"extras","title":"Building docs - Paginator","doc":"```\n$ mix docs\n```","ref":"Paginator.html#building-docs"},{"type":"extras","title":"LICENSE - Paginator","doc":"See [LICENSE](https://github.com/duffelhq/paginator/blob/master/LICENSE.txt)","ref":"Paginator.html#license"},{"type":"extras","title":"Iconify for Phoenix","doc":"# Iconify for Phoenix\n\nPhoenix helpers for using 100,000+ SVG icons from 100+ icon sets compiled by [Iconify](https://icon-sets.iconify.design) (visit that site to browse the sets available and preview the icons)\n\nIt copies only the icons you use from the iconify library into your project, preparing them on-the-fly when you first use an icon in a view or component (either at compile time if using the Surface component, or on the first run during development).\n\nIt can be configured to embed the icons one of three ways:\n- `css` (default): generate a single CSS file containing SVGs of all the icons used \n- `img` (default for emojis): to create SVG files in your static assets, used to be included with `img` tags and loaded over HTTP (you may want to include [svg-inject](https://github.com/iconfu/svg-inject) on your site to enable styling of the SVGs, e.g. to change their colour)\n- `inline`: to generate a Phoenix Component for each icon used, used to embed the icons as `svg` tags inline in the HTML of your views (meaning the SVG will be included in LiveView diffs)\n- `set`: to generate an SVG sprite set for each family, and reference icons with a `use` tag inside of inline SVGs.\n\nThere is also an optional integration of [phoenix_live_favicon](https://github.com/BartOtten/phoenix_live_favicon) so you can set an icon (or emoji) as favicon on a page with `Iconify.maybe_set_favicon(socket, icon_name_or_emoji)`.","ref":"IconifyEx.html"},{"type":"extras","title":"Installation - Iconify for Phoenix","doc":"```elixir\ndef deps do\n [\n {:iconify_ex, \"~> 0.1.0\"}\n ]\nend\n```\n\nAfter running `mix deps.get` you need to fetch the latest [iconify icon sets](https://github.com/iconify/icon-sets) by running something like:\n```bash\ncd deps/iconify_ex/assets && yarn && cd -\n```","ref":"IconifyEx.html#installation"},{"type":"extras","title":"Usage - Iconify for Phoenix","doc":"1. Add `import Iconify` in your Phoenix or LiveView module where you want to use it (or just once in the macros in your Web module). \n\n2. Set one of these options in config to choose which approach you want to use (see above for explanations):\n- `config :iconify_ex, :mode, :css` \n- `config :iconify_ex, :mode, :img` \n- `config :iconify_ex, :mode, :inline` \n- `config :iconify_ex, :mode, :set` \n\nIf using CSS mode, you'll need to include the CSS file in your layout (e.g. ` ` in your app's equivalent of `lib/my_app_web/components/layouts/root.html.heex`) and set some default styles that will be applied to all icons, by adding something like this to your app's main CSS (e.g. `assets/css/app.css`):\n```css\n[iconify] {\n background-color: currentColor;\n -webkit-mask-size: cover;\n mask-size: cover;\n min-width: 0.5rem;\n min-height: 0.5rem;\n}\n```\n\nOther configurations include:\n\n```elixir\nconfig :iconify_ex, :fallback_icon, \"heroicons-solid:question-mark-circle\" # when an icon is not found\nconfig :iconify_ex, :generated_icon_modules_path, \"./lib/web/icons\" # for :inline mode\nconfig :iconify_ex, :generated_icon_static_path, \"./priv/static/images/icons\" # where CSS and images are stored\nconfig :iconify_ex, :generated_icon_static_url, \"/images/icons/\" # where CSS and images are served from\n```\n\n3. In all three cases, usage is the same (meaning you can easily switch between modes at any time) by including a component:\n\nEmbed an icon using default classes (copy the icon name from the [iconify website](https://icon-sets.iconify.design)):\n```html\n<.iconify icon=\"heroicons-solid:collection\" />\n```\n\nSpecify custom classes:\n```html\n<.iconify icon=\"heroicons-solid:collection\" class=\"w-8 h-8 text-base-content\" /> \n```\n\nOr if you use [Surface](https://surface-ui.org), it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:\n\nAdd `alias Iconify.Icon` to your Web module, and then:\n\n```html\n<#Icon iconify=\"heroicons-solid:collection\" />\n```\n\nIf your icon is dynamic, you'll still want to use the first form:\n```html\n<.iconify icon={@my_icon} />\n```\n\nNote: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like `sort -u -o icons_dir/icons.css icons_dir/icons.css` to clean up the CSS file.","ref":"IconifyEx.html#usage"},{"type":"extras","title":"Voodoo","doc":"# Voodoo\n\n`Voodoo` is a drop-in replacement for the old-style Phoenix path helpers (before `Phoenix.VerifiedRoutes` was introduced) which is more convenient to use.","ref":"Voodoo.html"},{"type":"extras","title":"Untangle","doc":"# Untangle\n\nLogging/inspecting data, and timing functions, with code location information.","ref":"Untangle.html"},{"type":"extras","title":"Logging/inspecting - Untangle","doc":"`Untangle` provides alternatives for `IO.inspect` and the macros in Elixir's `Logger` to output code location information. It also provides a polyfill for `dbg` which was introduce in Elixir 1.14\n\n![screenshot](priv/screenshot.png \"Screenshot showing sample logs (shown when running the library tests)\")\n\nThe first argument is `inspect`ed and the second argument (if provided) is used as a label:\n\n```\n> import Untangle\nUntangle\n> debug(:no, \"the answer is\") # log at debug\n11:19:09.915 [debug] [iex:2] the answer is: :no\n:no\n> dump(%{a: :map}, \"it\") # inspect something on stdout\n[iex:3] it: %{a: :map}\n%{a: :map}\n```\n\nWhen used in a code file, the location information becomes more useful, e.g.:\n\n```\n[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []\n```\n\nYou may also notice from the iex output that it returns its first argument. This makes it ideal for inserting into a pipeline for debugging purposes:\n\n```elixir\ndo_something()\n|> debug(\"output of do_something/0\")\n```\n\nWhen you are done debugging something, the location of the debug statement is already in the output so you know where to remove it, comment it out, or simply change `warn` or `info` for `debug` if you only need it during development :-)","ref":"Untangle.html#logging-inspecting"},{"type":"extras","title":"Timing functions - Untangle","doc":"You can decorate functions to measure and log their execution time:\n\n```\nuse Untangle\n\n@decorate time()\ndef fun(), do: :stuff\n```\n\nwill output something like `[info] Time to run MyModule.fun/0: 1 ms`","ref":"Untangle.html#timing-functions"},{"type":"extras","title":"Installation - Untangle","doc":"If [available in Hex](https://hex.pm/docs/publish), the package can be installed\nby adding `untangle` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n [\n {:untangle, \"~> 0.3\"}\n ]\nend\n```\n\n# Configure as default `dbg/2` handler","ref":"Untangle.html#installation"},{"type":"extras","title":"In config/config.exs - Untangle","doc":"`config :elixir, :dbg_callback, {Untangle, :custom_dbg, []}`\n\n# Docs\n\nThe docs can be found at [https://hexdocs.pm/untangle](https://hexdocs.pm/untangle).","ref":"Untangle.html#in-config-config-exs"},{"type":"extras","title":"Copyright and License - Untangle","doc":"Copyright (c) 2022 Bonfire contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Untangle.html#copyright-and-license"},{"type":"extras","title":"Arrows","doc":"# Arrows\n\nA handful of (mostly) arrow macros with superpowers.","ref":"Arrows.html"},{"type":"extras","title":"Installation - Arrows","doc":"The package can be installed by adding `arrows` to your list of dependencies in `mix.exs`: \n\n```elixir\ndef deps do\n [\n {:arrows, \"~> 0.2.0\"}\n ]\nend\n```\n\nOr via git:\n```elixir\ndef deps do\n [\n {:arrows, git: \"https://github.com/bonfire-networks/arrows\", branch: \"main\"}\n ]\nend\n```","ref":"Arrows.html#installation"},{"type":"extras","title":"Documentation - Arrows","doc":"The Elixir [|> (\"pipe\") operator](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting. \nThe moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.\n\nNot any more! By simply inserting `...` where you would like the value to be inserted, `Arrows` will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. `Arrows` was inspired by [an existing library](https://hexdocs.pm/magritte/Magritte.html). \n\nHere is part of the test suite in lieu of examples:\n\n```elixir\ndefmodule ArrowsTest do\n use ExUnit.Case\n use Arrows\n\n def double(x), do: x * 2\n def double_fst(x, _), do: x * 2\n def double_snd(_, x), do: x * 2\n def add_snd_thd(_, x, y), do: x + y\n\n test \"|>\" do\n assert 4 == (2 |> double)\n assert 4 == (2 |> double())\n assert 4 == (2 |> double(...))\n assert 8 == (2 |> double(double(...)))\n assert 4 == (2 |> double_fst(1))\n assert 4 == (2 |> double_fst(..., 1))\n assert 8 == (2 |> double_fst(double(...), 1))\n assert 4 == (2 |> double_snd(1, ...))\n assert 8 == (2 |> double_snd(1, double(...)))\n assert 3 == (2 |> add_snd_thd(1, ..., 1))\n assert 4 == (2 |> add_snd_thd(1, ..., ...))\n assert 6 == (2 |> add_snd_thd(1, ..., double(...)))\n for x <- [:yes, 2, nil, false] do\n assert {:ok, x} == (x |> {:ok, ...})\n end\n end\nend\n```\n\nA few little extra features you might notice here:\n* You can move the parameter into a subexpression, as in `2 |> double_fst(double(...), 1)` where\n double will be called before the parameter is passed to `double_fst`.\n* You can use `...` multiple times, substituting it in multiple places.\n* The right hand side need not even be a function call, you can use any expression with `...`.","ref":"Arrows.html#documentation"},{"type":"extras","title":"Ok-pipe - Arrows","doc":"`Arrows` also provides an `ok-pipe` operator, `~>`, which only pipes into the next function if the result from the last one was considered a success. It's inspired by [OK](https://hexdocs.pm/ok/readme.html), but we have chosen to do things slightly differently so it better fits with our regular pipe.\n\ninput | result |\n:----------------------- | :-------------- |\n`{:ok, x}` | `fun.(x)` |\n`{:error, e}` | `{:error, e}` |\n`nil` | `nil` |\n`x when not is_nil(x)` | `fun.(x)` |\n\nIn the case of a function returning an ok/error tuple being on the left hand side, this is straightforward to determine. In the event of `{:ok, x}`, x will be passed into the right hand side to call. In the event of `{:error, x}`, the result will be `{:error, x}`.\n\nWe also deal with a lot of functions that indicate failure by returning nil. `~>` tries to 'do what I mean' for both of these so you can have one pipe operator to rule them all. If `nil` is a valid result, you must thus be sure to wrap it in an `ok` tuple when it occurs on the left hand side of `~>`.\n\n`|>` and `~>` compose in the way you'd expect; i.e. a `~>` receiving an error tuple or nil will stop executing the rest of the chain of (mixed) pipes.\n\n\nDocumentation can be found at [https://hexdocs.pm/arrows](https://hexdocs.pm/arrows).","ref":"Arrows.html#ok-pipe"},{"type":"extras","title":"Exto","doc":"# Exto\n\n[![hex.pm](https://img.shields.io/hexpm/v/exto)](https://hex.pm/packages/exto)\n[hexdocs](https://hexdocs.pm/exto)\n\n`Exto` provides configuration-driven Ecto schema extensibility","ref":"Exto.html"},{"type":"extras","title":"Usage - Exto","doc":"","ref":"Exto.html#usage"},{"type":"extras","title":"Example Schema - Exto","doc":"```elixir\ndefmodule My.Schema do\n use Ecto.Schema\n import Exto, only: [flex_schema: 1]\n\n schema \"my_table\" do\n field :name, :string # just normal schema things\n flex_schema(:my_app) # boom! give me the stuff\n end\nend\n```\n\nOr if you want the `Access` protocol to be auto-implemented on the struct (because [the reasoning](https://hexdocs.pm/elixir/Access.html#module-maps-and-structs) for not having it on structs doesn't apply as much when using Exto), you can pull in the `Accessible` library by simply using `use Exto` instead of `import Exto`.","ref":"Exto.html#example-schema"},{"type":"extras","title":"Example configuration - Exto","doc":"```elixir\nconfig :my_app, My.Schema,\n belongs_to: [\n foo: Foo, # belongs_to :foo, Foo\n bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer\n ],\n field: [\n foo: :string, # field :foo, :string\n bar: {:integer, default: 4}, # field :foo, :integer, default: 4\n ],\n has_one: [\n foo: Foo, # has_one :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id\n ]\n has_many: [\n foo: Foo, # has_many :foo, Foo\n bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id\n ]\n many_to_many: [\n foo: Foo, # many_to_many :foo, Foo\n bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar\n ]\n```\n\nThis example won't work very well because it is redefining `foo` and `bar` 5 times, but you get the point.\n\nReading of configuration is done during compile time. The relations will be baked in during compilation, thus:\n\n* Do not expect this to work in runtime config.\n* You will need to rebuild all dependencies which use this macro when you change their configuration.","ref":"Exto.html#example-configuration"},{"type":"extras","title":"Copyright and License - Exto","doc":"Copyright (c) 2020 Exto Contributors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","ref":"Exto.html#copyright-and-license"},{"type":"extras","title":"Absinthe Client","doc":"# Absinthe Client\n\n`AbsintheClient` is an Elixir library to perform server-side queries on a local Absinthe-based GraphQL API.\n\nIt is a WIP adaption of `Absinthe.Phoenix.Controller` that can be used with LiveView or in any other context.\n\nUsage:\n\n```elixir\ndefmodule MyApp.Web.WidgetsLive do\n use MyApp.Web, :live_view\n\n use AbsintheClient, schema: Bonfire.API.GraphQL.Schema, action: [mode: :internal]\n\n def mount(params, session, socket) do\n widgets = awesome_widgets(socket)\n IO.inspect(widgets)\n\n {:ok, socket\n |> assign(\n widgets: widgets\n )}\n end\n\n # notice we use snakecase rather than camelcase\n @graphql \"\"\"\n {\n awesome_widgets\n }\n \"\"\"\n def awesome_widgets(socket), do: liveql(socket, :awesome_widgets)\n\nend\n```","ref":"AbsintheClient.html"},{"type":"extras","title":"License - Absinthe Client","doc":"See [LICENSE.md](./LICENSE.md).","ref":"AbsintheClient.html#license"},{"type":"extras","title":"Classic","doc":"| Package | License | Version | Link |\n|------------------------------|------------------------------------|------------|------------------------------------------------------------------|\n| absinthe | MIT | 1.7.0 | https://hex.pm/packages/absinthe |\n| absinthe_error_payload | BSD-3; Unrecognized license | 1.1.4 | https://hex.pm/packages/absinthe_error_payload |\n| absinthe_phoenix | MIT | 2.0.2 | https://hex.pm/packages/absinthe_phoenix |\n| absinthe_plug | MIT | 1.5.8 | https://hex.pm/packages/absinthe_plug |\n| activity_pub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/activity_pub |\n| argon2_elixir | Apache 2.0 | ~> 3.0 | https://hex.pm/packages/argon2_elixir |\n| arrows | Undefined | 0.1.0 | https://github.com/bonfire-networks/arrows |\n| bamboo | MIT | 2.2.0 | https://hex.pm/packages/bamboo |\n| bamboo_smtp | MIT | 4.2.1 | https://hex.pm/packages/bamboo_smtp |\n| benchee | MIT | 1.1.0 | https://hex.pm/packages/benchee |\n| benchee_html | MIT | 1.0.0 | https://hex.pm/packages/benchee_html |\n| benchee_json | MIT | 1.0.0 | https://hex.pm/packages/benchee_json |\n| bonfire_api_graphql | MPL 2.0 | | https://github.com/bonfire-networks/bonfire_api_graphql |\n| bonfire_boundaries | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_boundaries |\n| bonfire_classify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_classify |\n| bonfire_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_common |\n| bonfire_data_access_control | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_access_control |\n| bonfire_data_activity_pub | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_activity_pub |\n| bonfire_data_edges | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_edges |\n| bonfire_data_identity | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_identity |\n| bonfire_data_shared_user | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_shared_user |\n| bonfire_data_social | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_social |\n| bonfire_ecto | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_ecto |\n| bonfire_editor_ck | MIT | 0.1.0 | https://github.com/bonfire-networks/bonfire_editor_ck |\n| bonfire_editor_quill | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_editor_quill |\n| bonfire_epics | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_epics |\n| bonfire_fail | MPL 2.0 | | https://github.com/bonfire-networks/bonfire_fail |\n| bonfire_federate_activitypub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_federate_activitypub |\n| bonfire_files | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_files |\n| bonfire_invite_links | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_invite_links |\n| bonfire_mailer | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_mailer |\n| bonfire_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_me |\n| bonfire_search | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_search |\n| bonfire_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_social |\n| bonfire_tag | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_tag |\n| bonfire_ui_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_common |\n| bonfire_ui_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_me |\n| bonfire_ui_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_social |\n| cachex | MIT | 3.4.0 | https://hex.pm/packages/cachex |\n| certifi | BSD | 2.9.0 | https://hex.pm/packages/certifi |\n| cldr_utils | Apache 2.0 | 2.17.2 | https://hex.pm/packages/cldr_utils |\n| combine | MIT | 0.10.0 | https://hex.pm/packages/combine |\n| comeonin | BSD-3-Clause; Unrecognized license | 5.3.3 | https://hex.pm/packages/comeonin |\n| connection | Apache 2.0 | 1.1.0 | https://hex.pm/packages/connection |\n| cowboy | ISC | 2.9.0 | https://hex.pm/packages/cowboy |\n| cowboy_telemetry | Apache 2.0 | 0.4.0 | https://hex.pm/packages/cowboy_telemetry |\n| cowlib | ISC | 2.11.0 | https://hex.pm/packages/cowlib |\n| dataloader | MIT | 1.0.10 | https://hex.pm/packages/dataloader |\n| db_connection | Apache 2.0 | 2.4.2 | https://hex.pm/packages/db_connection |\n| decimal | Apache 2.0 | 2.0.0 | https://hex.pm/packages/decimal |\n| deep_merge | MIT | 1.0.0 | https://hex.pm/packages/deep_merge |\n| earmark | Apache 2.0 | 1.4.28 | https://hex.pm/packages/earmark |\n| earmark_parser | Apache 2.0 | 1.4.26 | https://hex.pm/packages/earmark_parser |\n| ecto | Apache 2.0 | 3.8.4 | https://hex.pm/packages/ecto |\n| ecto_erd | Apache 2.0 | 0.4.2 | https://hex.pm/packages/ecto_erd |\n| ecto_materialized_path | Apache 2.0 | 0.3.0 | https://github.com/bonfire-networks/ecto_materialized_path |\n| ecto_psql_extras | MIT | 0.7.4 | https://hex.pm/packages/ecto_psql_extras |\n| ecto_shorts | MIT | 1.1.1 | https://github.com/bonfire-networks/ecto_shorts |\n| ecto_sparkles | Undefined | 0.1.0 | https://github.com/bonfire-networks/ecto_sparkles |\n| ecto_sql | Apache 2.0 | 3.8.3 | https://hex.pm/packages/ecto_sql |\n| elixir_make | Apache 2.0 | ~> 0.6 | https://hex.pm/packages/elixir_make |\n| email_checker | MIT | 0.2.4 | https://hex.pm/packages/email_checker |\n| emote | Undefined | 0.1.0 | https://github.com/bonfire-networks/emote |\n| eqrcode | MIT | 0.1.10 | https://hex.pm/packages/eqrcode |\n| eternal | MIT | 1.2.2 | https://hex.pm/packages/eternal |\n| ex_aws | MIT | 2.3.2 | https://hex.pm/packages/ex_aws |\n| ex_aws_s3 | MIT | 2.3.2 | https://hex.pm/packages/ex_aws_s3 |\n| ex_cldr | Apache 2.0 | 2.30.0 | https://hex.pm/packages/ex_cldr |\n| ex_cldr_languages | Apache 2.0 | 0.3.3 | https://hex.pm/packages/ex_cldr_languages |\n| ex_cldr_plugs | Apache 2.0 | 1.0.0 | https://hex.pm/packages/ex_cldr_plugs |\n| ex_doc | Apache 2.0 | 0.28.4 | https://hex.pm/packages/ex_doc |\n| ex_machina | MIT | ~> 2.4 | https://hex.pm/packages/ex_machina |\n| ex_ulid | Apache 2.0 | 0.1.0 | https://hex.pm/packages/ex_ulid |\n| ex_unit_notifier | MIT | ~> 1.0 | https://hex.pm/packages/ex_unit_notifier |\n| exsync | BSD 3-Clause; Unrecognized license | 0.2.4 | https://hex.pm/packages/exsync |\n| faker | MIT | 0.17.0 | https://hex.pm/packages/faker |\n| fast_ngram | MIT | 1.2.0 | https://hex.pm/packages/fast_ngram |\n| faviconic | MIT | 0.1.3 | https://hex.pm/packages/faviconic |\n| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |\n| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |\n| flame_on | MIT | 0.5.0 | https://hex.pm/packages/flame_on |\n| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |\n| floki | MIT | 0.32.1 | https://hex.pm/packages/floki |\n| gen_smtp | BSD-2-Clause; Unrecognized license | 1.2.0 | https://hex.pm/packages/gen_smtp |\n| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |\n| gettext | Apache 2.0 | 0.19.1 | https://hex.pm/packages/gettext |\n| grumble | Apache 2.0 | ~> 0.1.3 | https://hex.pm/packages/grumble |\n| hackney | Apache 2.0 | 1.18.1 | https://hex.pm/packages/hackney |\n| html_entities | MIT | 0.5.2 | https://hex.pm/packages/html_entities |\n| html_sanitize_ex | MIT | 1.4.2 | https://hex.pm/packages/html_sanitize_ex |\n| http_signatures | GPL v3 | 0.1.0 | https://git.pleroma.social/pleroma/http_signatures.git |\n| httpoison | MIT | 1.8.1 | https://hex.pm/packages/httpoison |\n| idna | MIT | 6.1.1 | https://hex.pm/packages/idna |\n| inflex | Apache 2.0 | 2.1.0 | https://hex.pm/packages/inflex |\n| jason | Apache 2.0 | 1.3.0 | https://hex.pm/packages/jason |\n| jumper | MIT | 1.0.1 | https://hex.pm/packages/jumper |\n| libgraph | MIT | 0.13.3 | https://hex.pm/packages/libgraph |\n| licensir | MIT | 0.7.0 | https://github.com/bonfire-networks/licensir |\n| linkify | MIT | 0.2.0 | https://github.com/bonfire-networks/linkify |\n| makeup | BSD; Unrecognized license | 1.1.0 | https://hex.pm/packages/makeup |\n| makeup_diff | MIT | 0.1.0 | https://hex.pm/packages/makeup_diff |\n| makeup_eex | BSD; Unrecognized license | 0.1.1 | https://hex.pm/packages/makeup_eex |\n| makeup_elixir | BSD; Unrecognized license | 0.16.0 | https://hex.pm/packages/makeup_elixir |\n| makeup_erlang | BSD | 0.1.1 | https://hex.pm/packages/makeup_erlang |\n| makeup_graphql | BSD | 0.1.2 | https://hex.pm/packages/makeup_graphql |\n| makeup_html | MIT | 0.1.0 | https://hex.pm/packages/makeup_html |\n| makeup_js | MIT | 0.1.0 | https://hex.pm/packages/makeup_js |\n| makeup_sql | BSD | 0.1.0 | https://hex.pm/packages/makeup_sql |\n| meck | Apache 2.0 | 0.9.2 | https://hex.pm/packages/meck |\n| metrics | BSD | 1.0.1 | https://hex.pm/packages/metrics |\n| mime | Apache 2.0 | 1.6.0 | https://hex.pm/packages/mime |\n| mimerl | MIT | 1.2.0 | https://hex.pm/packages/mimerl |\n| mimetype_parser | MIT | 0.1.3 | https://hex.pm/packages/mimetype_parser |\n| mix_test_interactive | MIT | ~> 1.2 | https://hex.pm/packages/mix_test_interactive |\n| mix_test_watch | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_watch |\n| mix_unused | MIT; Unrecognized license | 0.4.0 | https://hex.pm/packages/mix_unused |\n| mochiweb | MIT | 2.22.0 | https://hex.pm/packages/mochiweb |\n| mock | MIT | ~> 0.3 | https://hex.pm/packages/mock |\n| mogrify | MIT | 0.9.1 | https://hex.pm/packages/mogrify |\n| mox | Apache 2.0 | ~> 1.0 | https://hex.pm/packages/mox |\n| nimble_parsec | Apache 2.0 | 1.2.3 | https://hex.pm/packages/nimble_parsec |\n| nimble_totp | Apache 2.0 | 0.2.0 | https://hex.pm/packages/nimble_totp |\n| nodeinfo | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/nodeinfo |\n| oban | Apache 2.0 | 2.8.0 | https://hex.pm/packages/oban |\n| paginator | MIT | 1.0.4 | https://github.com/bonfire-networks/paginator |\n| pane | MIT | 0.4.1 | https://hex.pm/packages/pane |\n| parse_trans | Apache 2.0 | 3.3.1 | https://hex.pm/packages/parse_trans |\n| pbkdf2_elixir | BSD-3-Clause; Unrecognized license | 2.0.0 | https://hex.pm/packages/pbkdf2_elixir |\n| periscope | Apache 2.0 | 0.4.6 | https://hex.pm/packages/periscope |\n| phoenix | MIT | 1.6.10 | https://hex.pm/packages/phoenix |\n| phoenix_ecto | MIT | 4.4.0 | https://hex.pm/packages/phoenix_ecto |\n| phoenix_gon | MIT | 0.4.1 | https://github.com/bonfire-networks/phoenix_gon |\n| phoenix_html | MIT | 3.2.0 | https://hex.pm/packages/phoenix_html |\n| phoenix_live_dashboard | MIT | 0.6.5 | https://hex.pm/packages/phoenix_live_dashboard |\n| phoenix_live_reload | MIT | 1.3.3 | https://hex.pm/packages/phoenix_live_reload |\n| phoenix_live_view | MIT | 0.17.10 | https://hex.pm/packages/phoenix_live_view |\n| phoenix_pubsub | MIT | 2.1.1 | https://hex.pm/packages/phoenix_pubsub |\n| phoenix_view | MIT | 1.1.2 | https://hex.pm/packages/phoenix_view |\n| plug | Apache 2.0 | 1.13.6 | https://hex.pm/packages/plug |\n| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |\n| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |\n| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |\n| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |\n| postgrex | Apache 2.0 | 0.16.3 | https://hex.pm/packages/postgrex |\n| pseudo_gettext | Undefined | 0.1.0 | https://github.com/tmbb/pseudo_gettext |\n| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |\n| recase | MIT | 0.7.0 | https://hex.pm/packages/recase |\n| redirect | Apache 2.0 | 0.3.0 | https://hex.pm/packages/redirect |\n| scribe | MIT | 0.10.0 | https://hex.pm/packages/scribe |\n| sentry | MIT | 8.0.6 | https://hex.pm/packages/sentry |\n| sleeplocks | MIT | 1.1.1 | https://hex.pm/packages/sleeplocks |\n| sobelow | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sobelow |\n| solid | MIT | 0.12.0 | https://hex.pm/packages/solid |\n| sourceror | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sourceror |\n| ssl_verify_fun | MIT | 1.1.6 | https://hex.pm/packages/ssl_verify_fun |\n| statistex | MIT | 1.0.0 | https://hex.pm/packages/statistex |\n| surface | MIT | 0.7.4 | https://hex.pm/packages/surface |\n| surface_heroicons | Undefined | 0.5.3 | https://github.com/rocketinsights/surface_heroicons |\n| sweet_xml | MIT | 0.7.3 | https://hex.pm/packages/sweet_xml |\n| table_rex | MIT | 3.1.1 | https://hex.pm/packages/table_rex |\n| telemetry | Apache 2.0 | 1.1.0 | https://hex.pm/packages/telemetry |\n| telemetry_metrics | Apache 2.0 | 0.6.1 | https://hex.pm/packages/telemetry_metrics |\n| telemetry_poller | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry_poller |\n| tesla | MIT | 1.4.4 | https://hex.pm/packages/tesla |\n| timex | MIT | 3.7.8 | https://hex.pm/packages/timex |\n| twinkle_star | GPL v3 | 0.1.0 | https://github.com/bonfire-networks/twinkle_star |\n| typed_struct | MIT | ~> 0.3.0 | https://hex.pm/packages/typed_struct |\n| tzdata | MIT | 1.1.1 | https://hex.pm/packages/tzdata |\n| unicode_util_compat | Apache 2.0 | 0.7.0 | https://hex.pm/packages/unicode_util_compat |\n| unsafe | MIT | 1.0.1 | https://hex.pm/packages/unsafe |\n| verbs | MIT | 0.6.1 | https://github.com/shannonwells/verbs_ex |\n| voodoo | Undefined | 0.1.0 | https://github.com/bonfire-networks/voodoo |\n| waffle | Apache 2.0 | 1.1.6 | https://hex.pm/packages/waffle |\n| wallaby | MIT | ~> 0.29.1 | https://hex.pm/packages/wallaby |\n| web_driver_client | MIT | ~> 0.2.0 | https://hex.pm/packages/web_driver_client |\n| where | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/untangle |\n| zest | Apache 2.0 | 0.1.2 | https://hex.pm/packages/zest |\n|------------------------------|------------------------------------|------------|------------------------------------------------------------------|","ref":"deps-classic.html"},{"type":"extras","title":"Cooperation","doc":"| Package | License | Version | Link |\n|------------------------------|------------------------------------|----------|------------------------------------------------------------------|\n| absinthe | MIT | 1.7.0 | https://hex.pm/packages/absinthe |\n| absinthe_client | MIT | 2.0.0 | https://github.com/bonfire-networks/absinthe_client.git |\n| absinthe_error_payload | BSD-3; Unrecognized license | 1.1.4 | https://hex.pm/packages/absinthe_error_payload |\n| absinthe_phoenix | MIT | 2.0.2 | https://hex.pm/packages/absinthe_phoenix |\n| absinthe_plug | MIT | 1.5.8 | https://hex.pm/packages/absinthe_plug |\n| activity_pub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/activity_pub |\n| argon2_elixir | Apache 2.0 | ~> 2.4 | https://hex.pm/packages/argon2_elixir |\n| arrows | Undefined | 0.1.0 | https://github.com/bonfire-networks/arrows |\n| bamboo | MIT | 2.2.0 | https://hex.pm/packages/bamboo |\n| bamboo_smtp | MIT | 4.1.0 | https://hex.pm/packages/bamboo_smtp |\n| bonfire_api_graphql | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_api_graphql |\n| bonfire_boundaries | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_boundaries |\n| bonfire_breadpub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_breadpub |\n| bonfire_classify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_classify |\n| bonfire_common | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_common |\n| bonfire_data_access_control | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_access_control |\n| bonfire_data_activity_pub | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_activity_pub |\n| bonfire_data_assort | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_assort |\n| bonfire_data_edges | Undefined | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_edges |\n| bonfire_data_identity | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_identity |\n| bonfire_data_shared_user | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_shared_user |\n| bonfire_data_social | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_data_social |\n| bonfire_editor_ck | MIT | 0.1.0 | https://github.com/bonfire-networks/bonfire_editor_ck |\n| bonfire_epics | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_epics |\n| bonfire_fail | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_fail |\n| bonfire_federate_activitypub | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_federate_activitypub |\n| bonfire_files | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_files |\n| bonfire_geolocate | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_geolocate |\n| bonfire_invite_links | AGPL v3 | 0.0.1 | https://github.com/bonfire-networks/bonfire_invite_links |\n| bonfire_mailer | MPL 2.0 | 0.1.0 | https://github.com/bonfire-networks/bonfire_mailer |\n| bonfire_me | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_me |\n| bonfire_quantify | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_quantify |\n| bonfire_search | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_search |\n| bonfire_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_social |\n| bonfire_tag | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_tag |\n| bonfire_ui_coordination | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_coordination |\n| bonfire_ui_kanban | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_kanban |\n| bonfire_ui_social | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_social |\n| bonfire_ui_valueflows | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_ui_valueflows |\n| bonfire_valueflows | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_valueflows |\n| bonfire_valueflows_observe | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_valueflows_observe |\n| bonfire_website | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/bonfire_website |\n| cachex | MIT | 3.4.0 | https://hex.pm/packages/cachex |\n| certifi | BSD | 2.9.0 | https://hex.pm/packages/certifi |\n| cldr_utils | Apache 2.0 | 2.17.1 | https://hex.pm/packages/cldr_utils |\n| combine | MIT | 0.10.0 | https://hex.pm/packages/combine |\n| comeonin | BSD-3-Clause; Unrecognized license | 5.3.3 | https://hex.pm/packages/comeonin |\n| connection | Apache 2.0 | 1.1.0 | https://hex.pm/packages/connection |\n| cowboy | ISC | 2.9.0 | https://hex.pm/packages/cowboy |\n| cowboy_telemetry | Apache 2.0 | 0.4.0 | https://hex.pm/packages/cowboy_telemetry |\n| cowlib | ISC | 2.11.0 | https://hex.pm/packages/cowlib |\n| dataloader | MIT | 1.0.10 | https://hex.pm/packages/dataloader |\n| db_connection | Apache 2.0 | 2.4.1 | https://hex.pm/packages/db_connection |\n| decimal | Apache 2.0 | 2.0.0 | https://hex.pm/packages/decimal |\n| earmark | Apache 2.0 | 1.4.20 | https://hex.pm/packages/earmark |\n| earmark_parser | Apache 2.0 | 1.4.18 | https://hex.pm/packages/earmark_parser |\n| ecto | Apache 2.0 | 3.7.1 | https://hex.pm/packages/ecto |\n| ecto_erd | Apache 2.0 | 0.4.1 | https://hex.pm/packages/ecto_erd |\n| ecto_materialized_path | Apache 2.0 | 0.3.0 | https://github.com/bonfire-networks/ecto_materialized_path |\n| ecto_psql_extras | MIT | 0.7.4 | https://hex.pm/packages/ecto_psql_extras |\n| ecto_ranked | MIT | 0.5.0 | https://hex.pm/packages/ecto_ranked |\n| ecto_shorts | MIT | 1.1.1 | https://github.com/bonfire-networks/ecto_shorts |\n| ecto_sparkles | Undefined | 0.1.0 | https://github.com/bonfire-networks/ecto_sparkles |\n| ecto_sql | Apache 2.0 | 3.7.2 | https://hex.pm/packages/ecto_sql |\n| eflambe | Apache 2.0 | 0.2.2 | https://hex.pm/packages/eflambe |\n| elixir_make | Apache 2.0 | ~> 0.6 | https://hex.pm/packages/elixir_make |\n| email_checker | MIT | 0.2.4 | https://hex.pm/packages/email_checker |\n| emote | Undefined | 0.1.0 | https://github.com/bonfire-networks/emote |\n| eternal | MIT | 1.2.2 | https://hex.pm/packages/eternal |\n| ex_cldr | Apache 2.0 | 2.26.1 | https://hex.pm/packages/ex_cldr |\n| ex_doc | Apache 2.0 | 0.28.1 | https://hex.pm/packages/ex_doc |\n| ex_machina | MIT | ~> 2.4 | https://hex.pm/packages/ex_machina |\n| ex_unit_notifier | MIT | ~> 1.0 | https://hex.pm/packages/ex_unit_notifier |\n| exsync | BSD 3-Clause; Unrecognized license | 0.2.4 | https://hex.pm/packages/exsync |\n| faker | MIT | 0.17.0 | https://hex.pm/packages/faker |\n| fast_ngram | MIT | 1.2.0 | https://hex.pm/packages/fast_ngram |\n| file_info | MIT | 0.0.4 | https://hex.pm/packages/file_info |\n| file_system | WTFPL | 0.2.10 | https://hex.pm/packages/file_system |\n| flame_on | MIT | 0.2.1 | https://hex.pm/packages/flame_on |\n| exto | Apache 2.0 | 0.2.3 | https://github.com/bonfire-networks/exto |\n| floki | MIT | 0.32.0 | https://hex.pm/packages/floki |\n| gen_smtp | BSD 2-clause; Unrecognized license | 1.1.1 | https://hex.pm/packages/gen_smtp |\n| geo | MIT | 3.4.3 | https://hex.pm/packages/geo |\n| geo_postgis | MIT | 3.4.1 | https://hex.pm/packages/geo_postgis |\n| geocoder | MIT | 1.1.4 | https://hex.pm/packages/geocoder |\n| geohash | Apache 2.0 | 1.2.2 | https://hex.pm/packages/geohash |\n| gettext | Apache 2.0 | 0.19.1 | https://hex.pm/packages/gettext |\n| git_diff | MIT | 0.6.3 | https://hex.pm/packages/git_diff |\n| grumble | Apache 2.0 | ~> 0.1.3 | https://hex.pm/packages/grumble |\n| hackney | Apache 2.0 | 1.18.1 | https://hex.pm/packages/hackney |\n| html_entities | MIT | 0.5.2 | https://hex.pm/packages/html_entities |\n| html_sanitize_ex | MIT | 1.4.2 | https://hex.pm/packages/html_sanitize_ex |\n| http_signatures | GPL v3 | 0.1.0 | https://git.pleroma.social/pleroma/http_signatures.git |\n| httpoison | MIT | 1.8.0 | https://hex.pm/packages/httpoison |\n| hut | MIT | 1.3.0 | https://hex.pm/packages/hut |\n| idna | MIT | 6.1.1 | https://hex.pm/packages/idna |\n| inflex | Apache 2.0 | 2.1.0 | https://hex.pm/packages/inflex |\n| jason | Apache 2.0 | 1.3.0 | https://hex.pm/packages/jason |\n| jumper | MIT | 1.0.1 | https://hex.pm/packages/jumper |\n| licensir | MIT | 0.7.0 | https://github.com/bonfire-networks/licensir |\n| linkify | MIT | 0.2.0 | https://github.com/bonfire-networks/linkify |\n| makeup | BSD; Unrecognized license | 1.0.5 | https://hex.pm/packages/makeup |\n| makeup_elixir | BSD; Unrecognized license | 0.15.2 | https://hex.pm/packages/makeup_elixir |\n| makeup_erlang | BSD | 0.1.1 | https://hex.pm/packages/makeup_erlang |\n| mappable | New BSD | 0.2.4 | https://hex.pm/packages/mappable |\n| meck | Apache 2.0 | 0.9.2 | https://hex.pm/packages/meck |\n| metrics | BSD | 1.0.1 | https://hex.pm/packages/metrics |\n| mime | Apache 2.0 | 1.6.0 | https://hex.pm/packages/mime |\n| mimerl | MIT | 1.2.0 | https://hex.pm/packages/mimerl |\n| mimetype_parser | MIT | 0.1.3 | https://hex.pm/packages/mimetype_parser |\n| mix_test_interactive | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_interactive |\n| mix_test_watch | MIT | ~> 1.0 | https://hex.pm/packages/mix_test_watch |\n| mix_unused | MIT; Unrecognized license | 0.3.0 | https://hex.pm/packages/mix_unused |\n| mochiweb | MIT | 2.22.0 | https://hex.pm/packages/mochiweb |\n| mock | MIT | ~> 0.3 | https://hex.pm/packages/mock |\n| neuron | ISC | 5.0.0 | https://hex.pm/packages/neuron |\n| nimble_parsec | Apache 2.0 | 1.2.2 | https://hex.pm/packages/nimble_parsec |\n| nodeinfo | AGPL v3 | 0.1.0 | https://github.com/bonfire-networks/nodeinfo |\n| oban | Apache 2.0 | 2.8.0 | https://hex.pm/packages/oban |\n| ok | Apache 2.0 | 2.3.0 | https://hex.pm/packages/ok |\n| paginator | MIT | 1.0.4 | https://github.com/bonfire-networks/paginator |\n| pane | MIT | 0.4.1 | https://hex.pm/packages/pane |\n| parse_trans | Apache 2.0 | 3.3.1 | https://hex.pm/packages/parse_trans |\n| pbkdf2_elixir | BSD-3-Clause; Unrecognized license | 1.4.2 | https://hex.pm/packages/pbkdf2_elixir |\n| phil_columns | MIT | 3.1.0 | https://hex.pm/packages/phil_columns |\n| phoenix | MIT | 1.6.6 | https://hex.pm/packages/phoenix |\n| phoenix_ecto | MIT | 4.4.0 | https://hex.pm/packages/phoenix_ecto |\n| phoenix_gon | MIT | 0.4.1 | https://github.com/bonfire-networks/phoenix_gon |\n| phoenix_html | MIT | 3.2.0 | https://hex.pm/packages/phoenix_html |\n| phoenix_live_dashboard | MIT | 0.6.5 | https://hex.pm/packages/phoenix_live_dashboard |\n| phoenix_live_reload | MIT | 1.3.3 | https://hex.pm/packages/phoenix_live_reload |\n| phoenix_live_view | MIT | 0.17.7 | https://hex.pm/packages/phoenix_live_view |\n| phoenix_pubsub | MIT | 2.0.0 | https://hex.pm/packages/phoenix_pubsub |\n| phoenix_view | MIT | 1.1.2 | https://hex.pm/packages/phoenix_view |\n| plug | Apache 2.0 | 1.13.3 | https://hex.pm/packages/plug |\n| plug_cowboy | Apache 2.0 | 2.5.2 | https://hex.pm/packages/plug_cowboy |\n| plug_crypto | Apache 2.0 | 1.2.2 | https://hex.pm/packages/plug_crypto |\n| pointers | Apache 2.0 | 0.6.0 | https://github.com/bonfire-networks/pointers |\n| needle_ulid | MIT | 0.2.2 | https://github.com/bonfire-networks/needle_ulid |\n| poolboy | Unlicense; Apache 2.0; ISC | 1.5.2 | https://hex.pm/packages/poolboy |\n| postgrex | Apache 2.0 | 0.16.2 | https://hex.pm/packages/postgrex |\n| ranch | ISC | 1.8.0 | https://hex.pm/packages/ranch |\n| recase | MIT | 0.7.0 | https://hex.pm/packages/recase |\n| redirect | Apache 2.0 | 0.3.0 | https://hex.pm/packages/redirect |\n| scribe | MIT | 0.10.0 | https://hex.pm/packages/scribe |\n| sentry | MIT | 8.0.6 | https://hex.pm/packages/sentry |\n| sleeplocks | MIT | 1.1.1 | https://hex.pm/packages/sleeplocks |\n| sobelow | Apache 2.0 | 0.11.1 | https://hex.pm/packages/sobelow |\n| sourceror | Apache 2.0 | 0.10.0 | https://hex.pm/packages/sourceror |\n| ssl_verify_fun | MIT | 1.1.6 | https://hex.pm/packages/ssl_verify_fun |\n| stream_data | Apache 2.0 | 0.5.0 | https://hex.pm/packages/stream_data |\n| surface | MIT | 0.7.1 | https://hex.pm/packages/surface |\n| surface_heroicons | Undefined | 0.5.3 | https://github.com/rocketinsights/surface_heroicons |\n| table_rex | MIT | 3.1.1 | https://hex.pm/packages/table_rex |\n| telemetry | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry |\n| telemetry_metrics | Apache 2.0 | 0.6.1 | https://hex.pm/packages/telemetry_metrics |\n| telemetry_poller | Apache 2.0 | 1.0.0 | https://hex.pm/packages/telemetry_poller |\n| tesla | MIT | 1.4.4 | https://hex.pm/packages/tesla |\n| timex | MIT | 3.7.6 | https://hex.pm/packages/timex |\n| towel | MIT | 0.2.1 | https://hex.pm/packages/towel |\n| twinkle_star | GPL v3 | 0.1.0 | https://github.com/bonfire-networks/twinkle_star |\n| typed_struct | MIT | ~> 0.2.1 | https://hex.pm/packages/typed_struct |\n| tzdata | MIT | 1.1.1 | https://hex.pm/packages/tzdata |\n| unicode_util_compat | Apache 2.0 | 0.7.0 | https://hex.pm/packages/unicode_util_compat |\n| unsafe | MIT | 1.0.1 | https://hex.pm/packages/unsafe |\n| verbs | MIT | 0.6.1 | https://github.com/shannonwells/verbs_ex |\n| voodoo | Undefined | 0.1.0 | https://github.com/bonfire-networks/voodoo |\n| waffle | Apache 2.0 | 1.1.6 | https://hex.pm/packages/waffle |\n| where | Apache 2.0 | 0.1.0 | https://github.com/bonfire-networks/untangle |\n| zest | Apache 2.0 | 0.1.2 | https://hex.pm/packages/zest |\n|------------------------------|------------------------------------|----------|------------------------------------------------------------------|","ref":"deps-cooperation.html"}],"producer":{"name":"ex_doc","version":[48,46,51,52,46,50]},"content_type":"text/markdown"} \ No newline at end of file diff --git a/dist/sidebar_items-4535CF76.js b/dist/sidebar_items-4535CF76.js deleted file mode 100644 index d79363e1bc..0000000000 --- a/dist/sidebar_items-4535CF76.js +++ /dev/null @@ -1 +0,0 @@ -sidebarNodes={"modules":[{"id":"Bonfire.Data.AccessControl.Acl","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Acl","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Acl","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(acl \\\\ %Acl{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Circle","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Circle","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Circle","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(circle \\\\ %Circle{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Controlled","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Controlled","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Controlled","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(controlled \\\\ %Controlled{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Encircle","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Encircle","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Encircle","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(encircle \\\\ %Encircle{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Grant","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Grant","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Grant","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(grant \\\\ %Grant{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.InstanceAdmin","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.InstanceAdmin","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.InstanceAdmin","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(admin \\\\ %InstanceAdmin{}, params, cast \\\\ [:is_instance_admin])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Stereotyped","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Stereotyped","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Stereotyped","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(stereotype \\\\ %Stereotyped{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Verb","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Verb","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Verb","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(verb \\\\ %Verb{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Actor","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Actor","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Actor","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(actor \\\\ %Actor{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Actor.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Actor.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Actor.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_actor_table/0","deprecated":false,"title":"create_actor_table()","anchor":"create_actor_table/0"},{"id":"create_actor_table/1","deprecated":false,"title":"create_actor_table(list)","anchor":"create_actor_table/1"},{"id":"drop_actor_table/0","deprecated":false,"title":"drop_actor_table()","anchor":"drop_actor_table/0"},{"id":"migrate_actor/0","deprecated":false,"title":"migrate_actor()","anchor":"migrate_actor/0"},{"id":"migrate_actor/1","deprecated":false,"title":"migrate_actor(dir)","anchor":"migrate_actor/1"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Peer","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Peer","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Peer","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(peer \\\\ %Peer{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Peered","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Peered","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Peered","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(peered \\\\ %Peered{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Assort.Ranked","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Assort.Ranked","sections":[],"nested_context":"Bonfire.Data","nested_title":".Assort.Ranked","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(model \\\\ %Ranked{}, params)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Assort.Ranked.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Assort.Ranked.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".Assort.Ranked.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_ranked_table/0","deprecated":false,"title":"create_ranked_table()","anchor":"create_ranked_table/0"},{"id":"create_ranked_table/1","deprecated":false,"title":"create_ranked_table(list)","anchor":"create_ranked_table/1"},{"id":"create_unique_index/1","deprecated":false,"title":"create_unique_index(opts \\\\ [])","anchor":"create_unique_index/1"},{"id":"drop_ranked_table/0","deprecated":false,"title":"drop_ranked_table()","anchor":"drop_ranked_table/0"},{"id":"drop_unique_index/1","deprecated":false,"title":"drop_unique_index(opts \\\\ [])","anchor":"drop_unique_index/1"},{"id":"migrate_ranked/0","deprecated":false,"title":"migrate_ranked()","anchor":"migrate_ranked/0"},{"id":"migrate_ranked/1","deprecated":false,"title":"migrate_ranked(dir)","anchor":"migrate_ranked/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Edges.Edge","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Edges.Edge","sections":[],"nested_context":"Bonfire.Data","nested_title":".Edges.Edge","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(edge \\\\ %Edge{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Edges.EdgeTotal","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Edges.EdgeTotal","sections":[],"nested_context":"Bonfire.Data","nested_title":".Edges.EdgeTotal","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(me \\\\ %EdgeTotal{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Account","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Account","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Account","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(account \\\\ %Account{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Accounted","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Accounted","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Accounted","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(acc \\\\ %Accounted{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Alias","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Alias","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Alias","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(alias \\\\ %Alias{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.AuthSecondFactor","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.AuthSecondFactor","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.AuthSecondFactor","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(totp, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"valid_totp?/2","deprecated":false,"title":"valid_totp?(totp, code)","anchor":"valid_totp?/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.CareClosure","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.CareClosure","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.CareClosure","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_branch/1","deprecated":false,"title":"by_branch(branch)","anchor":"by_branch/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Caretaker","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Caretaker","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Caretaker","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(ct \\\\ %Caretaker{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Character","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Character","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Character","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(char \\\\ %Character{}, params, extra \\\\ nil)","anchor":"changeset/3"},{"id":"changeset_basic/2","deprecated":false,"title":"changeset_basic(char, params)","anchor":"changeset_basic/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"hash/1","deprecated":false,"title":"hash(name)","anchor":"hash/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"uniform/1","deprecated":false,"title":"uniform(name)","anchor":"uniform/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Credential","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Credential","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Credential","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(cred \\\\ %Credential{}, params)","anchor":"changeset/2"},{"id":"check_password/2","deprecated":false,"title":"check_password(password, hash)","anchor":"check_password/2"},{"id":"confirmation_changeset/2","deprecated":false,"title":"confirmation_changeset(cred \\\\ %Credential{}, params)","anchor":"confirmation_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"dummy_check/0","deprecated":false,"title":"dummy_check()","anchor":"dummy_check/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"hash_password/1","deprecated":false,"title":"hash_password(password)","anchor":"hash_password/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Credential.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Credential.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Credential.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_credential_table/0","deprecated":false,"title":"create_credential_table()","anchor":"create_credential_table/0"},{"id":"create_credential_table/1","deprecated":false,"title":"create_credential_table(list)","anchor":"create_credential_table/1"},{"id":"drop_credential_table/0","deprecated":false,"title":"drop_credential_table()","anchor":"drop_credential_table/0"},{"id":"migrate_credential/0","deprecated":false,"title":"migrate_credential()","anchor":"migrate_credential/0"},{"id":"migrate_credential/1","deprecated":false,"title":"migrate_credential(dir)","anchor":"migrate_credential/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Email","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Email","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Email","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(email \\\\ %Email{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"confirm/1","deprecated":false,"title":"confirm(email)","anchor":"confirm/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"may_confirm?/2","deprecated":false,"title":"may_confirm?(email, opts \\\\ [])","anchor":"may_confirm?/2"},{"id":"may_request_confirm_email?/2","deprecated":false,"title":"may_request_confirm_email?(email, opts \\\\ [])","anchor":"may_request_confirm_email?/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"put_token/1","deprecated":false,"title":"put_token(email)","anchor":"put_token/1"},{"id":"should_request_or_refresh?/2","deprecated":false,"title":"should_request_or_refresh?(email, opts \\\\ [])","anchor":"should_request_or_refresh?/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.ExtraInfo","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.ExtraInfo","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.ExtraInfo","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(extra_info \\\\ %ExtraInfo{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Named","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Named","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Named","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(hashtag \\\\ %Named{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"normalize_name/1","deprecated":false,"title":"normalize_name(name)","anchor":"normalize_name/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Self","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Self","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Self","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(self \\\\ %Self{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Settings","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Settings","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Settings","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(settings \\\\ %Settings{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.SettingsJSONSerdeData","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.SettingsJSONSerdeData","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.SettingsJSONSerdeData","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_json)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.User","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.User","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.User","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user \\\\ %User{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"maybe_redact/1","deprecated":false,"title":"maybe_redact(arg1)","anchor":"maybe_redact/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.SharedUser","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.SharedUser","sections":[],"nested_context":"Bonfire.Data","nested_title":".SharedUser","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user \\\\ %SharedUser{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.APActivity","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.APActivity","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.APActivity","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(activity \\\\ %APActivity{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Activity","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Activity","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Activity","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(activity \\\\ %Activity{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Bookmark","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Bookmark","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Bookmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(bookmark \\\\ %Bookmark{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Boost","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Boost","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Boost","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(boost \\\\ %Boost{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Created","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Created","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Created","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(created \\\\ %Created{}, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Emoji","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Emoji","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Emoji","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(emoji \\\\ %Emoji{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Feed","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Feed","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Feed","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(feed \\\\ %Feed{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.FeedPublish","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.FeedPublish","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.FeedPublish","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(pub \\\\ %FeedPublish{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Flag","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Flag","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Flag","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(flag \\\\ %Flag{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Follow","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Follow","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Follow","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(follow \\\\ %Follow{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Like","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Like","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Like","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(like \\\\ %Like{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Message","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Message","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Message","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(message \\\\ %Message{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Pin","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Pin","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Pin","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(pin \\\\ %Pin{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Post","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Post","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Post","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(post \\\\ %Post{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.PostContent","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.PostContent","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.PostContent","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(content \\\\ %PostContent{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Profile","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Profile","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Profile","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(profile \\\\ %Profile{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Replied","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Replied","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Replied","nodeGroups":[{"name":"Functions","nodes":[{"id":"ancestor_ids/1","deprecated":false,"title":"ancestor_ids(schema)","anchor":"ancestor_ids/1"},{"id":"ancestors/1","deprecated":false,"title":"ancestors(schema)","anchor":"ancestors/1"},{"id":"arrange/2","deprecated":false,"title":"arrange(structs_list, opts \\\\ [])","anchor":"arrange/2"},{"id":"build_child/1","deprecated":false,"title":"build_child(schema)","anchor":"build_child/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(replied \\\\ %Replied{}, attrs)","anchor":"changeset/2"},{"id":"children/1","deprecated":false,"title":"children(schema)","anchor":"children/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"depth/1","deprecated":false,"title":"depth(schema)","anchor":"depth/1"},{"id":"descendants/1","deprecated":false,"title":"descendants(schema)","anchor":"descendants/1"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"make_child_of/2","deprecated":false,"title":"make_child_of(changeset, parent)","anchor":"make_child_of/2"},{"id":"parent/1","deprecated":false,"title":"parent(schema)","anchor":"parent/1"},{"id":"parent_id/1","deprecated":false,"title":"parent_id(schema)","anchor":"parent_id/1"},{"id":"path/1","deprecated":false,"title":"path(schema)","anchor":"path/1"},{"id":"path_ids/1","deprecated":false,"title":"path_ids(schema)","anchor":"path_ids/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"root/1","deprecated":false,"title":"root(schema)","anchor":"root/1"},{"id":"root?/1","deprecated":false,"title":"root?(schema)","anchor":"root?/1"},{"id":"root_id/1","deprecated":false,"title":"root_id(schema)","anchor":"root_id/1"},{"id":"siblings/1","deprecated":false,"title":"siblings(schema)","anchor":"siblings/1"},{"id":"subtree/1","deprecated":false,"title":"subtree(schema)","anchor":"subtree/1"},{"id":"where_depth/2","deprecated":false,"title":"where_depth(query \\\\ __MODULE__, depth_params)","anchor":"where_depth/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Request","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Request","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Request","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(request \\\\ %Request{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Seen","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Seen","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Seen","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(seen \\\\ %Seen{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Sensitive","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Sensitive","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Sensitive","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(sensitive \\\\ %Sensitive{}, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Common","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_error/3","deprecated":false,"title":"assign_error(socket, msg, pid \\\\ self())","anchor":"assign_error/3"},{"id":"assign_flash/5","deprecated":false,"title":"assign_flash(socket_or_conn, type, message, assigns \\\\ %{}, pid \\\\ self())","anchor":"assign_flash/5"},{"id":"assign_generic/2","deprecated":false,"title":"assign_generic(socket_or_conn, assigns)","anchor":"assign_generic/2"},{"id":"assign_generic/3","deprecated":false,"title":"assign_generic(socket, key, value)","anchor":"assign_generic/3"},{"id":"assign_generic_global/2","deprecated":false,"title":"assign_generic_global(socket, assigns)","anchor":"assign_generic_global/2"},{"id":"assign_global/2","deprecated":false,"title":"assign_global(socket, assigns)","anchor":"assign_global/2"},{"id":"assign_global/3","deprecated":false,"title":"assign_global(socket, key, value)","anchor":"assign_global/3"},{"id":"assigns_clean/1","deprecated":false,"title":"assigns_clean(tuple)","anchor":"assigns_clean/1"},{"id":"assigns_merge/2","deprecated":false,"title":"assigns_merge(assigns, new)","anchor":"assigns_merge/2"},{"id":"assigns_merge/3","deprecated":false,"title":"assigns_merge(socket, assigns, new)","anchor":"assigns_merge/3"},{"id":"assigns_minimal/1","deprecated":false,"title":"assigns_minimal(assigns)","anchor":"assigns_minimal/1"},{"id":"assigns_subscribe/2","deprecated":false,"title":"assigns_subscribe(socket, assign_names)","anchor":"assigns_subscribe/2"},{"id":"batch_update_many_async/3","deprecated":false,"title":"batch_update_many_async(assigns_sockets, many_opts, opts)","anchor":"batch_update_many_async/3"},{"id":"batch_update_many_async/4","deprecated":false,"title":"batch_update_many_async(current_user, assigns_sockets, many_opts, opts)","anchor":"batch_update_many_async/4"},{"id":"can?/4","deprecated":false,"title":"can?(subject, verbs, object, opts \\\\ [])","anchor":"can?/4"},{"id":"cast_public/2","deprecated":false,"title":"cast_public(socket, assigns_to_broadcast)","anchor":"cast_public/2"},{"id":"cast_self/2","deprecated":false,"title":"cast_self(socket, assigns_to_broadcast)","anchor":"cast_self/2"},{"id":"copy_go/1","deprecated":false,"title":"copy_go(arg1)","anchor":"copy_go/1"},{"id":"current_url/3","deprecated":false,"title":"current_url(socket_or_assigns, default \\\\ nil, recursing \\\\ false)","anchor":"current_url/3"},{"id":"current_user_or_remote_interaction/3","deprecated":false,"title":"current_user_or_remote_interaction(socket, verb, object)","anchor":"current_user_or_remote_interaction/3"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"go_query/1","deprecated":false,"title":"go_query(url)","anchor":"go_query/1"},{"id":"hero_icons_list/0","deprecated":false,"title":"hero_icons_list()","anchor":"hero_icons_list/0"},{"id":"live_aliases/5","deprecated":false,"title":"live_aliases(aliases, path, live_view, action \\\\ nil, opts \\\\ [])","anchor":"live_aliases/5"},{"id":"live_render_component/2","deprecated":false,"title":"live_render_component(conn, load_live_component)","anchor":"live_render_component/2"},{"id":"live_render_with_conn/2","deprecated":false,"title":"live_render_with_conn(conn, live_view)","anchor":"live_render_with_conn/2"},{"id":"live_upload_files/5","deprecated":false,"title":"live_upload_files(module \\\\ nil, upload_field \\\\ :files, current_user, metadata, socket)","anchor":"live_upload_files/5"},{"id":"markdown/1","deprecated":false,"title":"markdown(content)","anchor":"markdown/1"},{"id":"maybe_apply_or_ret/3","deprecated":false,"title":"maybe_apply_or_ret(assigns, mod, fun)","anchor":"maybe_apply_or_ret/3"},{"id":"maybe_assign/3","deprecated":false,"title":"maybe_assign(socket, key, value)","anchor":"maybe_assign/3"},{"id":"maybe_assign_context/2","deprecated":false,"title":"maybe_assign_context(socket, ret)","anchor":"maybe_assign_context/2"},{"id":"maybe_component/2","deprecated":false,"title":"maybe_component(module, context \\\\ [])","anchor":"maybe_component/2"},{"id":"maybe_consume_uploaded_entries/3","deprecated":false,"title":"maybe_consume_uploaded_entries(socket, key, fun)","anchor":"maybe_consume_uploaded_entries/3"},{"id":"maybe_consume_uploaded_entry/3","deprecated":false,"title":"maybe_consume_uploaded_entry(socket, key, fun)","anchor":"maybe_consume_uploaded_entry/3"},{"id":"maybe_cute_gif/0","deprecated":false,"title":"maybe_cute_gif()","anchor":"maybe_cute_gif/0"},{"id":"maybe_last_sentry_event_id/0","deprecated":false,"title":"maybe_last_sentry_event_id()","anchor":"maybe_last_sentry_event_id/0"},{"id":"maybe_push_event/3","deprecated":false,"title":"maybe_push_event(socket, name, data)","anchor":"maybe_push_event/3"},{"id":"maybe_send_update/4","deprecated":false,"title":"maybe_send_update(component, id, assigns, opts \\\\ [])","anchor":"maybe_send_update/4"},{"id":"maybe_stream_insert/4","deprecated":false,"title":"maybe_stream_insert(socket, name, items, opts)","anchor":"maybe_stream_insert/4"},{"id":"opts_for_update_many_async/2","deprecated":false,"title":"opts_for_update_many_async(arg, opts)","anchor":"opts_for_update_many_async/2"},{"id":"patch_to/3","deprecated":false,"title":"patch_to(socket_or_conn, to \\\\ nil, opts \\\\ [])","anchor":"patch_to/3"},{"id":"path_fallback/2","deprecated":false,"title":"path_fallback(socket_or_conn, opts)","anchor":"path_fallback/2"},{"id":"redirect_self/1","deprecated":false,"title":"redirect_self(to)","anchor":"redirect_self/1"},{"id":"redirect_to/3","deprecated":false,"title":"redirect_to(socket_or_conn, to \\\\ nil, opts \\\\ [])","anchor":"redirect_to/3"},{"id":"redirect_to_previous_go/4","deprecated":false,"title":"redirect_to_previous_go(conn, params, default, current_path)","anchor":"redirect_to_previous_go/4"},{"id":"render_sface_or_native/1","deprecated":false,"title":"render_sface_or_native(opts \\\\ [])","anchor":"render_sface_or_native/1"},{"id":"rich/2","deprecated":false,"title":"rich(content, opts \\\\ [])","anchor":"rich/2"},{"id":"self_subscribe/2","deprecated":false,"title":"self_subscribe(socket, assign_names)","anchor":"self_subscribe/2"},{"id":"send_self/2","deprecated":false,"title":"send_self(socket \\\\ nil, assigns)","anchor":"send_self/2"},{"id":"send_self_global/2","deprecated":false,"title":"send_self_global(socket \\\\ nil, assigns)","anchor":"send_self_global/2"},{"id":"set_go_after/2","deprecated":false,"title":"set_go_after(conn, path \\\\ nil)","anchor":"set_go_after/2"},{"id":"socket_connected?/1","deprecated":false,"title":"socket_connected?(socket)","anchor":"socket_connected?/1"},{"id":"templated/2","deprecated":false,"title":"templated(content, data \\\\ %{})","anchor":"templated/2"},{"id":"templated_or_remote_markdown/2","deprecated":false,"title":"templated_or_remote_markdown(content, data \\\\ nil)","anchor":"templated_or_remote_markdown/2"},{"id":"the_object/1","deprecated":false,"title":"the_object(assigns)","anchor":"the_object/1"},{"id":"undead_mount/2","deprecated":false,"title":"undead_mount(socket, fun)","anchor":"undead_mount/2"},{"id":"undead_on_mount/2","deprecated":false,"title":"undead_on_mount(socket, fun)","anchor":"undead_on_mount/2"},{"id":"undead_render/2","deprecated":false,"title":"undead_render(assigns, fun)","anchor":"undead_render/2"},{"id":"undead_update/2","deprecated":false,"title":"undead_update(socket, fun)","anchor":"undead_update/2"},{"id":"update_many_async/2","deprecated":false,"title":"update_many_async(assigns_sockets, opts)","anchor":"update_many_async/2"},{"id":"update_many_async/3","deprecated":false,"title":"update_many_async(current_user, assigns_sockets, opts)","anchor":"update_many_async/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ComponentID","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ComponentID","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ComponentID","nodeGroups":[{"name":"Functions","nodes":[{"id":"new/3","deprecated":false,"title":"new(component_module, object_id, parent_id \\\\ nil)","anchor":"new/3"},{"id":"send_assigns/5","deprecated":false,"title":"send_assigns(component_module, id, set, socket, pid \\\\ nil)","anchor":"send_assigns/5"},{"id":"send_updates/4","deprecated":false,"title":"send_updates(component_module, object_id, assigns, pid \\\\ nil)","anchor":"send_updates/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Endpoint.LiveReload","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Endpoint.LiveReload","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Endpoint.LiveReload"},{"id":"Bonfire.UI.Common.EndpointTemplate","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.EndpointTemplate","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.EndpointTemplate","nodeGroups":[{"name":"Functions","nodes":[{"id":"session_options/0","deprecated":false,"title":"session_options()","anchor":"session_options/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorHandling","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorHandling","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorHandling","nodeGroups":[{"name":"Functions","nodes":[{"id":"undead/3","deprecated":false,"title":"undead(socket, fun, return_key \\\\ :noreply)","anchor":"undead/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorHelpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorHelpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(form, field)","anchor":"error_tag/2"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorReportingPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorReportingPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorReportingPlug"},{"id":"Bonfire.UI.Common.LiveHandlers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LiveHandlers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LiveHandlers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_attrs/2","deprecated":false,"title":"assign_attrs(socket, attrs)","anchor":"assign_attrs/2"},{"id":"handle_event/5","deprecated":false,"title":"handle_event(action, attrs, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_event/5"},{"id":"handle_info/4","deprecated":false,"title":"handle_info(blob, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_info/4"},{"id":"handle_params/5","deprecated":false,"title":"handle_params(params, uri, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_params/5"},{"id":"handle_progress/5","deprecated":false,"title":"handle_progress(type, entry, socket, source_module, target_fn)","anchor":"handle_progress/5"},{"id":"maybe_from_json/1","deprecated":false,"title":"maybe_from_json(json)","anchor":"maybe_from_json/1"},{"id":"mod_delegate/5","deprecated":false,"title":"mod_delegate(mod, fun, args, socket, no_delegation_fn \\\\ &no_live_handler/2)","anchor":"mod_delegate/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_send_persistent_assigns/2","deprecated":false,"title":"maybe_send_persistent_assigns(assigns \\\\ nil, socket)","anchor":"maybe_send_persistent_assigns/2"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(modules, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.AllowTestSandbox","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Csrf","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Csrf","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Csrf","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Helpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_default_params/3","deprecated":false,"title":"assign_default_params(params, uri, socket)","anchor":"assign_default_params/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(modules, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Locale","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Locale","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Locale","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_put_locale/2","deprecated":false,"title":"assign_put_locale(locale, socket)","anchor":"assign_put_locale/2"},{"id":"assign_put_locale/3","deprecated":false,"title":"assign_put_locale(locale, current_user, socket)","anchor":"assign_put_locale/3"},{"id":"default/2","deprecated":false,"title":"default(_, _)","anchor":"default/2"},{"id":"mount/3","deprecated":false,"title":"mount(_, arg2, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.StaticChanged","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.StaticChanged","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.StaticChanged","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MaybeStaticGeneratorPlug","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"},{"id":"maybe_make_request_path_static/2","deprecated":false,"title":"maybe_make_request_path_static(conn, _)","anchor":"maybe_make_request_path_static/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Modularity.DeclareHelpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Modularity.DeclareHelpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Modularity.DeclareHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"component_props/1","deprecated":false,"title":"component_props(module)","anchor":"component_props/1"},{"id":"component_type/1","deprecated":false,"title":"component_type(module)","anchor":"component_type/1"},{"id":"declare_module_optional/2","deprecated":false,"title":"declare_module_optional(name, opts \\\\ [])","anchor":"declare_module_optional/2"},{"id":"declare_nav_component/2","deprecated":false,"title":"declare_nav_component(name, opts \\\\ [])","anchor":"declare_nav_component/2"},{"id":"declare_nav_link/2","deprecated":false,"title":"declare_nav_link(name, opts \\\\ [])","anchor":"declare_nav_link/2"},{"id":"declare_settings/3","deprecated":false,"title":"declare_settings(type, name, opts \\\\ [])","anchor":"declare_settings/3"},{"id":"declare_settings_component/2","deprecated":false,"title":"declare_settings_component(name, opts \\\\ [])","anchor":"declare_settings_component/2"},{"id":"declare_settings_nav_component/2","deprecated":false,"title":"declare_settings_nav_component(name, opts \\\\ [])","anchor":"declare_settings_nav_component/2"},{"id":"declare_settings_nav_link/2","deprecated":false,"title":"declare_settings_nav_link(name, opts \\\\ [])","anchor":"declare_settings_nav_link/2"},{"id":"declare_widget/2","deprecated":false,"title":"declare_widget(name, opts \\\\ [])","anchor":"declare_widget/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.MultiTenancyPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MultiTenancyPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MultiTenancyPlug"},{"id":"Bonfire.UI.Common.MultiselectLive.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MultiselectLive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.NavModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.NavModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.NavModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"c:declared_nav/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"nav/0","deprecated":false,"title":"nav()","anchor":"nav/0"},{"id":"nav/1","deprecated":false,"title":"nav(app)","anchor":"nav/1"},{"id":"nav_function_error/2","deprecated":false,"title":"nav_function_error(error, args)","anchor":"nav_function_error/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Notifications","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Notifications","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Notifications","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_notification/2","deprecated":false,"title":"assign_notification(attrs, socket)","anchor":"assign_notification/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(attrs, socket)","anchor":"handle_info/2"},{"id":"notify_feeds/5","deprecated":false,"title":"notify_feeds(feed_ids, title, message, url \\\\ nil, icon \\\\ nil)","anchor":"notify_feeds/5"},{"id":"notify_me/4","deprecated":false,"title":"notify_me(title, message, icon, socket \\\\ nil)","anchor":"notify_me/4"},{"id":"receive_flash/3","deprecated":false,"title":"receive_flash(attrs, pid \\\\ self(), context \\\\ nil)","anchor":"receive_flash/3"},{"id":"receive_notification/2","deprecated":false,"title":"receive_notification(attrs, socket \\\\ nil)","anchor":"receive_notification/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.PlugProtect","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.PlugProtect","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.PlugProtect","nodeGroups":[{"name":"Functions","nodes":[{"id":"allow_action/3","deprecated":false,"title":"allow_action(conn, data, opts)","anchor":"allow_action/3"},{"id":"block_action/3","deprecated":false,"title":"block_action(conn, data, opts)","anchor":"block_action/3"},{"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":"Bonfire.UI.Common.Plugs.ActivityPub","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Plugs.ActivityPub","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Plugs.ActivityPub","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"},{"id":"maybe_redirect/1","deprecated":false,"title":"maybe_redirect(conn)","anchor":"maybe_redirect/1"},{"id":"with_headers/3","deprecated":false,"title":"with_headers(conn, arg2, opts)","anchor":"with_headers/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Presence","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Presence","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Presence","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"fetch/2","deprecated":false,"title":"fetch(topic, presences)","anchor":"fetch/2"},{"id":"fetchers_pids/0","deprecated":false,"title":"fetchers_pids()","anchor":"fetchers_pids/0"},{"id":"get_by_key/2","deprecated":false,"title":"get_by_key(topic, key)","anchor":"get_by_key/2"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(broadcast, socket)","anchor":"handle_info/2"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"list/1","deprecated":false,"title":"list(topic)","anchor":"list/1"},{"id":"list_and_maybe_subscribe_to_presence/1","deprecated":false,"title":"list_and_maybe_subscribe_to_presence(socket)","anchor":"list_and_maybe_subscribe_to_presence/1"},{"id":"present!/2","deprecated":false,"title":"present!(socket, meta \\\\ %{})","anchor":"present!/2"},{"id":"present?/2","deprecated":false,"title":"present?(user_id \\\\ nil, socket)","anchor":"present?/2"},{"id":"present_meta/2","deprecated":false,"title":"present_meta(user \\\\ nil, socket)","anchor":"present_meta/2"},{"id":"track/3","deprecated":false,"title":"track(socket, key, meta)","anchor":"track/3"},{"id":"track/4","deprecated":false,"title":"track(pid, topic, key, meta)","anchor":"track/4"},{"id":"untrack/2","deprecated":false,"title":"untrack(socket, key)","anchor":"untrack/2"},{"id":"untrack/3","deprecated":false,"title":"untrack(pid, topic, key)","anchor":"untrack/3"},{"id":"update/3","deprecated":false,"title":"update(socket, key, meta)","anchor":"update/3"},{"id":"update/4","deprecated":false,"title":"update(pid, topic, key, meta)","anchor":"update/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.PreviewContentLive","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.PreviewContentLive","sections":[{"id":"Properties","anchor":"module-properties"},{"id":"Slots","anchor":"module-slots"}],"nested_context":"Bonfire","nested_title":".UI.Common.PreviewContentLive","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, params, socket)","anchor":"handle_event/3"},{"id":"mount/1","deprecated":false,"title":"mount(socket)","anchor":"mount/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ReusableModalLive","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ReusableModalLive","sections":[{"id":"Properties","anchor":"module-properties"},{"id":"Slots","anchor":"module-slots"}],"nested_context":"Bonfire","nested_title":".UI.Common.ReusableModalLive","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_assigns/0","deprecated":false,"title":"default_assigns()","anchor":"default_assigns/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, attrs, socket)","anchor":"handle_event/3"},{"id":"mount/1","deprecated":false,"title":"mount(socket)","anchor":"mount/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"early_hints_authed/0","deprecated":false,"title":"early_hints_authed()","anchor":"early_hints_authed/0"},{"id":"early_hints_guest/0","deprecated":false,"title":"early_hints_guest()","anchor":"early_hints_guest/0"},{"id":"early_hints_shared/0","deprecated":false,"title":"early_hints_shared()","anchor":"early_hints_shared/0"},{"id":"gon_js_config/0","deprecated":false,"title":"gon_js_config()","anchor":"gon_js_config/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SEO","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SEO","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SEO","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"open_graph_config/1","deprecated":false,"title":"open_graph_config(conn \\\\ nil)","anchor":"open_graph_config/1"},{"id":"site_config/1","deprecated":false,"title":"site_config(conn \\\\ nil)","anchor":"site_config/1"},{"id":"twitter_config/1","deprecated":false,"title":"twitter_config(conn \\\\ nil)","anchor":"twitter_config/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SEOImage","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SEOImage","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SEOImage","nodeGroups":[{"name":"Functions","nodes":[{"id":"generate_path/6","deprecated":false,"title":"generate_path(id, author_id, title, body, author, image \\\\ nil)","anchor":"generate_path/6"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SettingsModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SettingsModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SettingsModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_component/0","deprecated":false,"title":"declared_component()","anchor":"c:declared_component/0"},{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"c:declared_nav/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"component_function_error/2","deprecated":false,"title":"component_function_error(error, args)","anchor":"component_function_error/2"},{"id":"components/0","deprecated":false,"title":"components()","anchor":"components/0"},{"id":"components/1","deprecated":false,"title":"components(extension)","anchor":"components/1"},{"id":"extension_has_components?/2","deprecated":false,"title":"extension_has_components?(extension, modules \\\\ nil)","anchor":"extension_has_components?/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"modules_component/1","deprecated":false,"title":"modules_component(modules)","anchor":"modules_component/1"},{"id":"modules_nav/1","deprecated":false,"title":"modules_nav(modules)","anchor":"modules_nav/1"},{"id":"nav/0","deprecated":false,"title":"nav()","anchor":"nav/0"},{"id":"nav/1","deprecated":false,"title":"nav(app)","anchor":"nav/1"},{"id":"nav_function_error/2","deprecated":false,"title":"nav_function_error(error, args)","anchor":"nav_function_error/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SmartInput.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SmartInput.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SmartInput.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"active_smart_input_component/2","deprecated":false,"title":"active_smart_input_component(smart_input_component, create_object_type)","anchor":"active_smart_input_component/2"},{"id":"active_smart_input_components/2","deprecated":false,"title":"active_smart_input_components(smart_input_component, create_object_type)","anchor":"active_smart_input_components/2"},{"id":"activity_type_or_reply/1","deprecated":false,"title":"activity_type_or_reply(assigns)","anchor":"activity_type_or_reply/1"},{"id":"all_smart_input_components/0","deprecated":false,"title":"all_smart_input_components()","anchor":"all_smart_input_components/0"},{"id":"assign_open/2","deprecated":false,"title":"assign_open(context, assigns)","anchor":"assign_open/2"},{"id":"close_smart_input/1","deprecated":false,"title":"close_smart_input(js \\\\ %JS{})","anchor":"close_smart_input/1"},{"id":"confirm_close_smart_input/2","deprecated":false,"title":"confirm_close_smart_input(js \\\\ %JS{}, reusable_modal_id)","anchor":"confirm_close_smart_input/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, params, socket)","anchor":"handle_event/3"},{"id":"max_length/0","deprecated":false,"title":"max_length()","anchor":"max_length/0"},{"id":"maximize/1","deprecated":false,"title":"maximize(js \\\\ %JS{})","anchor":"maximize/1"},{"id":"maybe_from_json/1","deprecated":false,"title":"maybe_from_json(json)","anchor":"maybe_from_json/1"},{"id":"maybe_from_json_string/1","deprecated":false,"title":"maybe_from_json_string(json)","anchor":"maybe_from_json_string/1"},{"id":"minimize/1","deprecated":false,"title":"minimize(js \\\\ %JS{})","anchor":"minimize/1"},{"id":"open/2","deprecated":false,"title":"open(js \\\\ %JS{}, opts \\\\ nil)","anchor":"open/2"},{"id":"open_type/4","deprecated":false,"title":"open_type(js \\\\ %JS{}, component, create_object_type, opts \\\\ nil)","anchor":"open_type/4"},{"id":"open_with_text_suggestion/3","deprecated":false,"title":"open_with_text_suggestion(text, set_assigns, socket_or_context)","anchor":"open_with_text_suggestion/3"},{"id":"replace_input_next_time/1","deprecated":false,"title":"replace_input_next_time(socket_or_context)","anchor":"replace_input_next_time/1"},{"id":"reply_to_param/1","deprecated":false,"title":"reply_to_param(arg1)","anchor":"reply_to_param/1"},{"id":"reset_input/1","deprecated":false,"title":"reset_input(socket)","anchor":"reset_input/1"},{"id":"set/2","deprecated":false,"title":"set(context, assigns)","anchor":"set/2"},{"id":"set_smart_input_text/2","deprecated":false,"title":"set_smart_input_text(socket_or_context, text \\\\ \"\\n\")","anchor":"set_smart_input_text/2"},{"id":"show_main/2","deprecated":false,"title":"show_main(js \\\\ %JS{}, opts \\\\ nil)","anchor":"show_main/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"smart_input_name/1","deprecated":false,"title":"smart_input_name(component)","anchor":"smart_input_name/1"},{"id":"switch_smart_input_type/2","deprecated":false,"title":"switch_smart_input_type(type, js \\\\ %JS{})","anchor":"switch_smart_input_type/2"},{"id":"toggle_expanded/4","deprecated":false,"title":"toggle_expanded(js \\\\ %JS{}, target, btn, class)","anchor":"toggle_expanded/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SmartInputModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SmartInputModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SmartInputModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"smart_input_module/0","deprecated":false,"title":"smart_input_module()","anchor":"c:smart_input_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"smart_input_modules_types/0","deprecated":false,"title":"smart_input_modules_types()","anchor":"smart_input_modules_types/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.StaticGenerator","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.StaticGenerator","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.StaticGenerator","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_path/0","deprecated":false,"title":"base_path()","anchor":"base_path/0"},{"id":"batch/0","deprecated":false,"title":"batch()","anchor":"batch/0"},{"id":"file_exists_age/1","deprecated":false,"title":"file_exists_age(file)","anchor":"file_exists_age/1"},{"id":"file_exists_not_expired/1","deprecated":false,"title":"file_exists_not_expired(file)","anchor":"file_exists_not_expired/1"},{"id":"generate/2","deprecated":false,"title":"generate(urls, opts \\\\ [])","anchor":"generate/2"},{"id":"get/3","deprecated":false,"title":"get(conn, url, params_or_body)","anchor":"get/3"},{"id":"maybe_generate/2","deprecated":false,"title":"maybe_generate(urls, opts \\\\ [])","anchor":"maybe_generate/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.StaticGeneratorPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.StaticGeneratorPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.StaticGeneratorPlug","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"},{"id":"make_request_path_static/2","deprecated":false,"title":"make_request_path_static(conn, _ \\\\ nil)","anchor":"make_request_path_static/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Testing.Helpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Testing.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Testing.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_field_error/3","deprecated":false,"title":"assert_field_error(doc, name, error)","anchor":"assert_field_error/3"},{"id":"assert_field_good/2","deprecated":false,"title":"assert_field_good(doc, name)","anchor":"assert_field_good/2"},{"id":"assert_flash/3","deprecated":false,"title":"assert_flash(view, kind, message)","anchor":"assert_flash/3"},{"id":"assert_flash_kind/2","deprecated":false,"title":"assert_flash_kind(flash, atom)","anchor":"assert_flash_kind/2"},{"id":"assert_flash_message/2","deprecated":false,"title":"assert_flash_message(flash, r)","anchor":"assert_flash_message/2"},{"id":"assert_form_field_error/3","deprecated":false,"title":"assert_form_field_error(doc, field_qualifiers, error)","anchor":"assert_form_field_error/3"},{"id":"assert_form_field_good/3","deprecated":false,"title":"assert_form_field_good(doc, field_name, field_qualifiers)","anchor":"assert_form_field_good/3"},{"id":"conn/0","deprecated":false,"title":"conn()","anchor":"conn/0"},{"id":"conn/1","deprecated":false,"title":"conn(conn)","anchor":"conn/1"},{"id":"conn/2","deprecated":false,"title":"conn(conn, filters)","anchor":"conn/2"},{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_admin!/3","deprecated":false,"title":"fake_admin!(account \\\\ %{}, attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_admin!/3"},{"id":"fake_user!/3","deprecated":false,"title":"fake_user!(account \\\\ %{}, attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_user!/3"},{"id":"fake_user_and_conn!/1","deprecated":false,"title":"fake_user_and_conn!(account \\\\ fake_account!())","anchor":"fake_user_and_conn!/1"},{"id":"fancy_fake_user!/2","deprecated":false,"title":"fancy_fake_user!(name, opts \\\\ [])","anchor":"fancy_fake_user!/2"},{"id":"fancy_fake_user_on_test_instance/1","deprecated":false,"title":"fancy_fake_user_on_test_instance(opts \\\\ [])","anchor":"fancy_fake_user_on_test_instance/1"},{"id":"find_flash/1","deprecated":false,"title":"find_flash(view_or_doc)","anchor":"find_flash/1"},{"id":"find_form_error/2","deprecated":false,"title":"find_form_error(doc, name)","anchor":"find_form_error/2"},{"id":"find_form_field_error/2","deprecated":false,"title":"find_form_field_error(doc, field_qualifier)","anchor":"find_form_field_error/2"},{"id":"floki_attr/2","deprecated":false,"title":"floki_attr(elem, attr)","anchor":"floki_attr/2"},{"id":"floki_click/3","deprecated":false,"title":"floki_click(conn_or_view \\\\ conn(), path_or_value \\\\ %{}, value \\\\ %{})","anchor":"floki_click/3"},{"id":"floki_live/2","deprecated":false,"title":"floki_live(conn \\\\ conn(), path \\\\ nil)","anchor":"floki_live/2"},{"id":"floki_redirect/2","deprecated":false,"title":"floki_redirect(conn \\\\ conn(), path \\\\ nil)","anchor":"floki_redirect/2"},{"id":"floki_response/2","deprecated":false,"title":"floki_response(conn, code \\\\ 200)","anchor":"floki_response/2"},{"id":"floki_submit/4","deprecated":false,"title":"floki_submit(conn_or_view \\\\ conn(), path_or_event, event_or_value \\\\ %{}, value \\\\ %{})","anchor":"floki_submit/4"},{"id":"live_pubsub_wait/1","deprecated":false,"title":"live_pubsub_wait(live_view)","anchor":"live_pubsub_wait/1"},{"id":"live_sockets_disconnect/1","deprecated":false,"title":"live_sockets_disconnect(context)","anchor":"live_sockets_disconnect/1"},{"id":"live_view_stop/1","deprecated":false,"title":"live_view_stop(view)","anchor":"live_view_stop/1"},{"id":"qualifiers_to_input_name/1","deprecated":false,"title":"qualifiers_to_input_name(list)","anchor":"qualifiers_to_input_name/1"},{"id":"render_stateful/3","deprecated":false,"title":"render_stateful(component, assigns \\\\ %{}, context \\\\ [])","anchor":"render_stateful/3"},{"id":"render_stateless/3","deprecated":false,"title":"render_stateless(component, assigns \\\\ [], context \\\\ [])","anchor":"render_stateless/3"},{"id":"session_conn/1","deprecated":false,"title":"session_conn(conn \\\\ build_conn())","anchor":"session_conn/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.WidgetModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.WidgetModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.WidgetModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_widget/0","deprecated":false,"title":"declared_widget()","anchor":"c:declared_widget/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"widget/1","deprecated":false,"title":"widget(module)","anchor":"widget/1"},{"id":"widget_function_error/2","deprecated":false,"title":"widget_function_error(error, args)","anchor":"widget_function_error/2"},{"id":"widgets/0","deprecated":false,"title":"widgets()","anchor":"widgets/0"},{"id":"widgets/1","deprecated":false,"title":"widgets(extension)","anchor":"widgets/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Coordination","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.FeedLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.FeedLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.FeedLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.ProcessLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.ProcessLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.ProcessesLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TaskLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TaskLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TaskLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TasksLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TasksLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TasksLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TodoLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TodoLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TodoLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups","sections":[{"id":"Roadmap","anchor":"module-roadmap"},{"id":"Sponsors","anchor":"module-sponsors"},{"id":"📖 Documentation","anchor":"module-documentation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Groups"},{"id":"Bonfire.UI.Groups.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Kanban","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.BoardLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.BoardLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.BoardLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.HomeLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Me","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Me","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.AccountRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.AccountRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.AccountRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session \\\\ nil, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.AdminRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.AdminRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.AdminRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentAccount","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentAccountUsers","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentUser","nodeGroups":[{"name":"Functions","nodes":[{"id":"get_current/2","deprecated":false,"title":"get_current(user_id, account_id)","anchor":"get_current/2"},{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentUserCircles","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.UserRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.UserRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.UserRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session \\\\ nil, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.Plugs.AccountRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.AccountRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.AccountRequired","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":"Bonfire.UI.Me.Plugs.AdminRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.AdminRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.AdminRequired","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":"Bonfire.UI.Me.Plugs.GuestOnly","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.GuestOnly","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.GuestOnly","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":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentAccount","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":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentAccountUsers","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":"Bonfire.UI.Me.Plugs.LoadCurrentUser","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentUser","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":"Bonfire.UI.Me.Plugs.UserRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.UserRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.UserRequired","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":"Bonfire.UI.Me.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Routes"},{"id":"Bonfire.UI.Me.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Messages.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Messages.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Messages.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Messages.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Messages.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Messages.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Moderation.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Moderation.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Moderation.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Posts.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Posts.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Posts.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Posts.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Posts.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Posts.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reactions.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reactions.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reactions.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reactions.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reactions.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reactions.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.InventoryLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.InventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.MaterialsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProcessLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProcessLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProcessesLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProfileInventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ResourceLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ResourceLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Benchmark","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Benchmark","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Benchmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"feed_backend/0","deprecated":false,"title":"feed_backend()","anchor":"feed_backend/0"},{"id":"feed_full_backend/0","deprecated":false,"title":"feed_full_backend()","anchor":"feed_full_backend/0"},{"id":"feed_full_get/1","deprecated":false,"title":"feed_full_get(conn \\\\ build_conn())","anchor":"feed_full_get/1"},{"id":"feed_page/0","deprecated":false,"title":"feed_page()","anchor":"feed_page/0"},{"id":"feed_queries_without_benchee/0","deprecated":false,"title":"feed_queries_without_benchee()","anchor":"feed_queries_without_benchee/0"},{"id":"feed_query_methods/0","deprecated":false,"title":"feed_query_methods()","anchor":"feed_query_methods/0"},{"id":"feed_render_page/0","deprecated":false,"title":"feed_render_page()","anchor":"feed_render_page/0"},{"id":"live_feed/1","deprecated":false,"title":"live_feed(opts \\\\ [])","anchor":"live_feed/1"},{"id":"misc/0","deprecated":false,"title":"misc()","anchor":"misc/0"},{"id":"render_feed/2","deprecated":false,"title":"render_feed(feed, opts \\\\ [])","anchor":"render_feed/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Graph.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Graph.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Graph.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.LivePush","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.LivePush","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.LivePush","nodeGroups":[{"name":"Functions","nodes":[{"id":"hide_activity/2","deprecated":false,"title":"hide_activity(feed_id, activity_id)","anchor":"hide_activity/2"},{"id":"notify/2","deprecated":false,"title":"notify(activity, feed_ids)","anchor":"notify/2"},{"id":"notify/4","deprecated":false,"title":"notify(subject, verb, object, feed_ids)","anchor":"notify/4"},{"id":"notify_of_message/4","deprecated":false,"title":"notify_of_message(subject, verb, object, users)","anchor":"notify_of_message/4"},{"id":"notify_users/4","deprecated":false,"title":"notify_users(subject, verb, object, users)","anchor":"notify_users/4"},{"id":"prepare_activity/2","deprecated":false,"title":"prepare_activity(activity, opts \\\\ [])","anchor":"prepare_activity/2"},{"id":"push_activity/3","deprecated":false,"title":"push_activity(feed_ids, activity, opts \\\\ [])","anchor":"push_activity/3"},{"id":"push_activity_object/4","deprecated":false,"title":"push_activity_object(feed_ids, parent_object, object, opts)","anchor":"push_activity_object/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics"},{"id":"Bonfire.UI.Topics.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.AddMilestoneLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateEconomicEventLive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateResourceSpecForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateUnitForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateUnitForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateUnitForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateValueCalculationForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.SettingsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"AnimalAvatarGenerator","deprecated":false,"group":"Bonfire utilities","title":"AnimalAvatarGenerator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar/2","deprecated":false,"title":"avatar(seed, opts \\\\ [])","anchor":"avatar/2"},{"id":"avatar_face/2","deprecated":false,"title":"avatar_face(seed, opts \\\\ [])","anchor":"avatar_face/2"},{"id":"brows/0","deprecated":false,"title":"brows()","anchor":"brows/0"},{"id":"clamp/3","deprecated":false,"title":"clamp(value, min, max)","anchor":"clamp/3"},{"id":"create_background/3","deprecated":false,"title":"create_background(round, color, class)","anchor":"create_background/3"},{"id":"create_blackout/1","deprecated":false,"title":"create_blackout(round)","anchor":"create_blackout/1"},{"id":"create_svg/2","deprecated":false,"title":"create_svg(size, children)","anchor":"create_svg/2"},{"id":"darken/2","deprecated":false,"title":"darken(hex, amount)","anchor":"darken/2"},{"id":"ears/0","deprecated":false,"title":"ears()","anchor":"ears/0"},{"id":"empty_shape/0","deprecated":false,"title":"empty_shape()","anchor":"empty_shape/0"},{"id":"eyes/0","deprecated":false,"title":"eyes()","anchor":"eyes/0"},{"id":"faces/0","deprecated":false,"title":"faces()","anchor":"faces/0"},{"id":"hairs/0","deprecated":false,"title":"hairs()","anchor":"hairs/0"},{"id":"muzzles/0","deprecated":false,"title":"muzzles()","anchor":"muzzles/0"},{"id":"patterns/0","deprecated":false,"title":"patterns()","anchor":"patterns/0"}],"key":"functions"}]},{"id":"Arrows","deprecated":false,"group":"Bonfire utilities","title":"Arrows","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Documentation","anchor":"module-documentation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"<~>/2","deprecated":false,"title":"l <~> r","anchor":"%3C~%3E/2"},{"id":"from_ok/1","deprecated":false,"title":"from_ok(x)","anchor":"from_ok/1"},{"id":"ok/1","deprecated":false,"title":"ok(x)","anchor":"ok/1"},{"id":"ok_or/2","deprecated":false,"title":"ok_or(x, err)","anchor":"ok_or/2"},{"id":"to_ok/1","deprecated":false,"title":"to_ok(x)","anchor":"to_ok/1"},{"id":"|>/2","deprecated":false,"title":"l |> r","anchor":"%7C%3E/2"},{"id":"|||/2","deprecated":false,"title":"l ||| r","anchor":"%7C%7C%7C/2"},{"id":"~>/2","deprecated":false,"title":"l ~> r","anchor":"~%3E/2"}],"key":"functions"}]},{"id":"EctoSparkles","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles","sections":[{"id":"proload documentation","anchor":"module-proload-documentation"},{"id":"Example using proload","anchor":"module-example-using-proload"},{"id":"Example using join_preload","anchor":"module-example-using-join_preload"},{"id":"reusable_join documentation","anchor":"module-reusable_join-documentation"},{"id":"Copyright","anchor":"module-copyright"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"join_preload/2","deprecated":false,"title":"join_preload(query, associations)","anchor":"join_preload/2"},{"id":"proload/3","deprecated":false,"title":"proload(query, qual \\\\ :left, associations)","anchor":"proload/3"},{"id":"reusable_join/5","deprecated":false,"title":"reusable_join(query, qual \\\\ :left, bindings, expr, opts)","anchor":"reusable_join/5"}],"key":"functions"}]},{"id":"EctoSparkles.AutoMigrator","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.AutoMigrator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"},{"id":"startup_migrations/0","deprecated":false,"title":"startup_migrations()","anchor":"startup_migrations/0"}],"key":"functions"}]},{"id":"EctoSparkles.Changesets.Errors","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Changesets.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset_errors_string/2","deprecated":false,"title":"changeset_errors_string(changeset, include_schema_tree \\\\ true)","anchor":"changeset_errors_string/2"},{"id":"error/2","deprecated":false,"title":"error(changeset, list)","anchor":"error/2"}],"key":"functions"}]},{"id":"EctoSparkles.DataMigration","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration","sections":[],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"c:base_query/0"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"c:config/0"},{"id":"migrate/1","deprecated":false,"title":"migrate(list)","anchor":"c:migrate/1"}],"key":"callbacks"}]},{"id":"EctoSparkles.DataMigration.Config","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration.Config","sections":[]},{"id":"EctoSparkles.DataMigration.Runner","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration.Runner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(migration_module)","anchor":"run/1"}],"key":"functions"}]},{"id":"EctoSparkles.ErlangTermBinary","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.ErlangTermBinary","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_binary)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"EctoSparkles.JSONSerdeData","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.JSONSerdeData","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_json)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"EctoSparkles.Log","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Log","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_if_n_plus_1/1","deprecated":false,"title":"check_if_n_plus_1(query)","anchor":"check_if_n_plus_1/1"},{"id":"format_log/4","deprecated":false,"title":"format_log(result_key, duration_in_ms, measurements, metadata)","anchor":"format_log/4"},{"id":"handle_event/4","deprecated":false,"title":"handle_event(_, measurements, metadata, config)","anchor":"handle_event/4"},{"id":"inline_params/3","deprecated":false,"title":"inline_params(query, params, repo_adapter \\\\ Ecto.Adapters.SQL)","anchor":"inline_params/3"},{"id":"log_query/4","deprecated":false,"title":"log_query(result_key, duration_in_ms, measurements, metadata)","anchor":"log_query/4"},{"id":"setup/1","deprecated":false,"title":"setup(repo_module)","anchor":"setup/1"}],"key":"functions"}]},{"id":"EctoSparkles.Migrator","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Migrator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/0","deprecated":false,"title":"create()","anchor":"create/0"},{"id":"create/2","deprecated":false,"title":"create(repo, attempt \\\\ 0)","anchor":"create/2"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"id":"migrate/1","deprecated":false,"title":"migrate(repo)","anchor":"migrate/1"},{"id":"rollback/2","deprecated":false,"title":"rollback(repo \\\\ nil, step \\\\ 1)","anchor":"rollback/2"},{"id":"rollback_all/0","deprecated":false,"title":"rollback_all()","anchor":"rollback_all/0"},{"id":"rollback_all/1","deprecated":false,"title":"rollback_all(repo)","anchor":"rollback_all/1"},{"id":"rollback_to/1","deprecated":false,"title":"rollback_to(version)","anchor":"rollback_to/1"},{"id":"rollback_to/2","deprecated":false,"title":"rollback_to(repo, version)","anchor":"rollback_to/2"},{"id":"status/0","deprecated":false,"title":"status()","anchor":"status/0"}],"key":"functions"}]},{"id":"EctoSparkles.NPlus1Detector","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.NPlus1Detector","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check/1","deprecated":false,"title":"check(query)","anchor":"check/1"},{"id":"do_check/2","deprecated":false,"title":"do_check(query, counter)","anchor":"do_check/2"}],"key":"functions"}]},{"id":"EctoSparkles.SanitiseStrings","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.SanitiseStrings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clean_html/2","deprecated":false,"title":"clean_html(changeset, opts \\\\ [])","anchor":"clean_html/2"},{"id":"sanitise_strings/2","deprecated":false,"title":"sanitise_strings(changeset, opts \\\\ [])","anchor":"sanitise_strings/2"},{"id":"strip_all_tags/2","deprecated":false,"title":"strip_all_tags(changeset, opts \\\\ [])","anchor":"strip_all_tags/2"}],"key":"functions"}]},{"id":"Exto","deprecated":false,"group":"Bonfire utilities","title":"Exto","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"flex_schema/1","deprecated":false,"title":"flex_schema(otp_app)","anchor":"flex_schema/1"}],"key":"functions"}]},{"id":"Needle","deprecated":false,"group":"Bonfire utilities","title":"Needle","sections":[{"id":"Intro","anchor":"module-intro"},{"id":"What is Needle?","anchor":"module-what-is-needle"},{"id":"Identifying objects - the UID type","anchor":"module-identifying-objects-the-uid-type"},{"id":"It's just a table","anchor":"module-it-s-just-a-table"},{"id":"Installation","anchor":"module-installation"},{"id":"Declaring Object Types","anchor":"module-declaring-object-types"},{"id":"Adding re-usable fields","anchor":"module-adding-re-usable-fields"},{"id":"Writing Migrations","anchor":"module-writing-migrations"},{"id":"Configuration and overrides","anchor":"module-configuration-and-overrides"},{"id":"Referencing Pointables","anchor":"module-referencing-pointables"},{"id":"Dereferencing Pointables","anchor":"module-dereferencing-pointables"},{"id":"Inserting data","anchor":"module-inserting-data"},{"id":"Querying Needle","anchor":"module-querying-needle"},{"id":"Tradeoffs","anchor":"module-tradeoffs"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"is_needle?/2","deprecated":false,"title":"is_needle?(schema_or_struct, one_of_types \\\\ [:pointable, :virtual, :mixin, :unpointable, :random, :form])","anchor":"is_needle?/2"}],"key":"functions"}]},{"id":"Needle.Changesets","deprecated":false,"group":"Bonfire utilities","title":"Needle.Changesets","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_assoc/3","deprecated":false,"title":"build_assoc(changeset, assoc_key, rel)","anchor":"build_assoc/3"},{"id":"built?/1","deprecated":false,"title":"built?(arg1)","anchor":"built?/1"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, params, cols)","anchor":"cast/3"},{"id":"cast_assoc/3","deprecated":false,"title":"cast_assoc(changeset, assoc_key, opts \\\\ [])","anchor":"cast_assoc/3"},{"id":"cast_belongs_to/4","deprecated":false,"title":"cast_belongs_to(changeset, assoc_key, assoc, opts)","anchor":"cast_belongs_to/4"},{"id":"cast_has_many/4","deprecated":false,"title":"cast_has_many(changeset, assoc_key, assoc, opts)","anchor":"cast_has_many/4"},{"id":"cast_has_one/4","deprecated":false,"title":"cast_has_one(changeset, assoc_key, assoc, opts)","anchor":"cast_has_one/4"},{"id":"config_for/3","deprecated":false,"title":"config_for(module, key, default \\\\ [])","anchor":"config_for/3"},{"id":"deleted?/1","deprecated":false,"title":"deleted?(arg1)","anchor":"deleted?/1"},{"id":"get_field/2","deprecated":false,"title":"get_field(cs, key)","anchor":"get_field/2"},{"id":"insert_verb/1","deprecated":false,"title":"insert_verb(thing)","anchor":"insert_verb/1"},{"id":"loaded?/1","deprecated":false,"title":"loaded?(arg1)","anchor":"loaded?/1"},{"id":"merge_child_errors/1","deprecated":false,"title":"merge_child_errors(cs)","anchor":"merge_child_errors/1"},{"id":"put_assoc/3","deprecated":false,"title":"put_assoc(changeset, assoc_key, rels)","anchor":"put_assoc/3"},{"id":"put_assoc!/3","deprecated":false,"title":"put_assoc!(changeset, assoc_key, rels)","anchor":"put_assoc!/3"},{"id":"put_id_on_mixins/3","deprecated":false,"title":"put_id_on_mixins(attrs, mixin_names, pointable)","anchor":"put_id_on_mixins/3"},{"id":"put_new_id/2","deprecated":false,"title":"put_new_id(changeset, schema)","anchor":"put_new_id/2"},{"id":"state/1","deprecated":false,"title":"state(thing)","anchor":"state/1"},{"id":"update_data/2","deprecated":false,"title":"update_data(changeset, fun)","anchor":"update_data/2"},{"id":"valid?/1","deprecated":false,"title":"valid?(cs)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Needle.Form","deprecated":false,"group":"Bonfire utilities","title":"Needle.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"form_schema/1","deprecated":false,"title":"form_schema(list)","anchor":"form_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Migration","deprecated":false,"group":"Bonfire utilities","title":"Needle.Migration","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"pointer_type/0","deprecated":false,"title":"pointer_type()","anchor":"t:pointer_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"add_is_not_deleted/1","deprecated":false,"title":"add_is_not_deleted(table)","anchor":"add_is_not_deleted/1"},{"id":"create_mixin_table/3","deprecated":false,"title":"create_mixin_table(name, opts \\\\ [], body)","anchor":"create_mixin_table/3"},{"id":"create_pointable_table/2","deprecated":false,"title":"create_pointable_table(a, b)","anchor":"create_pointable_table/2"},{"id":"create_pointable_table/3","deprecated":false,"title":"create_pointable_table(a, b, c)","anchor":"create_pointable_table/3"},{"id":"create_pointable_table/4","deprecated":false,"title":"create_pointable_table(a, b, c, d)","anchor":"create_pointable_table/4"},{"id":"create_random_table/3","deprecated":false,"title":"create_random_table(name, opts \\\\ [], body)","anchor":"create_random_table/3"},{"id":"create_virtual/1","deprecated":false,"title":"create_virtual(schema)","anchor":"create_virtual/1"},{"id":"create_virtual/2","deprecated":false,"title":"create_virtual(source, id)","anchor":"create_virtual/2"},{"id":"create_virtual_trigger_function/0","deprecated":false,"title":"create_virtual_trigger_function()","anchor":"create_virtual_trigger_function/0"},{"id":"drop_mixin_table/1","deprecated":false,"title":"drop_mixin_table(name)","anchor":"drop_mixin_table/1"},{"id":"drop_pointable_table/1","deprecated":false,"title":"drop_pointable_table(schema)","anchor":"drop_pointable_table/1"},{"id":"drop_pointable_table/2","deprecated":false,"title":"drop_pointable_table(name, id)","anchor":"drop_pointable_table/2"},{"id":"drop_random_table/1","deprecated":false,"title":"drop_random_table(name)","anchor":"drop_random_table/1"},{"id":"drop_table/1","deprecated":false,"title":"drop_table(name)","anchor":"drop_table/1"},{"id":"drop_virtual/1","deprecated":false,"title":"drop_virtual(schema)","anchor":"drop_virtual/1"},{"id":"drop_virtual/2","deprecated":false,"title":"drop_virtual(name, id)","anchor":"drop_virtual/2"},{"id":"init_pointers/0","deprecated":false,"title":"init_pointers()","anchor":"init_pointers/0"},{"id":"init_pointers/1","deprecated":false,"title":"init_pointers(atom)","anchor":"init_pointers/1"},{"id":"init_pointers_ulid_extra/0","deprecated":false,"title":"init_pointers_ulid_extra()","anchor":"init_pointers_ulid_extra/0"},{"id":"migrate_virtual/1","deprecated":false,"title":"migrate_virtual(schema)","anchor":"migrate_virtual/1"},{"id":"migrate_virtual/2","deprecated":false,"title":"migrate_virtual(name, schema)","anchor":"migrate_virtual/2"},{"id":"migrate_virtual/3","deprecated":false,"title":"migrate_virtual(atom, name, id)","anchor":"migrate_virtual/3"},{"id":"pointer/2","deprecated":false,"title":"pointer(table \\\\ Pointer, type)","anchor":"pointer/2"},{"id":"strong_pointer/1","deprecated":false,"title":"strong_pointer(table \\\\ Pointer)","anchor":"strong_pointer/1"},{"id":"unbreakable_pointer/1","deprecated":false,"title":"unbreakable_pointer(table \\\\ Pointer)","anchor":"unbreakable_pointer/1"},{"id":"weak_pointer/1","deprecated":false,"title":"weak_pointer(table \\\\ Pointer)","anchor":"weak_pointer/1"}],"key":"functions"}]},{"id":"Needle.Mixin","deprecated":false,"group":"Bonfire utilities","title":"Needle.Mixin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"mixin_schema/1","deprecated":false,"title":"mixin_schema(list)","anchor":"mixin_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.NotFound","deprecated":false,"group":"Bonfire utilities","title":"Needle.NotFound","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(name \\\\ \"Pointer\")","anchor":"new/1"}],"key":"functions"}]},{"id":"Needle.Pointable","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointable","sections":[{"id":"Sample Usage","anchor":"module-sample-usage"},{"id":"Overriding with configuration","anchor":"module-overriding-with-configuration"},{"id":"Introspection","anchor":"module-introspection"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pointable_schema/1","deprecated":false,"title":"pointable_schema(body)","anchor":"pointable_schema/1"}],"key":"functions"}]},{"id":"Needle.Pointer","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(id \\\\ Needle.UID.generate(), table)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Needle.Pointers","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_points_to!/2","deprecated":false,"title":"assert_points_to!(pointer, term)","anchor":"assert_points_to!/2"},{"id":"cast!/1","deprecated":false,"title":"cast!(p)","anchor":"cast!/1"},{"id":"get_table_id!/1","deprecated":false,"title":"get_table_id!(schema)","anchor":"get_table_id!/1"},{"id":"plan/1","deprecated":false,"title":"plan(pointers)","anchor":"plan/1"},{"id":"query_base/1","deprecated":false,"title":"query_base(type \\\\ nil)","anchor":"query_base/1"},{"id":"schema/1","deprecated":false,"title":"schema(pointer)","anchor":"schema/1"},{"id":"table/1","deprecated":false,"title":"table(pointer)","anchor":"table/1"}],"key":"functions"}]},{"id":"Needle.Random","deprecated":false,"group":"Bonfire utilities","title":"Needle.Random","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"random_schema/1","deprecated":false,"title":"random_schema(list)","anchor":"random_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Table","deprecated":false,"group":"Bonfire utilities","title":"Needle.Table","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Needle.Tables","deprecated":false,"group":"Bonfire utilities","title":"Needle.Tables","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"query/0","deprecated":false,"title":"query()","anchor":"t:query/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"data/0"},{"id":"id/1","deprecated":false,"title":"id(query)","anchor":"id/1"},{"id":"id!/1","deprecated":false,"title":"id!(query)","anchor":"id!/1"},{"id":"ids!/1","deprecated":false,"title":"ids!(ids)","anchor":"ids!/1"},{"id":"mixin_modules/0","deprecated":false,"title":"mixin_modules()","anchor":"mixin_modules/0"},{"id":"schema/1","deprecated":false,"title":"schema(query)","anchor":"schema/1"},{"id":"schema!/1","deprecated":false,"title":"schema!(query)","anchor":"schema!/1"},{"id":"schema?/1","deprecated":false,"title":"schema?(module)","anchor":"schema?/1"},{"id":"schema_modules/0","deprecated":false,"title":"schema_modules()","anchor":"schema_modules/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"},{"id":"table/1","deprecated":false,"title":"table(query)","anchor":"table/1"},{"id":"table!/1","deprecated":false,"title":"table!(query)","anchor":"table!/1"}],"key":"functions"}]},{"id":"Needle.UID","deprecated":false,"group":"Bonfire utilities","title":"Needle.UID","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(term, params \\\\ nil)","anchor":"cast/2"},{"id":"cast!/2","deprecated":false,"title":"cast!(value, params \\\\ nil)","anchor":"cast!/2"},{"id":"dump/3","deprecated":false,"title":"dump(value, dumper \\\\ nil, params \\\\ nil)","anchor":"dump/3"},{"id":"generate/1","deprecated":false,"title":"generate(params_or_timestamp \\\\ nil)","anchor":"generate/1"},{"id":"is_pride?/2","deprecated":false,"title":"is_pride?(str, params \\\\ nil)","anchor":"is_pride?/2"},{"id":"is_ulid?/1","deprecated":false,"title":"is_ulid?(str)","anchor":"is_ulid?/1"},{"id":"is_uuid?/2","deprecated":false,"title":"is_uuid?(str, params \\\\ nil)","anchor":"is_uuid?/2"},{"id":"load/3","deprecated":false,"title":"load(value, loader \\\\ nil, params \\\\ nil)","anchor":"load/3"},{"id":"synthesise!/1","deprecated":false,"title":"synthesise!(x)","anchor":"synthesise!/1"},{"id":"timestamp/1","deprecated":false,"title":"timestamp(encoded)","anchor":"timestamp/1"},{"id":"type/1","deprecated":false,"title":"type(params)","anchor":"type/1"},{"id":"valid?/2","deprecated":false,"title":"valid?(str, params \\\\ nil)","anchor":"valid?/2"}],"key":"functions"}]},{"id":"Needle.ULID","deprecated":false,"group":"Bonfire utilities","title":"Needle.ULID","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bingenerate/1","deprecated":false,"title":"bingenerate(timestamp \\\\ System.system_time(:millisecond))","anchor":"bingenerate/1"},{"id":"bintimestamp/1","deprecated":false,"title":"bintimestamp(arg)","anchor":"bintimestamp/1"},{"id":"cast/1","deprecated":false,"title":"cast(value)","anchor":"cast/1"},{"id":"cast!/1","deprecated":false,"title":"cast!(value)","anchor":"cast!/1"},{"id":"decode/1","deprecated":false,"title":"decode(bytes)","anchor":"decode/1"},{"id":"dump/1","deprecated":false,"title":"dump(encoded)","anchor":"dump/1"},{"id":"dump!/1","deprecated":false,"title":"dump!(encoded)","anchor":"dump!/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"encode/2","deprecated":false,"title":"encode(bytes, leading_zeroes? \\\\ true)","anchor":"encode/2"},{"id":"encoded_randomness/1","deprecated":false,"title":"encoded_randomness(arg)","anchor":"encoded_randomness/1"},{"id":"encoded_timestamp/1","deprecated":false,"title":"encoded_timestamp(arg)","anchor":"encoded_timestamp/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"generate/1","deprecated":false,"title":"generate(timestamp \\\\ System.system_time(:millisecond))","anchor":"generate/1"},{"id":"load/1","deprecated":false,"title":"load(bytes)","anchor":"load/1"},{"id":"synthesise!/1","deprecated":false,"title":"synthesise!(x)","anchor":"synthesise!/1"},{"id":"timestamp/1","deprecated":false,"title":"timestamp(encoded)","anchor":"timestamp/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"},{"id":"valid?/1","deprecated":false,"title":"valid?(arg1)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Needle.ULID.Migration","deprecated":false,"group":"Bonfire utilities","title":"Needle.ULID.Migration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"init_pointers_ulid_extra/0","deprecated":false,"title":"init_pointers_ulid_extra()","anchor":"init_pointers_ulid_extra/0"},{"id":"init_pointers_ulid_extra/1","deprecated":false,"title":"init_pointers_ulid_extra(atom)","anchor":"init_pointers_ulid_extra/1"}],"key":"functions"}]},{"id":"Needle.Unpointable","deprecated":false,"group":"Bonfire utilities","title":"Needle.Unpointable","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"unpointable_schema/1","deprecated":false,"title":"unpointable_schema(list)","anchor":"unpointable_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Virtual","deprecated":false,"group":"Bonfire utilities","title":"Needle.Virtual","sections":[{"id":"Sample Usage","anchor":"module-sample-usage"},{"id":"Overriding with configuration","anchor":"module-overriding-with-configuration"},{"id":"Introspection","anchor":"module-introspection"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"virtual_schema/1","deprecated":false,"title":"virtual_schema(body)","anchor":"virtual_schema/1"}],"key":"functions"}]},{"id":"Releaser.Git","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Git","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_commit_and_tag/1","deprecated":false,"title":"add_commit_and_tag(version)","anchor":"add_commit_and_tag/1"}],"key":"functions"}]},{"id":"Releaser.Publish","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Publish","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"publish!/0","deprecated":false,"title":"publish!()","anchor":"publish!/0"}],"key":"functions"}]},{"id":"Releaser.Tests","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Tests","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run_tests!/0","deprecated":false,"title":"run_tests!()","anchor":"run_tests!/0"}],"key":"functions"}]},{"id":"Releaser.VersionUtils","deprecated":false,"group":"Bonfire utilities","title":"Releaser.VersionUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bump_major/1","deprecated":false,"title":"bump_major(version)","anchor":"bump_major/1"},{"id":"bump_minor/1","deprecated":false,"title":"bump_minor(version)","anchor":"bump_minor/1"},{"id":"bump_patch/1","deprecated":false,"title":"bump_patch(version)","anchor":"bump_patch/1"},{"id":"bump_pre/2","deprecated":false,"title":"bump_pre(version, pre_label)","anchor":"bump_pre/2"},{"id":"get_version/1","deprecated":false,"title":"get_version(mix_path \\\\ \".\")","anchor":"get_version/1"},{"id":"set_version/2","deprecated":false,"title":"set_version(version, mix_path \\\\ \".\")","anchor":"set_version/2"},{"id":"update_version/2","deprecated":false,"title":"update_version(version, pre_label)","anchor":"update_version/2"},{"id":"version_to_string/1","deprecated":false,"title":"version_to_string(version)","anchor":"version_to_string/1"}],"key":"functions"}]},{"id":"Untangle","deprecated":false,"group":"Bonfire utilities","title":"Untangle","sections":[{"id":"Logging/inspecting","anchor":"module-logging-inspecting"},{"id":"Timing functions","anchor":"module-timing-functions"},{"id":"Installation","anchor":"module-installation"},{"id":"In config/config.exs","anchor":"module-in-config-config-exs"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_dbg/3","deprecated":false,"title":"custom_dbg(code, options, env)","anchor":"custom_dbg/3"},{"id":"debug/3","deprecated":false,"title":"debug(thing, label \\\\ nil, opts \\\\ [])","anchor":"debug/3"},{"id":"dump/3","deprecated":false,"title":"dump(thing, label \\\\ nil, opts \\\\ [])","anchor":"dump/3"},{"id":"error/3","deprecated":false,"title":"error(thing, label \\\\ nil, opts \\\\ [])","anchor":"error/3"},{"id":"format_application_location/3","deprecated":false,"title":"format_application_location(app \\\\ nil, module, location)","anchor":"format_application_location/3"},{"id":"format_location/2","deprecated":false,"title":"format_location(dep_path \\\\ nil, opts)","anchor":"format_location/2"},{"id":"format_stacktrace/1","deprecated":false,"title":"format_stacktrace(trace \\\\ nil)","anchor":"format_stacktrace/1"},{"id":"format_stacktrace_entry/1","deprecated":false,"title":"format_stacktrace_entry(entry)","anchor":"format_stacktrace_entry/1"},{"id":"format_stacktrace_label/2","deprecated":false,"title":"format_stacktrace_label(stacktrace, skip \\\\ 0)","anchor":"format_stacktrace_label/2"},{"id":"format_stacktrace_sliced/3","deprecated":false,"title":"format_stacktrace_sliced(stacktrace, starts \\\\ 1, amount \\\\ 5)","anchor":"format_stacktrace_sliced/3"},{"id":"info/3","deprecated":false,"title":"info(thing, label \\\\ nil, opts \\\\ [])","anchor":"info/3"},{"id":"log_level?/1","deprecated":false,"title":"log_level?(level)","anchor":"log_level?/1"},{"id":"maybe_dbg/3","deprecated":false,"title":"maybe_dbg(thing, label \\\\ \"\", options)","anchor":"maybe_dbg/3"},{"id":"maybe_info/3","deprecated":false,"title":"maybe_info(thing, label \\\\ \"\", options)","anchor":"maybe_info/3"},{"id":"module_name/1","deprecated":false,"title":"module_name(name)","anchor":"module_name/1"},{"id":"smart/3","deprecated":false,"title":"smart(thing, label \\\\ \"\", options)","anchor":"smart/3"},{"id":"warn/3","deprecated":false,"title":"warn(thing, label \\\\ nil, opts \\\\ [])","anchor":"warn/3"}],"key":"functions"}]},{"id":"Untangle.Time","deprecated":false,"group":"Bonfire utilities","title":"Untangle.Time","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"time/0","deprecated":false,"title":"time()","anchor":"time/0"},{"id":"time/2","deprecated":false,"title":"time(fn_body, context)","anchor":"time/2"}],"key":"functions"}]},{"id":"Voodoo","deprecated":false,"group":"Bonfire utilities","title":"Voodoo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"def_reverse_router/2","deprecated":false,"title":"def_reverse_router(name, opts)","anchor":"def_reverse_router/2"},{"id":"router/1","deprecated":false,"title":"router(map)","anchor":"router/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL","sections":[{"id":"GraphQL Introduction","anchor":"module-graphql-introduction"},{"id":"Absinthe Introduction","anchor":"module-absinthe-introduction"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".API.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"admin_or/2","deprecated":false,"title":"admin_or(info, value)","anchor":"admin_or/2"},{"id":"admin_or_empty_page/1","deprecated":false,"title":"admin_or_empty_page(info)","anchor":"admin_or_empty_page/1"},{"id":"admin_or_not_permitted/1","deprecated":false,"title":"admin_or_not_permitted(info)","anchor":"admin_or_not_permitted/1"},{"id":"cast_int_ulid_id/1","deprecated":false,"title":"cast_int_ulid_id(arg1)","anchor":"cast_int_ulid_id/1"},{"id":"cast_nonnegint/1","deprecated":false,"title":"cast_nonnegint(int)","anchor":"cast_nonnegint/1"},{"id":"cast_posint/1","deprecated":false,"title":"cast_posint(int)","anchor":"cast_posint/1"},{"id":"cast_ulid/1","deprecated":false,"title":"cast_ulid(str)","anchor":"cast_ulid/1"},{"id":"current_account/1","deprecated":false,"title":"current_account(arg1)","anchor":"current_account/1"},{"id":"current_user/1","deprecated":false,"title":"current_user(arg1)","anchor":"current_user/1"},{"id":"current_user_or/2","deprecated":false,"title":"current_user_or(info, value)","anchor":"current_user_or/2"},{"id":"current_user_or_empty_page/1","deprecated":false,"title":"current_user_or_empty_page(info)","anchor":"current_user_or_empty_page/1"},{"id":"current_user_or_not_found/1","deprecated":false,"title":"current_user_or_not_found(info)","anchor":"current_user_or_not_found/1"},{"id":"current_user_or_not_logged_in/1","deprecated":false,"title":"current_user_or_not_logged_in(info)","anchor":"current_user_or_not_logged_in/1"},{"id":"empty_page/0","deprecated":false,"title":"empty_page()","anchor":"empty_page/0"},{"id":"equals_or/4","deprecated":false,"title":"equals_or(l, r, good, bad)","anchor":"equals_or/4"},{"id":"equals_or_not_permitted/2","deprecated":false,"title":"equals_or_not_permitted(l, r)","anchor":"equals_or_not_permitted/2"},{"id":"full_page_opts/3","deprecated":false,"title":"full_page_opts(attrs, cursor_validators, opts \\\\ %{})","anchor":"full_page_opts/3"},{"id":"guest_only/1","deprecated":false,"title":"guest_only(info)","anchor":"guest_only/1"},{"id":"in_list?/1","deprecated":false,"title":"in_list?(info)","anchor":"in_list?/1"},{"id":"invalid_credential/0","deprecated":false,"title":"invalid_credential()","anchor":"invalid_credential/0"},{"id":"is_authenticated/1","deprecated":false,"title":"is_authenticated(arg1)","anchor":"is_authenticated/1"},{"id":"limit_page_opts/2","deprecated":false,"title":"limit_page_opts(attrs, opts \\\\ %{})","anchor":"limit_page_opts/2"},{"id":"list_depth/1","deprecated":false,"title":"list_depth(info)","anchor":"list_depth/1"},{"id":"not_found/0","deprecated":false,"title":"not_found()","anchor":"not_found/0"},{"id":"not_in_list_or/2","deprecated":false,"title":"not_in_list_or(info, value)","anchor":"not_in_list_or/2"},{"id":"not_in_list_or_empty_page/1","deprecated":false,"title":"not_in_list_or_empty_page(info)","anchor":"not_in_list_or_empty_page/1"},{"id":"not_logged_in/0","deprecated":false,"title":"not_logged_in()","anchor":"not_logged_in/0"},{"id":"not_permitted/1","deprecated":false,"title":"not_permitted(what \\\\ \"to do this\")","anchor":"not_permitted/1"},{"id":"parent_name/1","deprecated":false,"title":"parent_name(resolution)","anchor":"parent_name/1"},{"id":"predicated/1","deprecated":false,"title":"predicated(fun)","anchor":"predicated/1"},{"id":"predicated/2","deprecated":false,"title":"predicated(fun, arg)","anchor":"predicated/2"},{"id":"reproject/2","deprecated":false,"title":"reproject(projection, list)","anchor":"reproject/2"},{"id":"reverse_path/1","deprecated":false,"title":"reverse_path(info)","anchor":"reverse_path/1"},{"id":"validate_cursor/2","deprecated":false,"title":"validate_cursor(arg1, arg2)","anchor":"validate_cursor/2"},{"id":"wanted/2","deprecated":false,"title":"wanted(resolution, path \\\\ [])","anchor":"wanted/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Auth","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Auth","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Auth","nodeGroups":[{"name":"Functions","nodes":[{"id":"account_by/1","deprecated":false,"title":"account_by(account)","anchor":"account_by/1"},{"id":"build_context/1","deprecated":false,"title":"build_context(conn)","anchor":"build_context/1"},{"id":"login/3","deprecated":false,"title":"login(_, attrs, _)","anchor":"login/3"},{"id":"select_user/3","deprecated":false,"title":"select_user(_, attrs, info)","anchor":"select_user/3"},{"id":"set_context_from_resolution/2","deprecated":false,"title":"set_context_from_resolution(resolution, _)","anchor":"set_context_from_resolution/2"},{"id":"set_session_from_context/2","deprecated":false,"title":"set_session_from_context(conn, arg2)","anchor":"set_session_from_context/2"},{"id":"token_new/1","deprecated":false,"title":"token_new(ids)","anchor":"token_new/1"},{"id":"token_verify/1","deprecated":false,"title":"token_verify(token)","anchor":"token_verify/1"},{"id":"user_by/1","deprecated":false,"title":"user_by(arg)","anchor":"user_by/1"},{"id":"user_by/2","deprecated":false,"title":"user_by(username_or_user_id, account)","anchor":"user_by/2"},{"id":"username/1","deprecated":false,"title":"username(user)","anchor":"username/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.CommonResolver","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.CommonResolver","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.CommonResolver","nodeGroups":[{"name":"Functions","nodes":[{"id":"canonical_url_edge/3","deprecated":false,"title":"canonical_url_edge(obj, _, _)","anchor":"canonical_url_edge/3"},{"id":"context_edge/3","deprecated":false,"title":"context_edge(arg1, _, info)","anchor":"context_edge/3"},{"id":"context_edges/3","deprecated":false,"title":"context_edges(map, page_opts, info)","anchor":"context_edges/3"},{"id":"created_at_edge/3","deprecated":false,"title":"created_at_edge(map, _, _)","anchor":"created_at_edge/3"},{"id":"delete/2","deprecated":false,"title":"delete(map, info)","anchor":"delete/2"},{"id":"display_username_edge/3","deprecated":false,"title":"display_username_edge(object, _, _)","anchor":"display_username_edge/3"},{"id":"fetch_context_edge/2","deprecated":false,"title":"fetch_context_edge(_, ids)","anchor":"fetch_context_edge/2"},{"id":"fetch_context_edges/3","deprecated":false,"title":"fetch_context_edges(page_opts, info, pointers)","anchor":"fetch_context_edges/3"},{"id":"is_deleted_edge/3","deprecated":false,"title":"is_deleted_edge(parent, _, _)","anchor":"is_deleted_edge/3"},{"id":"is_disabled_edge/3","deprecated":false,"title":"is_disabled_edge(parent, _, _)","anchor":"is_disabled_edge/3"},{"id":"is_hidden_edge/3","deprecated":false,"title":"is_hidden_edge(parent, _, _)","anchor":"is_hidden_edge/3"},{"id":"is_local_edge/3","deprecated":false,"title":"is_local_edge(map, _, _)","anchor":"is_local_edge/3"},{"id":"is_public_edge/3","deprecated":false,"title":"is_public_edge(parent, _, _)","anchor":"is_public_edge/3"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.CommonSchema","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.CommonSchema","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.CommonSchema"},{"id":"Bonfire.API.GraphQL.Cursor","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Cursor","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Cursor"},{"id":"Bonfire.API.GraphQL.FetchFields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchFields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchFields","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_fields)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.FetchPage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchPage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchPage","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.FetchPages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchPages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchPages","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_pages)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Fields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Fields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Fields","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(fields, key, default \\\\ nil)","anchor":"get/3"},{"id":"getter/2","deprecated":false,"title":"getter(key, default \\\\ nil)","anchor":"getter/2"},{"id":"new/2","deprecated":false,"title":"new(data, group_fn)","anchor":"new/2"},{"id":"new/3","deprecated":false,"title":"new(data, group_fn, map_fn)","anchor":"new/3"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.JSON","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.JSON","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.JSON"},{"id":"Bonfire.API.GraphQL.MastoCompatible.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.MastoCompatible.Router","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.MastoCompatible.Router","nodeGroups":[{"name":"Functions","nodes":[{"id":"include_masto_api/0","deprecated":false,"title":"include_masto_api()","anchor":"include_masto_api/0"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.CollapseErrors","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.CollapseErrors","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, _)","anchor":"call/2"},{"id":"collapse/1","deprecated":false,"title":"collapse(list)","anchor":"collapse/1"},{"id":"collapse/2","deprecated":false,"title":"collapse(other, extra)","anchor":"collapse/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.Debug","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, arg2)","anchor":"call/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.RenderLists","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.RenderLists","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.RenderLists","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, _)","anchor":"call/2"},{"id":"collapse/1","deprecated":false,"title":"collapse(list)","anchor":"collapse/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Page","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Page","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Page","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/4","deprecated":false,"title":"new(edges, total_count, cursor_fn, page_opts)","anchor":"new/4"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.PageInfo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.PageInfo","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.PageInfo","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/4","deprecated":false,"title":"new(start_cursor, end_cursor, has_previous_page, has_next_page)","anchor":"new/4"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Pages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Pages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Pages","nodeGroups":[{"name":"Types","nodes":[{"id":"counts/0","deprecated":false,"title":"counts()","anchor":"t:counts/0"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"t:data/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(pages, key)","anchor":"get/2"},{"id":"getter/1","deprecated":false,"title":"getter(key)","anchor":"getter/1"},{"id":"new/4","deprecated":false,"title":"new(data, counts, cursor_fn, page_opts)","anchor":"new/4"},{"id":"new/5","deprecated":false,"title":"new(data_rows, count_rows, group_fn, cursor_fn, page_opts)","anchor":"new/5"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Pagination","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Pagination","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Pagination","nodeGroups":[{"name":"Functions","nodes":[{"id":"connection_paginate/3","deprecated":false,"title":"connection_paginate(list, args, opts \\\\ [])","anchor":"connection_paginate/3"},{"id":"page/7","deprecated":false,"title":"page(queries, schema, cursor_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"page/7"},{"id":"page_all/7","deprecated":false,"title":"page_all(queries, schema, cursor_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"page_all/7"},{"id":"pages/8","deprecated":false,"title":"pages(queries, schema, cursor_fn, group_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"pages/8"},{"id":"pagination_args_filter/1","deprecated":false,"title":"pagination_args_filter(args)","anchor":"pagination_args_filter/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.PlugPipelines","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.PlugPipelines","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.PlugPipelines","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_pipeline/2","deprecated":false,"title":"default_pipeline(config, opts)","anchor":"default_pipeline/2"},{"id":"run/2","deprecated":false,"title":"run(blueprint, _)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Plugs.GraphQLContext","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Plugs.GraphQLContext","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, _)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.QueryHelper","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.QueryHelper","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.QueryHelper","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_overrides/2","deprecated":false,"title":"apply_overrides(fields, override_fun)","anchor":"apply_overrides/2"},{"id":"camelize/1","deprecated":false,"title":"camelize(type)","anchor":"camelize/1"},{"id":"do_format_fields/3","deprecated":false,"title":"do_format_fields(type, arg2, schema)","anchor":"do_format_fields/3"},{"id":"document_for/4","deprecated":false,"title":"document_for(schema, type, nesting \\\\ 1, override_fun \\\\ nil)","anchor":"document_for/4"},{"id":"fields_for/3","deprecated":false,"title":"fields_for(schema, type, nesting)","anchor":"fields_for/3"},{"id":"format_fields/4","deprecated":false,"title":"format_fields(fields, type, left_pad, schema)","anchor":"format_fields/4"},{"id":"get_fields/3","deprecated":false,"title":"get_fields(type, schema, nesting)","anchor":"get_fields/3"},{"id":"maybe_debug_api/4","deprecated":false,"title":"maybe_debug_api(q, obj, debug, msg \\\\ \"The below GraphQL query had some errors in the response\")","anchor":"maybe_debug_api/4"},{"id":"padding/1","deprecated":false,"title":"padding(left_pad)","anchor":"padding/1"},{"id":"query_with_id/4","deprecated":false,"title":"query_with_id(schema, type, nesting \\\\ 1, override_fun \\\\ nil)","anchor":"query_with_id/4"},{"id":"run_query_id/6","deprecated":false,"title":"run_query_id(id, schema, type, nesting \\\\ 1, override_fun \\\\ nil, debug \\\\ nil)","anchor":"run_query_id/6"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveField","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveField","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveField","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_field)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveFields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveFields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveFields","nodeGroups":[{"name":"Types","nodes":[{"id":"getter/0","deprecated":false,"title":"getter()","anchor":"t:getter/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"default_getter/2","deprecated":false,"title":"default_getter(context, default)","anchor":"default_getter/2"},{"id":"run/1","deprecated":false,"title":"run(resolve_fields)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolvePage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolvePage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolvePage","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolvePages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolvePages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolvePages","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(rp)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveRootPage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveRootPage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveRootPage","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_root_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.RestAdapter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.RestAdapter","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.RestAdapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"endpoint/3","deprecated":false,"title":"endpoint(query, success_fn \\\\ nil, error_fn \\\\ nil)","anchor":"endpoint/3"},{"id":"error_fn/2","deprecated":false,"title":"error_fn(response, conn)","anchor":"error_fn/2"},{"id":"return/4","deprecated":false,"title":"return(name, ret, conn, transform_fun \\\\ nil)","anchor":"return/4"},{"id":"success_fn/2","deprecated":false,"title":"success_fn(response, conn)","anchor":"success_fn/2"},{"id":"transform_data/1","deprecated":false,"title":"transform_data(data)","anchor":"transform_data/1"},{"id":"transform_data/2","deprecated":false,"title":"transform_data(data, transform_fun)","anchor":"transform_data/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.RestAdapter.EndpointConfig"},{"id":"Bonfire.API.GraphQL.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Router","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Router"},{"id":"Bonfire.API.GraphQL.SchemaPipelines","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.SchemaPipelines","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.SchemaPipelines","nodeGroups":[{"name":"Functions","nodes":[{"id":"pipeline/1","deprecated":false,"title":"pipeline(pipeline)","anchor":"pipeline/1"},{"id":"run/2","deprecated":false,"title":"run(blueprint, _)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.SchemaUtils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.SchemaUtils","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.SchemaUtils","nodeGroups":[{"name":"Functions","nodes":[{"id":"context_types/0","deprecated":false,"title":"context_types()","anchor":"context_types/0"},{"id":"hydrations_merge/1","deprecated":false,"title":"hydrations_merge(hydrators)","anchor":"hydrations_merge/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Test.GraphQLAssertions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Test.GraphQLAssertions","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_binary/1","deprecated":false,"title":"assert_binary(val)","anchor":"assert_binary/1"},{"id":"assert_boolean/1","deprecated":false,"title":"assert_boolean(val)","anchor":"assert_boolean/1"},{"id":"assert_created_at/2","deprecated":false,"title":"assert_created_at(map1, map2)","anchor":"assert_created_at/2"},{"id":"assert_cursor/1","deprecated":false,"title":"assert_cursor(x)","anchor":"assert_cursor/1"},{"id":"assert_cursors/1","deprecated":false,"title":"assert_cursors(x)","anchor":"assert_cursors/1"},{"id":"assert_datetime/1","deprecated":false,"title":"assert_datetime(time)","anchor":"assert_datetime/1"},{"id":"assert_datetime/2","deprecated":false,"title":"assert_datetime(dt, du)","anchor":"assert_datetime/2"},{"id":"assert_display_username/1","deprecated":false,"title":"assert_display_username(val)","anchor":"assert_display_username/1"},{"id":"assert_email/1","deprecated":false,"title":"assert_email(val)","anchor":"assert_email/1"},{"id":"assert_eq/1","deprecated":false,"title":"assert_eq(val1)","anchor":"assert_eq/1"},{"id":"assert_field/3","deprecated":false,"title":"assert_field(object, key, test)","anchor":"assert_field/3"},{"id":"assert_float/1","deprecated":false,"title":"assert_float(val)","anchor":"assert_float/1"},{"id":"assert_int/1","deprecated":false,"title":"assert_int(val)","anchor":"assert_int/1"},{"id":"assert_invalid_credential/2","deprecated":false,"title":"assert_invalid_credential(errs, path)","anchor":"assert_invalid_credential/2"},{"id":"assert_list/0","deprecated":false,"title":"assert_list()","anchor":"assert_list/0"},{"id":"assert_list/1","deprecated":false,"title":"assert_list(of)","anchor":"assert_list/1"},{"id":"assert_list/2","deprecated":false,"title":"assert_list(of, size)","anchor":"assert_list/2"},{"id":"assert_location/1","deprecated":false,"title":"assert_location(loc)","anchor":"assert_location/1"},{"id":"assert_maps_eq/3","deprecated":false,"title":"assert_maps_eq(left, right, name)","anchor":"assert_maps_eq/3"},{"id":"assert_maps_eq/4","deprecated":false,"title":"assert_maps_eq(left, right, name, required)","anchor":"assert_maps_eq/4"},{"id":"assert_maps_eq/5","deprecated":false,"title":"assert_maps_eq(left, right, name, required, optional)","anchor":"assert_maps_eq/5"},{"id":"assert_non_neg/1","deprecated":false,"title":"assert_non_neg(val)","anchor":"assert_non_neg/1"},{"id":"assert_not_found/2","deprecated":false,"title":"assert_not_found(errs, path)","anchor":"assert_not_found/2"},{"id":"assert_not_logged_in/2","deprecated":false,"title":"assert_not_logged_in(errs, path)","anchor":"assert_not_logged_in/2"},{"id":"assert_not_permitted/3","deprecated":false,"title":"assert_not_permitted(errs, path, verb \\\\ \"do\")","anchor":"assert_not_permitted/3"},{"id":"assert_object/4","deprecated":false,"title":"assert_object(struct, name, required, optional \\\\ [])","anchor":"assert_object/4"},{"id":"assert_optional/1","deprecated":false,"title":"assert_optional(map_fn)","anchor":"assert_optional/1"},{"id":"assert_optional_field/3","deprecated":false,"title":"assert_optional_field(object, key, test)","anchor":"assert_optional_field/3"},{"id":"assert_page/0","deprecated":false,"title":"assert_page()","anchor":"assert_page/0"},{"id":"assert_page/1","deprecated":false,"title":"assert_page(of)","anchor":"assert_page/1"},{"id":"assert_page/6","deprecated":false,"title":"assert_page(page, returned_count, total_count, prev?, next?, cursor_fn)","anchor":"assert_page/6"},{"id":"assert_page_info/1","deprecated":false,"title":"assert_page_info(page_info)","anchor":"assert_page_info/1"},{"id":"assert_pos/1","deprecated":false,"title":"assert_pos(val)","anchor":"assert_pos/1"},{"id":"assert_ulid/1","deprecated":false,"title":"assert_ulid(ulid)","anchor":"assert_ulid/1"},{"id":"assert_updated_at/2","deprecated":false,"title":"assert_updated_at(map1, map2)","anchor":"assert_updated_at/2"},{"id":"assert_url/1","deprecated":false,"title":"assert_url(url)","anchor":"assert_url/1"},{"id":"assert_username/1","deprecated":false,"title":"assert_username(val)","anchor":"assert_username/1"},{"id":"assert_uuid/1","deprecated":false,"title":"assert_uuid(uuid)","anchor":"assert_uuid/1"},{"id":"uncamel_map/1","deprecated":false,"title":"uncamel_map(map)","anchor":"uncamel_map/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.UserSocket","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.UserSocket","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.UserSocket","nodeGroups":[{"name":"Functions","nodes":[{"id":"build_context_from_params/2","deprecated":false,"title":"build_context_from_params(params, socket)","anchor":"build_context_from_params/2"},{"id":"connect/2","deprecated":false,"title":"connect(params, socket)","anchor":"connect/2"},{"id":"id/1","deprecated":false,"title":"id(socket)","anchor":"id/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries","sections":[{"id":"Glossary","anchor":"module-glossary"},{"id":"Users and Circles","anchor":"module-users-and-circles"},{"id":"Verbs","anchor":"module-verbs"},{"id":"Permissions","anchor":"module-permissions"},{"id":"ACLs","anchor":"module-acls"},{"id":"Controlled - Applying boundaries to an object","anchor":"module-controlled-applying-boundaries-to-an-object"},{"id":"Practical example: Surprise birthday party","anchor":"module-practical-example-surprise-birthday-party"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Boundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"acls_from_preset_boundary_names/1","deprecated":false,"title":"acls_from_preset_boundary_names(presets)","anchor":"acls_from_preset_boundary_names/1"},{"id":"boundaries_normalise/1","deprecated":false,"title":"boundaries_normalise(text)","anchor":"boundaries_normalise/1"},{"id":"boundaries_or_default/2","deprecated":false,"title":"boundaries_or_default(to_boundaries, context \\\\ [])","anchor":"boundaries_or_default/2"},{"id":"can?/4","deprecated":false,"title":"can?(subject, verbs, object, opts \\\\ [])","anchor":"can?/4"},{"id":"default_boundaries/1","deprecated":false,"title":"default_boundaries(context \\\\ [])","anchor":"default_boundaries/1"},{"id":"find_caretaker_stereotype/3","deprecated":false,"title":"find_caretaker_stereotype(caretaker, stereotype, from)","anchor":"find_caretaker_stereotype/3"},{"id":"find_caretaker_stereotypes/3","deprecated":false,"title":"find_caretaker_stereotypes(caretaker, stereotypes, from \\\\ Pointer)","anchor":"find_caretaker_stereotypes/3"},{"id":"list_grants_on/1","deprecated":false,"title":"list_grants_on(things)","anchor":"list_grants_on/1"},{"id":"list_grants_on/2","deprecated":false,"title":"list_grants_on(things, verbs)","anchor":"list_grants_on/2"},{"id":"list_object_acls/2","deprecated":false,"title":"list_object_acls(object, opts \\\\ [])","anchor":"list_object_acls/2"},{"id":"list_object_boundaries/2","deprecated":false,"title":"list_object_boundaries(object, opts \\\\ [])","anchor":"list_object_boundaries/2"},{"id":"load_pointer/2","deprecated":false,"title":"load_pointer(item, opts)","anchor":"load_pointer/2"},{"id":"load_pointers/2","deprecated":false,"title":"load_pointers(items, opts)","anchor":"load_pointers/2"},{"id":"load_pointers!/2","deprecated":false,"title":"load_pointers!(items, opts)","anchor":"load_pointers!/2"},{"id":"pointer_permitted?/2","deprecated":false,"title":"pointer_permitted?(item, opts)","anchor":"pointer_permitted?/2"},{"id":"preset_boundary_from_acl/2","deprecated":false,"title":"preset_boundary_from_acl(acl, object_type \\\\ nil)","anchor":"preset_boundary_from_acl/2"},{"id":"preset_boundary_tuple_from_acl/2","deprecated":false,"title":"preset_boundary_tuple_from_acl(acl, object_type \\\\ nil)","anchor":"preset_boundary_tuple_from_acl/2"},{"id":"preset_name/2","deprecated":false,"title":"preset_name(boundaries, include_remote? \\\\ false)","anchor":"preset_name/2"},{"id":"set_boundaries/3","deprecated":false,"title":"set_boundaries(creator, object, opts)","anchor":"set_boundaries/3"},{"id":"take_care_of!/2","deprecated":false,"title":"take_care_of!(things, user)","anchor":"take_care_of!/2"},{"id":"user_default_boundaries/0","deprecated":false,"title":"user_default_boundaries()","anchor":"user_default_boundaries/0"},{"id":"users_grants_on/2","deprecated":false,"title":"users_grants_on(users, things)","anchor":"users_grants_on/2"},{"id":"users_grants_on/3","deprecated":false,"title":"users_grants_on(users, things, verbs)","anchor":"users_grants_on/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Acls","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Acls","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Acls","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl_grants_to_tuples/2","deprecated":false,"title":"acl_grants_to_tuples(creator, acls)","anchor":"acl_grants_to_tuples/2"},{"id":"acl_id/1","deprecated":false,"title":"acl_id(obj)","anchor":"acl_id/1"},{"id":"acls/0","deprecated":false,"title":"acls()","anchor":"acls/0"},{"id":"acls_from_preset/3","deprecated":false,"title":"acls_from_preset(creator, to_boundaries, opts \\\\ [])","anchor":"acls_from_preset/3"},{"id":"base_acls_from_preset/3","deprecated":false,"title":"base_acls_from_preset(creator, preset, opts \\\\ [])","anchor":"base_acls_from_preset/3"},{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, creator, opts)","anchor":"cast/3"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, attrs, opts)","anchor":"changeset/3"},{"id":"create/2","deprecated":false,"title":"create(attrs \\\\ %{}, opts)","anchor":"create/2"},{"id":"default_exclude_ids/1","deprecated":false,"title":"default_exclude_ids(including_custom? \\\\ true)","anchor":"default_exclude_ids/1"},{"id":"delete/2","deprecated":false,"title":"delete(acl, opts)","anchor":"delete/2"},{"id":"edit/3","deprecated":false,"title":"edit(acl, user, params)","anchor":"edit/3"},{"id":"exclude_stereotypes/1","deprecated":false,"title":"exclude_stereotypes(including_custom? \\\\ true)","anchor":"exclude_stereotypes/1"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"get!/1","deprecated":false,"title":"get!(slug)","anchor":"get!/1"},{"id":"get_for_caretaker/3","deprecated":false,"title":"get_for_caretaker(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker/3"},{"id":"get_for_caretaker_q/3","deprecated":false,"title":"get_for_caretaker_q(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker_q/3"},{"id":"get_id/1","deprecated":false,"title":"get_id(slug)","anchor":"get_id/1"},{"id":"get_id!/1","deprecated":false,"title":"get_id!(slug)","anchor":"get_id!/1"},{"id":"get_object_custom_acl/1","deprecated":false,"title":"get_object_custom_acl(object)","anchor":"get_object_custom_acl/1"},{"id":"get_or_create_object_custom_acl/2","deprecated":false,"title":"get_or_create_object_custom_acl(object, caretaker \\\\ nil)","anchor":"get_or_create_object_custom_acl/2"},{"id":"grant_tuples_from_preset/3","deprecated":false,"title":"grant_tuples_from_preset(creator, to_boundaries, opts \\\\ [])","anchor":"grant_tuples_from_preset/3"},{"id":"is_built_in?/1","deprecated":false,"title":"is_built_in?(acl)","anchor":"is_built_in?/1"},{"id":"is_object_custom?/1","deprecated":false,"title":"is_object_custom?(acl)","anchor":"is_object_custom?/1"},{"id":"is_stereotype?/1","deprecated":false,"title":"is_stereotype?(acl)","anchor":"is_stereotype?/1"},{"id":"is_stereotyped?/1","deprecated":false,"title":"is_stereotyped?(acl)","anchor":"is_stereotyped?/1"},{"id":"list/1","deprecated":false,"title":"list(opts \\\\ [])","anchor":"list/1"},{"id":"list_built_ins/1","deprecated":false,"title":"list_built_ins(opts \\\\ [])","anchor":"list_built_ins/1"},{"id":"list_my/2","deprecated":false,"title":"list_my(user, opts \\\\ [])","anchor":"list_my/2"},{"id":"list_my_q/2","deprecated":false,"title":"list_my_q(user, opts \\\\ [])","anchor":"list_my_q/2"},{"id":"list_my_with_counts/2","deprecated":false,"title":"list_my_with_counts(user, opts \\\\ [])","anchor":"list_my_with_counts/2"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts \\\\ [])","anchor":"list_q/1"},{"id":"maybe_by_ids/2","deprecated":false,"title":"maybe_by_ids(query, ids)","anchor":"maybe_by_ids/2"},{"id":"maybe_search/2","deprecated":false,"title":"maybe_search(query, text)","anchor":"maybe_search/2"},{"id":"opts_for_dropdown/0","deprecated":false,"title":"opts_for_dropdown()","anchor":"opts_for_dropdown/0"},{"id":"opts_for_list/0","deprecated":false,"title":"opts_for_list()","anchor":"opts_for_list/0"},{"id":"prepare_cast/3","deprecated":false,"title":"prepare_cast(changeset_or_obj, creator, opts)","anchor":"prepare_cast/3"},{"id":"preset_acl_ids/0","deprecated":false,"title":"preset_acl_ids()","anchor":"preset_acl_ids/0"},{"id":"preset_acl_ids/2","deprecated":false,"title":"preset_acl_ids(preset, preset_acls \\\\ Config.get!(:preset_acls_match))","anchor":"preset_acl_ids/2"},{"id":"preview/2","deprecated":false,"title":"preview(creator, opts)","anchor":"preview/2"},{"id":"remote_public_acl_ids/0","deprecated":false,"title":"remote_public_acl_ids()","anchor":"remote_public_acl_ids/0"},{"id":"set/3","deprecated":false,"title":"set(object, creator, opts)","anchor":"set/3"},{"id":"simple_create/2","deprecated":false,"title":"simple_create(caretaker, name)","anchor":"simple_create/2"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(acl, opts)","anchor":"soft_delete/2"},{"id":"stereotype_ids/0","deprecated":false,"title":"stereotype_ids()","anchor":"stereotype_ids/0"},{"id":"user_default_acl/1","deprecated":false,"title":"user_default_acl(name)","anchor":"user_default_acl/1"},{"id":"user_default_acls/0","deprecated":false,"title":"user_default_acls()","anchor":"user_default_acls/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Acts.SetBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Acts.SetBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Acts.SetBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Blocks","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Blocks","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Blocks","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(blocker, activity, blocked)","anchor":"ap_receive_activity/3"},{"id":"block/3","deprecated":false,"title":"block(user_or_instance_to_block, block_type \\\\ nil, scope)","anchor":"block/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"instance_wide_block/2","deprecated":false,"title":"instance_wide_block(user_or_instance_to_block, block_type \\\\ nil)","anchor":"instance_wide_block/2"},{"id":"instance_wide_circles/1","deprecated":false,"title":"instance_wide_circles(block_types)","anchor":"instance_wide_circles/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(user_or_instance, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/2","deprecated":false,"title":"list(block_type, opts)","anchor":"list/2"},{"id":"remote_instance_block/3","deprecated":false,"title":"remote_instance_block(display_hostname, block_type, scope)","anchor":"remote_instance_block/3"},{"id":"types_blocked/1","deprecated":false,"title":"types_blocked(types)","anchor":"types_blocked/1"},{"id":"unblock/3","deprecated":false,"title":"unblock(user_or_instance_to_unblock, block_type \\\\ nil, scope)","anchor":"unblock/3"},{"id":"unblock_all/2","deprecated":false,"title":"unblock_all(block_type \\\\ nil, scope)","anchor":"unblock_all/2"},{"id":"user_block_circles/2","deprecated":false,"title":"user_block_circles(current_user, block_type)","anchor":"user_block_circles/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Blocks.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Blocks.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Blocks.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"preload_one/2","deprecated":false,"title":"preload_one(object, opts)","anchor":"preload_one/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Circles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Circles","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Circles","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_to_circles/2","deprecated":false,"title":"add_to_circles(subjects, circles)","anchor":"add_to_circles/2"},{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"changeset/2","deprecated":false,"title":"changeset(circle \\\\ %Circle{}, attrs)","anchor":"changeset/2"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, circle, params)","anchor":"changeset/3"},{"id":"circle_ids/1","deprecated":false,"title":"circle_ids(subjects)","anchor":"circle_ids/1"},{"id":"circles/0","deprecated":false,"title":"circles()","anchor":"circles/0"},{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(circle, opts)","anchor":"delete/2"},{"id":"edit/3","deprecated":false,"title":"edit(circle, user, params)","anchor":"edit/3"},{"id":"empty_circles/1","deprecated":false,"title":"empty_circles(circles)","anchor":"empty_circles/1"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"get!/1","deprecated":false,"title":"get!(slug)","anchor":"get!/1"},{"id":"get_by_name/2","deprecated":false,"title":"get_by_name(name, caretaker)","anchor":"get_by_name/2"},{"id":"get_for_caretaker/3","deprecated":false,"title":"get_for_caretaker(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker/3"},{"id":"get_id/1","deprecated":false,"title":"get_id(slug)","anchor":"get_id/1"},{"id":"get_id!/1","deprecated":false,"title":"get_id!(slug)","anchor":"get_id!/1"},{"id":"get_or_create/2","deprecated":false,"title":"get_or_create(name, caretaker \\\\ nil)","anchor":"get_or_create/2"},{"id":"get_stereotype_circles/2","deprecated":false,"title":"get_stereotype_circles(subject, stereotypes)","anchor":"get_stereotype_circles/2"},{"id":"get_tuple/1","deprecated":false,"title":"get_tuple(slug)","anchor":"get_tuple/1"},{"id":"is_built_in?/1","deprecated":false,"title":"is_built_in?(circle)","anchor":"is_built_in?/1"},{"id":"is_encircled_by?/2","deprecated":false,"title":"is_encircled_by?(subject, circle)","anchor":"is_encircled_by?/2"},{"id":"is_stereotype?/1","deprecated":false,"title":"is_stereotype?(acl)","anchor":"is_stereotype?/1"},{"id":"leave_all_circles/1","deprecated":false,"title":"leave_all_circles(users)","anchor":"leave_all_circles/1"},{"id":"list_built_ins/0","deprecated":false,"title":"list_built_ins()","anchor":"list_built_ins/0"},{"id":"list_by_ids/1","deprecated":false,"title":"list_by_ids(ids)","anchor":"list_by_ids/1"},{"id":"list_my/2","deprecated":false,"title":"list_my(user, opts \\\\ [])","anchor":"list_my/2"},{"id":"list_my_defaults/1","deprecated":false,"title":"list_my_defaults(user \\\\ nil)","anchor":"list_my_defaults/1"},{"id":"list_my_with_counts/2","deprecated":false,"title":"list_my_with_counts(user, opts \\\\ [])","anchor":"list_my_with_counts/2"},{"id":"list_my_with_global/2","deprecated":false,"title":"list_my_with_global(user, opts \\\\ [])","anchor":"list_my_with_global/2"},{"id":"list_visible/2","deprecated":false,"title":"list_visible(user, opts \\\\ [])","anchor":"list_visible/2"},{"id":"preload_encircled_by/3","deprecated":false,"title":"preload_encircled_by(subject, circles, opts \\\\ [])","anchor":"preload_encircled_by/3"},{"id":"query/1","deprecated":false,"title":"query(opts \\\\ [])","anchor":"query/1"},{"id":"query_my/2","deprecated":false,"title":"query_my(caretaker, opts \\\\ [])","anchor":"query_my/2"},{"id":"query_my_by_id/3","deprecated":false,"title":"query_my_by_id(id, caretaker, opts \\\\ [])","anchor":"query_my_by_id/3"},{"id":"query_visible/2","deprecated":false,"title":"query_visible(user, opts \\\\ [])","anchor":"query_visible/2"},{"id":"remove_from_circles/2","deprecated":false,"title":"remove_from_circles(subject, circles)","anchor":"remove_from_circles/2"},{"id":"stereotype_ids/0","deprecated":false,"title":"stereotype_ids()","anchor":"stereotype_ids/0"},{"id":"stereotypes/1","deprecated":false,"title":"stereotypes(atom)","anchor":"stereotypes/1"},{"id":"to_circle_ids/1","deprecated":false,"title":"to_circle_ids(subjects)","anchor":"to_circle_ids/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Controlleds","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Controlleds","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Controlleds","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_acls/2","deprecated":false,"title":"add_acls(object, acl)","anchor":"add_acls/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(c \\\\ %Controlled{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(attrs)","anchor":"create/1"},{"id":"get_preset_on_object/1","deprecated":false,"title":"get_preset_on_object(object)","anchor":"get_preset_on_object/1"},{"id":"grant_role/4","deprecated":false,"title":"grant_role(subject_id, object, role, opts \\\\ [])","anchor":"grant_role/4"},{"id":"list_acls_on_object/2","deprecated":false,"title":"list_acls_on_object(object, opts \\\\ [])","anchor":"list_acls_on_object/2"},{"id":"list_grants_by_verbs/3","deprecated":false,"title":"list_grants_by_verbs(objects, verbs, value \\\\ true)","anchor":"list_grants_by_verbs/3"},{"id":"list_on_object/2","deprecated":false,"title":"list_on_object(object, opts \\\\ [])","anchor":"list_on_object/2"},{"id":"list_on_objects_by_subject/2","deprecated":false,"title":"list_on_objects_by_subject(objects, current_user)","anchor":"list_on_objects_by_subject/2"},{"id":"list_presets_on_objects/1","deprecated":false,"title":"list_presets_on_objects(objects)","anchor":"list_presets_on_objects/1"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts \\\\ [])","anchor":"list_q/1"},{"id":"list_subjects_by_verb/3","deprecated":false,"title":"list_subjects_by_verb(objects, verb, value \\\\ true)","anchor":"list_subjects_by_verb/3"},{"id":"remove_acls/2","deprecated":false,"title":"remove_acls(object, acls)","anchor":"remove_acls/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Debug","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_grants_on/1","deprecated":false,"title":"debug_grants_on(things)","anchor":"debug_grants_on/1"},{"id":"debug_grants_on/2","deprecated":false,"title":"debug_grants_on(things, verbs)","anchor":"debug_grants_on/2"},{"id":"debug_my_grants_on/2","deprecated":false,"title":"debug_my_grants_on(users, things)","anchor":"debug_my_grants_on/2"},{"id":"debug_object_acls/1","deprecated":false,"title":"debug_object_acls(thing)","anchor":"debug_object_acls/1"},{"id":"debug_user_acls/2","deprecated":false,"title":"debug_user_acls(user, label \\\\ \"\")","anchor":"debug_user_acls/2"},{"id":"debug_user_circles/1","deprecated":false,"title":"debug_user_circles(user)","anchor":"debug_user_circles/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Fixtures","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Fixtures","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Fixtures","nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_pub_circle/0","deprecated":false,"title":"activity_pub_circle()","anchor":"activity_pub_circle/0"},{"id":"admin_circle/0","deprecated":false,"title":"admin_circle()","anchor":"admin_circle/0"},{"id":"custom_acl/0","deprecated":false,"title":"custom_acl()","anchor":"custom_acl/0"},{"id":"fixtures/0","deprecated":false,"title":"fixtures()","anchor":"fixtures/0"},{"id":"global_circles/0","deprecated":false,"title":"global_circles()","anchor":"global_circles/0"},{"id":"insert/0","deprecated":false,"title":"insert()","anchor":"insert/0"},{"id":"instance_acl/0","deprecated":false,"title":"instance_acl()","anchor":"instance_acl/0"},{"id":"mod_circle/0","deprecated":false,"title":"mod_circle()","anchor":"mod_circle/0"},{"id":"upsert_verbs/0","deprecated":false,"title":"upsert_verbs()","anchor":"upsert_verbs/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.FixturesUsersMigrations","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.FixturesUsersMigrations","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.FixturesUsersMigrations","nodeGroups":[{"name":"Functions","nodes":[{"id":"down/0","deprecated":false,"title":"down()","anchor":"down/0"},{"id":"up/0","deprecated":false,"title":"up()","anchor":"up/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Grants","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Grants","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Grants","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(attrs, opts \\\\ [])","anchor":"create/2"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"grant/5","deprecated":false,"title":"grant(subject_id, acl_id, verb, value, opts \\\\ [])","anchor":"grant/5"},{"id":"grant_role/4","deprecated":false,"title":"grant_role(subject, acl_id, role, opts \\\\ [])","anchor":"grant_role/4"},{"id":"grants/0","deprecated":false,"title":"grants()","anchor":"grants/0"},{"id":"grants_to_tuples/2","deprecated":false,"title":"grants_to_tuples(creator, grants)","anchor":"grants_to_tuples/2"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_for_acl/2","deprecated":false,"title":"list_for_acl(acl, opts)","anchor":"list_for_acl/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(user)","anchor":"list_my/1"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts)","anchor":"list_q/1"},{"id":"remove_subject_from_acl/2","deprecated":false,"title":"remove_subject_from_acl(subject, acls)","anchor":"remove_subject_from_acl/2"},{"id":"subject_grants/1","deprecated":false,"title":"subject_grants(grants)","anchor":"subject_grants/1"},{"id":"subject_verb_grants/1","deprecated":false,"title":"subject_verb_grants(grants)","anchor":"subject_verb_grants/1"},{"id":"subjects/1","deprecated":false,"title":"subjects(grants)","anchor":"subjects/1"},{"id":"upsert_or_delete/2","deprecated":false,"title":"upsert_or_delete(attrs, opts)","anchor":"upsert_or_delete/2"},{"id":"verb_subject_grant/1","deprecated":false,"title":"verb_subject_grant(grants)","anchor":"verb_subject_grant/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Integration","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"many/3","deprecated":false,"title":"many(query, paginate?, opts \\\\ [])","anchor":"many/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl_create/2","deprecated":false,"title":"acl_create(attrs, socket)","anchor":"acl_create/2"},{"id":"boundaries_on_objects/2","deprecated":false,"title":"boundaries_on_objects(list_of_ids, current_user)","anchor":"boundaries_on_objects/2"},{"id":"circle_create/2","deprecated":false,"title":"circle_create(attrs, socket)","anchor":"circle_create/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, params, socket)","anchor":"handle_event/3"},{"id":"maybe_check_boundaries/2","deprecated":false,"title":"maybe_check_boundaries(assigns_sockets, opts \\\\ [])","anchor":"maybe_check_boundaries/2"},{"id":"maybe_redirect_to/3","deprecated":false,"title":"maybe_redirect_to(socket, path, arg3)","anchor":"maybe_redirect_to/3"},{"id":"my_acls/2","deprecated":false,"title":"my_acls(current_user_id, opts \\\\ nil)","anchor":"my_acls/2"},{"id":"my_circles_paginated/2","deprecated":false,"title":"my_circles_paginated(scope, attrs \\\\ nil)","anchor":"my_circles_paginated/2"},{"id":"prepare_assigns/1","deprecated":false,"title":"prepare_assigns(socket)","anchor":"prepare_assigns/1"},{"id":"remove_from_circle_tuples/2","deprecated":false,"title":"remove_from_circle_tuples(ids, previous_circles)","anchor":"remove_from_circle_tuples/2"},{"id":"scope_origin/2","deprecated":false,"title":"scope_origin(assigns \\\\ nil, socket)","anchor":"scope_origin/2"},{"id":"set_circles_tuples/3","deprecated":false,"title":"set_circles_tuples(field, circles, socket)","anchor":"set_circles_tuples/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"subject_name/1","deprecated":false,"title":"subject_name(subject)","anchor":"subject_name/1"},{"id":"unblock/4","deprecated":false,"title":"unblock(id, block_type, scope, socket)","anchor":"unblock/4"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_perms/2","deprecated":false,"title":"add_perms(l, r)","anchor":"add_perms/2"},{"id":"agg_perms/1","deprecated":false,"title":"agg_perms(p)","anchor":"agg_perms/1"},{"id":"boundarise/3","deprecated":false,"title":"boundarise(query, field_ref, opts)","anchor":"boundarise/3"},{"id":"object_boundarised/2","deprecated":false,"title":"object_boundarised(q, opts \\\\ nil)","anchor":"object_boundarised/2"},{"id":"permitted/1","deprecated":false,"title":"permitted(user)","anchor":"permitted/1"},{"id":"permitted/2","deprecated":false,"title":"permitted(user, verbs)","anchor":"permitted/2"},{"id":"query_with_summary/3","deprecated":false,"title":"query_with_summary(user, verbs \\\\ [:see, :read], query \\\\ Summary)","anchor":"query_with_summary/3"},{"id":"skip_boundary_check?/2","deprecated":false,"title":"skip_boundary_check?(opts, object \\\\ nil)","anchor":"skip_boundary_check?/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Roles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Roles","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Roles","nodeGroups":[{"name":"Functions","nodes":[{"id":"cannot_role_from_verb/5","deprecated":false,"title":"cannot_role_from_verb(verbs, verb_field \\\\ :verb, all_role_verbs \\\\ role_verbs(:all), role_for_all \\\\ :read, verbs_field \\\\ :cannot_verbs)","anchor":"cannot_role_from_verb/5"},{"id":"create/2","deprecated":false,"title":"create(attrs, opts)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(name, usage, opts)","anchor":"create/3"},{"id":"edit_verb_permission/4","deprecated":false,"title":"edit_verb_permission(role_name, verb, value, opts)","anchor":"edit_verb_permission/4"},{"id":"get/2","deprecated":false,"title":"get(role_name, opts \\\\ [])","anchor":"get/2"},{"id":"preset_boundary_role_from_acl/1","deprecated":false,"title":"preset_boundary_role_from_acl(summary)","anchor":"preset_boundary_role_from_acl/1"},{"id":"reset_instance_roles/0","deprecated":false,"title":"reset_instance_roles()","anchor":"reset_instance_roles/0"},{"id":"role_from_grants/2","deprecated":false,"title":"role_from_grants(grants, opts)","anchor":"role_from_grants/2"},{"id":"role_from_verb/5","deprecated":false,"title":"role_from_verb(verbs, verb_field \\\\ :verb, all_role_verbs \\\\ role_verbs(:all), role_for_all \\\\ :administer, verbs_field \\\\ :can_verbs)","anchor":"role_from_verb/5"},{"id":"role_verbs/2","deprecated":false,"title":"role_verbs(usage \\\\ :all, opts \\\\ [])","anchor":"role_verbs/2"},{"id":"roles_for_dropdown/2","deprecated":false,"title":"roles_for_dropdown(usage \\\\ nil, opts)","anchor":"roles_for_dropdown/2"},{"id":"split_tuples_can_cannot/1","deprecated":false,"title":"split_tuples_can_cannot(tuples)","anchor":"split_tuples_can_cannot/1"},{"id":"verbs_for_role/2","deprecated":false,"title":"verbs_for_role(role, opts \\\\ [])","anchor":"verbs_for_role/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Summary","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Summary","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Summary","nodeGroups":[{"name":"Functions","nodes":[{"id":"drop_views/1","deprecated":false,"title":"drop_views(view_type \\\\ \"view\")","anchor":"drop_views/1"},{"id":"migrate/1","deprecated":false,"title":"migrate(atom)","anchor":"migrate/1"},{"id":"migrate_functions/0","deprecated":false,"title":"migrate_functions()","anchor":"migrate_functions/0"},{"id":"migrate_views/0","deprecated":false,"title":"migrate_views()","anchor":"migrate_views/0"},{"id":"refresh/0","deprecated":false,"title":"refresh()","anchor":"refresh/0"},{"id":"refresh_material_view/0","deprecated":false,"title":"refresh_material_view()","anchor":"refresh_material_view/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"source/0","deprecated":false,"title":"source()","anchor":"source/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Users","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Users","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Users","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_default_boundaries/2","deprecated":false,"title":"create_default_boundaries(user, opts \\\\ [])","anchor":"create_default_boundaries/2"},{"id":"create_missing_boundaries/1","deprecated":false,"title":"create_missing_boundaries(user)","anchor":"create_missing_boundaries/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Users.PreparedBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Users.PreparedBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Users.PreparedBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"from_config/3","deprecated":false,"title":"from_config(user, opts, skip_acls_extra \\\\ false)","anchor":"from_config/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Verbs","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Verbs","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Verbs","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(verb \\\\ %Verb{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(attrs)","anchor":"create/1"},{"id":"get/2","deprecated":false,"title":"get(slug, all_verbs \\\\ verbs())","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(id_or_name, all_verbs \\\\ verbs())","anchor":"get!/2"},{"id":"get_id/2","deprecated":false,"title":"get_id(slug, all_verbs \\\\ verbs())","anchor":"get_id/2"},{"id":"get_id!/2","deprecated":false,"title":"get_id!(slug, all_verbs \\\\ verbs())","anchor":"get_id!/2"},{"id":"get_slug/2","deprecated":false,"title":"get_slug(id_or_name, all_verbs \\\\ verbs())","anchor":"get_slug/2"},{"id":"get_tuple/2","deprecated":false,"title":"get_tuple(id_or_name, all_verbs \\\\ verbs())","anchor":"get_tuple/2"},{"id":"ids/2","deprecated":false,"title":"ids(verbs, all_verbs \\\\ verbs())","anchor":"ids/2"},{"id":"list/2","deprecated":false,"title":"list(from \\\\ :db, key \\\\ :verb)","anchor":"list/2"},{"id":"list_verbs_debug/0","deprecated":false,"title":"list_verbs_debug()","anchor":"list_verbs_debug/0"},{"id":"slugs/0","deprecated":false,"title":"slugs()","anchor":"slugs/0"},{"id":"verbs/0","deprecated":false,"title":"verbs()","anchor":"verbs/0"},{"id":"verbs_count/0","deprecated":false,"title":"verbs_count()","anchor":"verbs_count/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Web.ExcludeBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Web.ExcludeBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Web.ExcludeBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, params, socket)","anchor":"handle_event/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Web.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Common","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Common","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_fallback/2","deprecated":false,"title":"maybe_fallback(val, fun)","anchor":"maybe_fallback/2"}],"key":"functions"}]},{"id":"Bonfire.Common.AntiSpam","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam","nodeGroups":[{"name":"Functions","nodes":[{"id":"service/0","deprecated":false,"title":"service()","anchor":"service/0"}],"key":"functions"}]},{"id":"Bonfire.Common.AntiSpam.Akismet","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Akismet","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Akismet"},{"id":"Bonfire.Common.AntiSpam.Mock","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Mock","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Mock"},{"id":"Bonfire.Common.AntiSpam.Provider","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Provider","sections":[{"id":"Supported backends","anchor":"module-supported-backends"}],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Provider","nodeGroups":[{"name":"Types","nodes":[{"id":"result/0","deprecated":false,"title":"result()","anchor":"t:result/0"},{"id":"spam_result/0","deprecated":false,"title":"spam_result()","anchor":"t:spam_result/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"check_comment/3","deprecated":false,"title":"check_comment(comment_body, is_reply?, context)","anchor":"c:check_comment/3"},{"id":"check_current_user/1","deprecated":false,"title":"check_current_user(context)","anchor":"c:check_current_user/1"},{"id":"check_object/2","deprecated":false,"title":"check_object(body, context)","anchor":"c:check_object/2"},{"id":"check_profile/2","deprecated":false,"title":"check_profile(summary, context)","anchor":"c:check_profile/2"},{"id":"ready?/0","deprecated":false,"title":"ready?()","anchor":"c:ready?/0"},{"id":"report_ham/2","deprecated":false,"title":"report_ham(user, text)","anchor":"c:report_ham/2"},{"id":"report_spam/2","deprecated":false,"title":"report_spam(user, text)","anchor":"c:report_spam/2"}],"key":"callbacks"}]},{"id":"Bonfire.Common.Benchmark","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Benchmark","sections":[],"nested_context":"Bonfire","nested_title":".Common.Benchmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_timed/1","deprecated":false,"title":"apply_timed(function)","anchor":"apply_timed/1"},{"id":"apply_timed/2","deprecated":false,"title":"apply_timed(function, args)","anchor":"apply_timed/2"},{"id":"apply_timed/3","deprecated":false,"title":"apply_timed(module, function, args)","anchor":"apply_timed/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Cache","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Cache","sections":[],"nested_context":"Bonfire","nested_title":".Common.Cache","nodeGroups":[{"name":"Functions","nodes":[{"id":"cache/0","deprecated":false,"title":"cache()","anchor":"cache/0"},{"id":"cache_store/1","deprecated":false,"title":"cache_store(opts \\\\ [])","anchor":"cache_store/1"},{"id":"cached_preloads_for_objects/3","deprecated":false,"title":"cached_preloads_for_objects(name, objects, fun)","anchor":"cached_preloads_for_objects/3"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(key, opts \\\\ [])","anchor":"get!/2"},{"id":"maybe_apply_cached/3","deprecated":false,"title":"maybe_apply_cached(fun, args \\\\ [], opts \\\\ [])","anchor":"maybe_apply_cached/3"},{"id":"put/3","deprecated":false,"title":"put(key, value, opts \\\\ [])","anchor":"put/3"},{"id":"remove/2","deprecated":false,"title":"remove(key, opts \\\\ [])","anchor":"remove/2"},{"id":"remove_all/1","deprecated":false,"title":"remove_all(opts \\\\ [])","anchor":"remove_all/1"},{"id":"reset/3","deprecated":false,"title":"reset(fun, args, opts \\\\ [])","anchor":"reset/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Cache.DiskCache","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Cache.DiskCache","sections":[],"nested_context":"Bonfire","nested_title":".Common.Cache.DiskCache"},{"id":"Bonfire.Common.Changelog.Github.DataGrabber","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Changelog.Github.DataGrabber","sections":[],"nested_context":"Bonfire","nested_title":".Common.Changelog.Github.DataGrabber","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_issues/1","deprecated":false,"title":"fetch_issues(opts \\\\ [])","anchor":"fetch_issues/1"},{"id":"format_issue/1","deprecated":false,"title":"format_issue(issue)","anchor":"format_issue/1"},{"id":"prepare_data/2","deprecated":false,"title":"prepare_data(issues, new_version)","anchor":"prepare_data/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Config","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config","nodeGroups":[{"name":"Functions","nodes":[{"id":"compilation_error/1","deprecated":false,"title":"compilation_error(error)","anchor":"compilation_error/1"},{"id":"delete/2","deprecated":false,"title":"delete(key, otp_app \\\\ top_level_otp_app())","anchor":"delete/2"},{"id":"endpoint_module/0","deprecated":false,"title":"endpoint_module()","anchor":"endpoint_module/0"},{"id":"env/0","deprecated":false,"title":"env()","anchor":"env/0"},{"id":"get/3","deprecated":false,"title":"get(key_or_keys, default \\\\ nil, otp_app \\\\ nil)","anchor":"get/3"},{"id":"get!/2","deprecated":false,"title":"get!(key, otp_app \\\\ top_level_otp_app())","anchor":"get!/2"},{"id":"get_ext/1","deprecated":false,"title":"get_ext(module_or_otp_app)","anchor":"get_ext/1"},{"id":"get_ext/3","deprecated":false,"title":"get_ext(module_or_otp_app, key, default \\\\ nil)","anchor":"get_ext/3"},{"id":"get_ext!/1","deprecated":false,"title":"get_ext!(module_or_otp_app)","anchor":"get_ext!/1"},{"id":"get_ext!/2","deprecated":false,"title":"get_ext!(module_or_otp_app, key)","anchor":"get_ext!/2"},{"id":"keys_tree/1","deprecated":false,"title":"keys_tree(keys)","anchor":"keys_tree/1"},{"id":"module_enabled?/1","deprecated":false,"title":"module_enabled?(module)","anchor":"module_enabled?/1"},{"id":"put/1","deprecated":false,"title":"put(tree)","anchor":"put/1"},{"id":"put/3","deprecated":false,"title":"put(key, value, otp_app \\\\ nil)","anchor":"put/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"require_extension_config!/1","deprecated":false,"title":"require_extension_config!(extension)","anchor":"require_extension_config!/1"},{"id":"top_level_otp_app/0","deprecated":false,"title":"top_level_otp_app()","anchor":"top_level_otp_app/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Config.Error","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config.Error","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config.Error"},{"id":"Bonfire.Common.Config.LoadExtensionsConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config.LoadExtensionsConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config.LoadExtensionsConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"load_configs/1","deprecated":false,"title":"load_configs(extras \\\\ [])","anchor":"load_configs/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.ConfigModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ConfigModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ConfigModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"c:config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"c:config_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.ContextModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ContextModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ContextModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"apply_error/2","deprecated":false,"title":"apply_error(error, args)","anchor":"apply_error/2"},{"id":"context_function_error/2","deprecated":false,"title":"context_function_error(error, args)","anchor":"context_function_error/2"},{"id":"context_module/1","deprecated":false,"title":"context_module(query)","anchor":"context_module/1"},{"id":"context_module!/1","deprecated":false,"title":"context_module!(query)","anchor":"context_module!/1"},{"id":"context_modules/1","deprecated":false,"title":"context_modules(modules)","anchor":"context_modules/1"},{"id":"linked_query_modules/0","deprecated":false,"title":"linked_query_modules()","anchor":"linked_query_modules/0"},{"id":"linked_schema_modules/0","deprecated":false,"title":"linked_schema_modules()","anchor":"linked_schema_modules/0"},{"id":"maybe_apply/4","deprecated":false,"title":"maybe_apply(object_schema_or_context, fun, args \\\\ [], opts \\\\ [fallback_fun: &apply_error/2])","anchor":"maybe_apply/4"},{"id":"maybe_context_module/1","deprecated":false,"title":"maybe_context_module(query)","anchor":"maybe_context_module/1"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.DatesTimes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.DatesTimes","sections":[],"nested_context":"Bonfire","nested_title":".Common.DatesTimes","nodeGroups":[{"name":"Functions","nodes":[{"id":"available_format_keys/2","deprecated":false,"title":"available_format_keys(scope \\\\ DateTime, locale \\\\ Cldr.get_locale())","anchor":"available_format_keys/2"},{"id":"available_formats/2","deprecated":false,"title":"available_formats(scope \\\\ DateTime, locale \\\\ Cldr.get_locale())","anchor":"available_formats/2"},{"id":"date_from_now/2","deprecated":false,"title":"date_from_now(ulid_or_date, opts \\\\ [])","anchor":"date_from_now/2"},{"id":"date_from_pointer/1","deprecated":false,"title":"date_from_pointer(object)","anchor":"date_from_pointer/1"},{"id":"format/2","deprecated":false,"title":"format(date, opts \\\\ [])","anchor":"format/2"},{"id":"format_date/2","deprecated":false,"title":"format_date(date, opts \\\\ [])","anchor":"format_date/2"},{"id":"future?/1","deprecated":false,"title":"future?(dt)","anchor":"future?/1"},{"id":"maybe_generate_ulid/1","deprecated":false,"title":"maybe_generate_ulid(date_time_or_string)","anchor":"maybe_generate_ulid/1"},{"id":"now/0","deprecated":false,"title":"now()","anchor":"now/0"},{"id":"past/2","deprecated":false,"title":"past(amount_to_remove, unit \\\\ :second)","anchor":"past/2"},{"id":"past?/1","deprecated":false,"title":"past?(dt)","anchor":"past?/1"},{"id":"relative_date/2","deprecated":false,"title":"relative_date(date_time, opts \\\\ [])","anchor":"relative_date/2"},{"id":"remove/3","deprecated":false,"title":"remove(dt, amount_to_remove, unit \\\\ :second)","anchor":"remove/3"},{"id":"to_date/1","deprecated":false,"title":"to_date(date)","anchor":"to_date/1"},{"id":"to_date_time/1","deprecated":false,"title":"to_date_time(date_time)","anchor":"to_date_time/1"}],"key":"functions"}]},{"id":"Bonfire.Common.E","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.E","sections":[],"nested_context":"Bonfire","nested_title":".Common.E","nodeGroups":[{"name":"Functions","nodes":[{"id":"e/2","deprecated":false,"title":"e(val, fallback \\\\ nil)","anchor":"e/2"},{"id":"e/3","deprecated":false,"title":"e(object, key1, fallback)","anchor":"e/3"},{"id":"e/4","deprecated":false,"title":"e(object, key1, key2, fallback)","anchor":"e/4"},{"id":"e/5","deprecated":false,"title":"e(object, key1, key2, key3, fallback)","anchor":"e/5"},{"id":"e/6","deprecated":false,"title":"e(object, key1, key2, key3, key4, fallback)","anchor":"e/6"},{"id":"e/7","deprecated":false,"title":"e(object, key1, key2, key3, key4, key5, fallback)","anchor":"e/7"},{"id":"e/8","deprecated":false,"title":"e(object, key1, key2, key3, key4, key5, key6, fallback)","anchor":"e/8"},{"id":"ed/2","deprecated":false,"title":"ed(val, fallback \\\\ nil)","anchor":"ed/2"},{"id":"ed/3","deprecated":false,"title":"ed(map, key, fallback)","anchor":"ed/3"},{"id":"ed/4","deprecated":false,"title":"ed(object, key1, key2, fallback)","anchor":"ed/4"},{"id":"ed/5","deprecated":false,"title":"ed(object, key1, key2, key3, fallback)","anchor":"ed/5"},{"id":"ed/6","deprecated":false,"title":"ed(object, key1, key2, key3, key4, fallback)","anchor":"ed/6"},{"id":"ed/7","deprecated":false,"title":"ed(object, key1, key2, key3, key4, key5, fallback)","anchor":"ed/7"},{"id":"ed/8","deprecated":false,"title":"ed(object, key1, key2, key3, key4, key5, key6, fallback)","anchor":"ed/8"}],"key":"functions"}]},{"id":"Bonfire.Common.Enums","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Enums","sections":[],"nested_context":"Bonfire","nested_title":".Common.Enums","nodeGroups":[{"name":"Functions","nodes":[{"id":"access_keys/2","deprecated":false,"title":"access_keys(keys, last_fallback \\\\ nil)","anchor":"access_keys/2"},{"id":"all_ok?/1","deprecated":false,"title":"all_ok?(enum)","anchor":"all_ok?/1"},{"id":"all_oks_or_error/1","deprecated":false,"title":"all_oks_or_error(enum)","anchor":"all_oks_or_error/1"},{"id":"attr_get_id/2","deprecated":false,"title":"attr_get_id(attrs, field_name)","anchor":"attr_get_id/2"},{"id":"count_where/2","deprecated":false,"title":"count_where(collection, function \\\\ &is_nil/1)","anchor":"count_where/2"},{"id":"deep_merge/3","deprecated":false,"title":"deep_merge(left, right, opts \\\\ [])","anchor":"deep_merge/3"},{"id":"deep_merge_reduce/2","deprecated":false,"title":"deep_merge_reduce(list_or_map, opts \\\\ [])","anchor":"deep_merge_reduce/2"},{"id":"enum_get/3","deprecated":false,"title":"enum_get(map, key, fallback \\\\ nil)","anchor":"enum_get/3"},{"id":"filter_empty/2","deprecated":false,"title":"filter_empty(val, fallback)","anchor":"filter_empty/2"},{"id":"filter_empty/3","deprecated":false,"title":"filter_empty(enum, fallback, key)","anchor":"filter_empty/3"},{"id":"first!/1","deprecated":false,"title":"first!(list)","anchor":"first!/1"},{"id":"flatter/1","deprecated":false,"title":"flatter(list)","anchor":"flatter/1"},{"id":"fun/3","deprecated":false,"title":"fun(map, fun, args \\\\ [])","anchor":"fun/3"},{"id":"get_in_access_keys/3","deprecated":false,"title":"get_in_access_keys(map, keys, last_fallback)","anchor":"get_in_access_keys/3"},{"id":"get_in_access_keys!/3","deprecated":false,"title":"get_in_access_keys!(map, keys, last_fallback)","anchor":"get_in_access_keys!/3"},{"id":"group/2","deprecated":false,"title":"group(list, fun)","anchor":"group/2"},{"id":"group_map/2","deprecated":false,"title":"group_map(list, fun)","anchor":"group_map/2"},{"id":"has_duplicates?/2","deprecated":false,"title":"has_duplicates?(list, fun \\\\ nil)","anchor":"has_duplicates?/2"},{"id":"has_error?/1","deprecated":false,"title":"has_error?(enum)","anchor":"has_error?/1"},{"id":"has_ok?/1","deprecated":false,"title":"has_ok?(enum)","anchor":"has_ok?/1"},{"id":"has_tuple_key?/2","deprecated":false,"title":"has_tuple_key?(enum, key)","anchor":"has_tuple_key?/2"},{"id":"id/1","deprecated":false,"title":"id(id)","anchor":"id/1"},{"id":"ids/1","deprecated":false,"title":"ids(objects)","anchor":"ids/1"},{"id":"input_to_atoms/2","deprecated":false,"title":"input_to_atoms(data, opts \\\\ [])","anchor":"input_to_atoms/2"},{"id":"input_to_value/7","deprecated":false,"title":"input_to_value(v, _, including_values, _, force, arg6, values_to_integers)","anchor":"input_to_value/7"},{"id":"map_filter_empty/1","deprecated":false,"title":"map_filter_empty(data)","anchor":"map_filter_empty/1"},{"id":"map_key_replace/4","deprecated":false,"title":"map_key_replace(map, key, new_key, new_value \\\\ nil)","anchor":"map_key_replace/4"},{"id":"map_key_replace_existing/4","deprecated":false,"title":"map_key_replace_existing(map, key, new_key, new_value \\\\ nil)","anchor":"map_key_replace_existing/4"},{"id":"map_new/2","deprecated":false,"title":"map_new(data, fallback_key \\\\ :data)","anchor":"map_new/2"},{"id":"map_put_default/3","deprecated":false,"title":"map_put_default(map, key, default)","anchor":"map_put_default/3"},{"id":"map_put_in/3","deprecated":false,"title":"map_put_in(root \\\\ %{}, keys, value)","anchor":"map_put_in/3"},{"id":"maybe_append/2","deprecated":false,"title":"maybe_append(list, value)","anchor":"maybe_append/2"},{"id":"maybe_elem/3","deprecated":false,"title":"maybe_elem(tuple, index, fallback \\\\ nil)","anchor":"maybe_elem/3"},{"id":"maybe_flatten/1","deprecated":false,"title":"maybe_flatten(list)","anchor":"maybe_flatten/1"},{"id":"maybe_get/3","deprecated":false,"title":"maybe_get(map, key, fallback \\\\ nil)","anchor":"maybe_get/3"},{"id":"maybe_list/2","deprecated":false,"title":"maybe_list(val, change_fn)","anchor":"maybe_list/2"},{"id":"maybe_merge_to_struct/2","deprecated":false,"title":"maybe_merge_to_struct(first, precedence)","anchor":"maybe_merge_to_struct/2"},{"id":"maybe_put/3","deprecated":false,"title":"maybe_put(map, key, value)","anchor":"maybe_put/3"},{"id":"maybe_to_keyword_list/3","deprecated":false,"title":"maybe_to_keyword_list(obj, recursive \\\\ false, force_top_level \\\\ true)","anchor":"maybe_to_keyword_list/3"},{"id":"maybe_to_map/2","deprecated":false,"title":"maybe_to_map(obj, recursive \\\\ false)","anchor":"maybe_to_map/2"},{"id":"maybe_to_struct/2","deprecated":false,"title":"maybe_to_struct(obj, type \\\\ nil)","anchor":"maybe_to_struct/2"},{"id":"maybe_to_structs/2","deprecated":false,"title":"maybe_to_structs(v, opts \\\\ [])","anchor":"maybe_to_structs/2"},{"id":"merge_as_map/3","deprecated":false,"title":"merge_as_map(left, right, opts \\\\ [])","anchor":"merge_as_map/3"},{"id":"merge_changesets/2","deprecated":false,"title":"merge_changesets(cs1, cs2)","anchor":"merge_changesets/2"},{"id":"merge_keeping_only_first_keys/2","deprecated":false,"title":"merge_keeping_only_first_keys(map_1, map_2)","anchor":"merge_keeping_only_first_keys/2"},{"id":"merge_structs_as_map/2","deprecated":false,"title":"merge_structs_as_map(target, merge)","anchor":"merge_structs_as_map/2"},{"id":"merge_uniq/2","deprecated":false,"title":"merge_uniq(left, right)","anchor":"merge_uniq/2"},{"id":"naughty_to_atoms!/2","deprecated":false,"title":"naughty_to_atoms!(data, opts \\\\ [])","anchor":"naughty_to_atoms!/2"},{"id":"nested_structs_to_maps/1","deprecated":false,"title":"nested_structs_to_maps(struct)","anchor":"nested_structs_to_maps/1"},{"id":"put_new_in/3","deprecated":false,"title":"put_new_in(map, list, val)","anchor":"put_new_in/3"},{"id":"stringify_keys/2","deprecated":false,"title":"stringify_keys(map, recursive \\\\ false)","anchor":"stringify_keys/2"},{"id":"struct_from_map/2","deprecated":false,"title":"struct_from_map(a_map, list)","anchor":"struct_from_map/2"},{"id":"struct_to_map/2","deprecated":false,"title":"struct_to_map(other, recursive \\\\ false)","anchor":"struct_to_map/2"},{"id":"uniq_by_id/1","deprecated":false,"title":"uniq_by_id(list)","anchor":"uniq_by_id/1"},{"id":"unwrap_tuples/2","deprecated":false,"title":"unwrap_tuples(enum, key)","anchor":"unwrap_tuples/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Errors","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Errors","sections":[],"nested_context":"Bonfire","nested_title":".Common.Errors","nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_banner_with_trace/4","deprecated":false,"title":"debug_banner_with_trace(kind, exception, stacktrace, opts \\\\ [])","anchor":"debug_banner_with_trace/4"},{"id":"debug_exception/5","deprecated":false,"title":"debug_exception(msg, exception \\\\ nil, stacktrace \\\\ nil, kind \\\\ :error, opts \\\\ [])","anchor":"debug_exception/5"},{"id":"debug_log/5","deprecated":false,"title":"debug_log(msg, exception \\\\ nil, stacktrace \\\\ nil, kind \\\\ :error, msg_text \\\\ nil)","anchor":"debug_log/5"},{"id":"error_msg/1","deprecated":false,"title":"error_msg(errors)","anchor":"error_msg/1"},{"id":"format_banner/4","deprecated":false,"title":"format_banner(kind, exception, stacktrace \\\\ [], opts \\\\ [])","anchor":"format_banner/4"},{"id":"format_location/1","deprecated":false,"title":"format_location(opts)","anchor":"format_location/1"},{"id":"format_mfa/3","deprecated":false,"title":"format_mfa(module, fun, arity)","anchor":"format_mfa/3"},{"id":"format_stacktrace/2","deprecated":false,"title":"format_stacktrace(trace \\\\ nil, opts)","anchor":"format_stacktrace/2"},{"id":"format_stacktrace_entry/2","deprecated":false,"title":"format_stacktrace_entry(entry, opts \\\\ [])","anchor":"format_stacktrace_entry/2"},{"id":"format_stacktrace_entry_sliced/2","deprecated":false,"title":"format_stacktrace_entry_sliced(entry, opts)","anchor":"format_stacktrace_entry_sliced/2"},{"id":"last_stacktrace/0","deprecated":false,"title":"last_stacktrace()","anchor":"last_stacktrace/0"},{"id":"map_error/2","deprecated":false,"title":"map_error(other, fun)","anchor":"map_error/2"},{"id":"maybe_ok_error/2","deprecated":false,"title":"maybe_ok_error(other, change_fn)","anchor":"maybe_ok_error/2"},{"id":"mf_maybe_link_to_code/4","deprecated":false,"title":"mf_maybe_link_to_code(text \\\\ nil, mod, fun, opts)","anchor":"mf_maybe_link_to_code/4"},{"id":"module_maybe_link_to_code/3","deprecated":false,"title":"module_maybe_link_to_code(text \\\\ nil, mod, opts)","anchor":"module_maybe_link_to_code/3"},{"id":"replace_error/2","deprecated":false,"title":"replace_error(other, value)","anchor":"replace_error/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Extend","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extend","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extend","nodeGroups":[{"name":"Functions","nodes":[{"id":"application_for_module/1","deprecated":false,"title":"application_for_module(module)","anchor":"application_for_module/1"},{"id":"beam_file_from_object_code/1","deprecated":false,"title":"beam_file_from_object_code(module)","anchor":"beam_file_from_object_code/1"},{"id":"disabled_value?/1","deprecated":false,"title":"disabled_value?(value)","anchor":"disabled_value?/1"},{"id":"extend_module/1","deprecated":false,"title":"extend_module(module)","anchor":"extend_module/1"},{"id":"extension_enabled?/2","deprecated":false,"title":"extension_enabled?(module_or_otp_app, opts \\\\ [])","anchor":"extension_enabled?/2"},{"id":"extension_loaded?/1","deprecated":false,"title":"extension_loaded?(module_or_otp_app)","anchor":"extension_loaded?/1"},{"id":"fetch_docs_as_markdown/1","deprecated":false,"title":"fetch_docs_as_markdown(module)","anchor":"fetch_docs_as_markdown/1"},{"id":"fetch_docs_as_markdown/2","deprecated":false,"title":"fetch_docs_as_markdown(module, function)","anchor":"fetch_docs_as_markdown/2"},{"id":"file_code/1","deprecated":false,"title":"file_code(code_file)","anchor":"file_code/1"},{"id":"function_ast/3","deprecated":false,"title":"function_ast(module, fun, opts \\\\ [])","anchor":"function_ast/3"},{"id":"function_code/3","deprecated":false,"title":"function_code(module, fun, opts \\\\ [])","anchor":"function_code/3"},{"id":"function_line_number/3","deprecated":false,"title":"function_line_number(module, fun, opts \\\\ [])","anchor":"function_line_number/3"},{"id":"function_line_numbers/3","deprecated":false,"title":"function_line_numbers(module, fun, opts \\\\ [])","anchor":"function_line_numbers/3"},{"id":"generate_reverse_router!/0","deprecated":false,"title":"generate_reverse_router!()","anchor":"generate_reverse_router!/0"},{"id":"has_extension_config?/1","deprecated":false,"title":"has_extension_config?(module_or_otp_app)","anchor":"has_extension_config?/1"},{"id":"import_if_enabled/2","deprecated":false,"title":"import_if_enabled(module, fallback_module \\\\ nil)","anchor":"import_if_enabled/2"},{"id":"inject_function/3","deprecated":false,"title":"inject_function(module, fun, target_module \\\\ nil)","anchor":"inject_function/3"},{"id":"loaded_applications_map/1","deprecated":false,"title":"loaded_applications_map(opts \\\\ [cache: false])","anchor":"loaded_applications_map/1"},{"id":"loaded_applications_names/1","deprecated":false,"title":"loaded_applications_names(opts \\\\ [cache: false])","anchor":"loaded_applications_names/1"},{"id":"macro_inspect/1","deprecated":false,"title":"macro_inspect(fun)","anchor":"macro_inspect/1"},{"id":"maybe_extension_loaded/1","deprecated":false,"title":"maybe_extension_loaded(module_or_otp_app)","anchor":"maybe_extension_loaded/1"},{"id":"maybe_extension_loaded!/1","deprecated":false,"title":"maybe_extension_loaded!(module_or_otp_app)","anchor":"maybe_extension_loaded!/1"},{"id":"maybe_module/2","deprecated":false,"title":"maybe_module(module, opts \\\\ [])","anchor":"maybe_module/2"},{"id":"maybe_module!/2","deprecated":false,"title":"maybe_module!(module, opts \\\\ [])","anchor":"maybe_module!/2"},{"id":"maybe_module_loaded/1","deprecated":false,"title":"maybe_module_loaded(module)","anchor":"maybe_module_loaded/1"},{"id":"maybe_schema_or_pointer/1","deprecated":false,"title":"maybe_schema_or_pointer(schema_module)","anchor":"maybe_schema_or_pointer/1"},{"id":"module_ast_normalize/3","deprecated":false,"title":"module_ast_normalize(module, ast, target \\\\ :ast)","anchor":"module_ast_normalize/3"},{"id":"module_beam_code/2","deprecated":false,"title":"module_beam_code(module, opts \\\\ [])","anchor":"module_beam_code/2"},{"id":"module_behaviour?/2","deprecated":false,"title":"module_behaviour?(module, behaviour)","anchor":"module_behaviour?/2"},{"id":"module_behaviours/1","deprecated":false,"title":"module_behaviours(module)","anchor":"module_behaviours/1"},{"id":"module_code/2","deprecated":false,"title":"module_code(module, opts \\\\ [])","anchor":"module_code/2"},{"id":"module_code_from_ast/3","deprecated":false,"title":"module_code_from_ast(module, ast, target \\\\ :ast)","anchor":"module_code_from_ast/3"},{"id":"module_code_from_object_code/1","deprecated":false,"title":"module_code_from_object_code(module)","anchor":"module_code_from_object_code/1"},{"id":"module_enabled?/2","deprecated":false,"title":"module_enabled?(module, opts \\\\ [])","anchor":"module_enabled?/2"},{"id":"module_exists?/1","deprecated":false,"title":"module_exists?(module)","anchor":"module_exists?/1"},{"id":"module_file/1","deprecated":false,"title":"module_file(module)","anchor":"module_file/1"},{"id":"module_file_code/2","deprecated":false,"title":"module_file_code(module, opts \\\\ [])","anchor":"module_file_code/2"},{"id":"module_file_from_object_code/1","deprecated":false,"title":"module_file_from_object_code(module)","anchor":"module_file_from_object_code/1"},{"id":"module_object_byte_code/1","deprecated":false,"title":"module_object_byte_code(module)","anchor":"module_object_byte_code/1"},{"id":"module_object_code_tuple/1","deprecated":false,"title":"module_object_code_tuple(module)","anchor":"module_object_code_tuple/1"},{"id":"quoted_import_if_enabled/3","deprecated":false,"title":"quoted_import_if_enabled(module, fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_import_if_enabled/3"},{"id":"quoted_require_if_enabled/3","deprecated":false,"title":"quoted_require_if_enabled(module, fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_require_if_enabled/3"},{"id":"quoted_use_if_enabled/3","deprecated":false,"title":"quoted_use_if_enabled(module, fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_use_if_enabled/3"},{"id":"require_if_enabled/2","deprecated":false,"title":"require_if_enabled(module, fallback_module \\\\ nil)","anchor":"require_if_enabled/2"},{"id":"return_file/1","deprecated":false,"title":"return_file(raw)","anchor":"return_file/1"},{"id":"tar_file_code/1","deprecated":false,"title":"tar_file_code(code_file)","anchor":"tar_file_code/1"},{"id":"use_if_enabled/2","deprecated":false,"title":"use_if_enabled(module, fallback_module \\\\ nil)","anchor":"use_if_enabled/2"}],"key":"functions"}]},{"id":"Bonfire.Common.ExtensionBehaviour","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ExtensionBehaviour","sections":[],"nested_context":"Bonfire","nested_title":".Common.ExtensionBehaviour","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"c:modules/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"adopters_of_behaviour/2","deprecated":false,"title":"adopters_of_behaviour(behaviour \\\\ __MODULE__, app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"adopters_of_behaviour/2"},{"id":"app_modules_to_scan/1","deprecated":false,"title":"app_modules_to_scan(opts \\\\ [])","anchor":"app_modules_to_scan/1"},{"id":"apply_modules/2","deprecated":false,"title":"apply_modules(modules, fun)","anchor":"apply_modules/2"},{"id":"apply_modules_cached/2","deprecated":false,"title":"apply_modules_cached(modules, fun)","anchor":"apply_modules_cached/2"},{"id":"apps_to_scan/1","deprecated":false,"title":"apps_to_scan(opts \\\\ [])","anchor":"apps_to_scan/1"},{"id":"behaviour_app_modules/2","deprecated":false,"title":"behaviour_app_modules(behaviour, behaviours \\\\ nil)","anchor":"behaviour_app_modules/2"},{"id":"behaviour_modules/2","deprecated":false,"title":"behaviour_modules(behaviour, behaviours \\\\ nil)","anchor":"behaviour_modules/2"},{"id":"behaviours/0","deprecated":false,"title":"behaviours()","anchor":"behaviours/0"},{"id":"cached_behaviours/0","deprecated":false,"title":"cached_behaviours()","anchor":"cached_behaviours/0"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"find_adopters_of_behaviours/2","deprecated":false,"title":"find_adopters_of_behaviours(behaviours \\\\ find_extension_behaviours(), app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"find_adopters_of_behaviours/2"},{"id":"find_extension_behaviours/1","deprecated":false,"title":"find_extension_behaviours(app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"find_extension_behaviours/1"},{"id":"populate/0","deprecated":false,"title":"populate()","anchor":"populate/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.ExtensionModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ExtensionModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ExtensionModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"c:declared_extension/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"declared_extension/1","deprecated":false,"title":"declared_extension(module)","anchor":"declared_extension/1"},{"id":"declared_extensions/1","deprecated":false,"title":"declared_extensions(modules \\\\ app_modules())","anchor":"declared_extensions/1"},{"id":"default_nav/0","deprecated":false,"title":"default_nav()","anchor":"default_nav/0"},{"id":"default_nav/1","deprecated":false,"title":"default_nav(app)","anchor":"default_nav/1"},{"id":"default_nav_apps/0","deprecated":false,"title":"default_nav_apps()","anchor":"default_nav_apps/0"},{"id":"extension/1","deprecated":false,"title":"extension(app)","anchor":"extension/1"},{"id":"extension_function_error/2","deprecated":false,"title":"extension_function_error(error, args)","anchor":"extension_function_error/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Extensions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extensions","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extensions","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_deps/0","deprecated":false,"title":"all_deps()","anchor":"all_deps/0"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"data/0"},{"id":"dep_name/1","deprecated":false,"title":"dep_name(dep)","anchor":"dep_name/1"},{"id":"get_branch/1","deprecated":false,"title":"get_branch(arg1)","anchor":"get_branch/1"},{"id":"get_code_link/1","deprecated":false,"title":"get_code_link(dep)","anchor":"get_code_link/1"},{"id":"get_link/1","deprecated":false,"title":"get_link(dep)","anchor":"get_link/1"},{"id":"get_version/1","deprecated":false,"title":"get_version(dep)","anchor":"get_version/1"},{"id":"get_version_link/1","deprecated":false,"title":"get_version_link(dep)","anchor":"get_version_link/1"},{"id":"global_disable/1","deprecated":false,"title":"global_disable(extension)","anchor":"global_disable/1"},{"id":"global_enable/1","deprecated":false,"title":"global_enable(extension)","anchor":"global_enable/1"},{"id":"loaded_deps/1","deprecated":false,"title":"loaded_deps(opts \\\\ [])","anchor":"loaded_deps/1"},{"id":"loaded_deps_names/1","deprecated":false,"title":"loaded_deps_names(opts \\\\ [])","anchor":"loaded_deps_names/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Extensions.Diff","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extensions.Diff","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extensions.Diff","nodeGroups":[{"name":"Functions","nodes":[{"id":"analyse_repo_latest_diff_stream/1","deprecated":false,"title":"analyse_repo_latest_diff_stream(path_diff)","anchor":"analyse_repo_latest_diff_stream/1"},{"id":"generate_diff/2","deprecated":false,"title":"generate_diff(ref_or_branch, repo_path)","anchor":"generate_diff/2"},{"id":"git!/4","deprecated":false,"title":"git!(args, repo_path \\\\ \".\", into \\\\ default_into(), original_cwd \\\\ root())","anchor":"git!/4"},{"id":"git_add_all/1","deprecated":false,"title":"git_add_all(repo_path)","anchor":"git_add_all/1"},{"id":"git_fetch/1","deprecated":false,"title":"git_fetch(repo_path)","anchor":"git_fetch/1"},{"id":"git_generate_diff/4","deprecated":false,"title":"git_generate_diff(ref_or_branch, repo_path, path_output, extra_opt \\\\ \"--cached\")","anchor":"git_generate_diff/4"},{"id":"git_pre_configure/1","deprecated":false,"title":"git_pre_configure(repo_path)","anchor":"git_pre_configure/1"},{"id":"parse_repo_latest_diff/1","deprecated":false,"title":"parse_repo_latest_diff(path_diff)","anchor":"parse_repo_latest_diff/1"},{"id":"repo_latest_diff/3","deprecated":false,"title":"repo_latest_diff(ref_or_branch, repo_path, msg \\\\ nil)","anchor":"repo_latest_diff/3"},{"id":"root/0","deprecated":false,"title":"root()","anchor":"root/0"},{"id":"tmp_path/1","deprecated":false,"title":"tmp_path(prefix)","anchor":"tmp_path/1"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/4","deprecated":false,"title":"delete(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"delete/4"},{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(url)","anchor":"get_cached/1"},{"id":"patch/4","deprecated":false,"title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"post/4","deprecated":false,"title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"put/4","deprecated":false,"title":"put(url, body, headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"request/5","deprecated":false,"title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP.Connection","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP.Connection","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP.Connection","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter_options/2","deprecated":false,"title":"adapter_options(adapter \\\\ Tesla.Adapter.Hackney, opts)","anchor":"adapter_options/2"},{"id":"new/1","deprecated":false,"title":"new(opts \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP.RequestBuilder","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP.RequestBuilder","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP.RequestBuilder","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_param/4","deprecated":false,"title":"add_param(request, atom1, atom2, values)","anchor":"add_param/4"},{"id":"headers/2","deprecated":false,"title":"headers(request, header_list)","anchor":"headers/2"},{"id":"method/2","deprecated":false,"title":"method(request, m)","anchor":"method/2"},{"id":"opts/2","deprecated":false,"title":"opts(request, options)","anchor":"opts/2"},{"id":"url/2","deprecated":false,"title":"url(request, u)","anchor":"url/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_locale/0","deprecated":false,"title":"default_locale()","anchor":"default_locale/0"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_locale_id/0","deprecated":false,"title":"get_locale_id()","anchor":"get_locale_id/0"},{"id":"known_locales/0","deprecated":false,"title":"known_locales()","anchor":"known_locales/0"},{"id":"locale_name/1","deprecated":false,"title":"locale_name(locale)","anchor":"locale_name/1"},{"id":"put_locale/1","deprecated":false,"title":"put_locale(locale)","anchor":"put_locale/1"},{"id":"set_locale_config/0","deprecated":false,"title":"set_locale_config()","anchor":"set_locale_config/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr","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":"Bonfire.Common.Localise.Cldr.AcceptLanguage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.AcceptLanguage","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.AcceptLanguage","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":"Bonfire.Common.Localise.Cldr.Calendar","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Calendar","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Calendar","nodeGroups":[{"name":"Functions","nodes":[{"id":"calendar_from_locale/1","deprecated":false,"title":"calendar_from_locale(locale)","anchor":"calendar_from_locale/1"},{"id":"calendar_from_territory/1","deprecated":false,"title":"calendar_from_territory(territory)","anchor":"calendar_from_territory/1"},{"id":"cyclic_years/2","deprecated":false,"title":"cyclic_years(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"cyclic_years/2"},{"id":"day_periods/2","deprecated":false,"title":"day_periods(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"day_periods/2"},{"id":"days/2","deprecated":false,"title":"days(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"days/2"},{"id":"eras/2","deprecated":false,"title":"eras(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"eras/2"},{"id":"localize/1","deprecated":false,"title":"localize(date)","anchor":"localize/1"},{"id":"localize/2","deprecated":false,"title":"localize(datetime, options)","anchor":"localize/2"},{"id":"localize/3","deprecated":false,"title":"localize(datetime, part, options \\\\ [])","anchor":"localize/3"},{"id":"month_patterns/2","deprecated":false,"title":"month_patterns(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"month_patterns/2"},{"id":"months/2","deprecated":false,"title":"months(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"months/2"},{"id":"quarters/2","deprecated":false,"title":"quarters(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"quarters/2"},{"id":"strftime_options!/2","deprecated":false,"title":"strftime_options!(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), options \\\\ [])","anchor":"strftime_options!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Currency","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Currency","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Currency","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: Bonfire.Common.Localise.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: Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Date","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Date","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Date","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(date, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(date, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Date.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Date.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Date.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options)","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options)","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(date_time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(date_time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Format","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Format","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Format","nodeGroups":[{"name":"Types","nodes":[{"id":"calendar/0","deprecated":false,"title":"calendar()","anchor":"t:calendar/0"},{"id":"formats/0","deprecated":false,"title":"formats()","anchor":"t:formats/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"calendars_for/1","deprecated":false,"title":"calendars_for(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"calendars_for/1"},{"id":"common_date_time_format_names/0","deprecated":false,"title":"common_date_time_format_names()","anchor":"common_date_time_format_names/0"},{"id":"date_available_formats/2","deprecated":false,"title":"date_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_available_formats/2"},{"id":"date_formats/2","deprecated":false,"title":"date_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_formats/2"},{"id":"date_time_at_formats/2","deprecated":false,"title":"date_time_at_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_at_formats/2"},{"id":"date_time_available_formats/2","deprecated":false,"title":"date_time_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_available_formats/2"},{"id":"date_time_formats/2","deprecated":false,"title":"date_time_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_formats/2"},{"id":"date_time_interval_fallback/2","deprecated":false,"title":"date_time_interval_fallback(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_interval_fallback/2"},{"id":"date_time_interval_formats/2","deprecated":false,"title":"date_time_interval_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_interval_formats/2"},{"id":"day_period_for/2","deprecated":false,"title":"day_period_for(time, language)","anchor":"day_period_for/2"},{"id":"gmt_format/1","deprecated":false,"title":"gmt_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"gmt_format/1"},{"id":"gmt_zero_format/1","deprecated":false,"title":"gmt_zero_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"gmt_zero_format/1"},{"id":"hour_format/1","deprecated":false,"title":"hour_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"hour_format/1"},{"id":"language_has_noon_and_midnight?/1","deprecated":false,"title":"language_has_noon_and_midnight?(locale)","anchor":"language_has_noon_and_midnight?/1"},{"id":"time_available_formats/2","deprecated":false,"title":"time_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"time_available_formats/2"},{"id":"time_formats/2","deprecated":false,"title":"time_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"time_formats/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Formatter","nodeGroups":[{"name":"Functions","nodes":[{"id":"format/4","deprecated":false,"title":"format(date, format, locale \\\\ Cldr.get_locale(), options \\\\ [])","anchor":"format/4"},{"id":"gmt_tz_format/3","deprecated":false,"title":"gmt_tz_format(locale, offset, options \\\\ [])","anchor":"gmt_tz_format/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string/3","deprecated":false,"title":"do_to_string(from, to, options)","anchor":"do_to_string/3"},{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Relative","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Relative","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(interval, options)","anchor":"to_string/2"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(interval, options)","anchor":"to_string!/2"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Language","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Language","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Language","nodeGroups":[{"name":"Types","nodes":[{"id":"styles/0","deprecated":false,"title":"styles()","anchor":"t:styles/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"available_languages/1","deprecated":false,"title":"available_languages(locale \\\\ get_locale())","anchor":"available_languages/1"},{"id":"known_languages/1","deprecated":false,"title":"known_languages(locale \\\\ get_locale())","anchor":"known_languages/1"},{"id":"to_string/2","deprecated":false,"title":"to_string(key, options \\\\ [])","anchor":"to_string/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.List","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.List","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.List","nodeGroups":[{"name":"Functions","nodes":[{"id":"intersperse/2","deprecated":false,"title":"intersperse(list, options \\\\ [])","anchor":"intersperse/2"},{"id":"intersperse/3","deprecated":false,"title":"intersperse(list, locale, pattern)","anchor":"intersperse/3"},{"id":"intersperse!/2","deprecated":false,"title":"intersperse!(list, options \\\\ [])","anchor":"intersperse!/2"},{"id":"list_formats_for/1","deprecated":false,"title":"list_formats_for(locale_name)","anchor":"list_formats_for/1"},{"id":"list_patterns_for/1","deprecated":false,"title":"list_patterns_for(locale_name)","anchor":"list_patterns_for/1"},{"id":"to_string/2","deprecated":false,"title":"to_string(list, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(list, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Locale","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Locale","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Locale","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":"Bonfire.Common.Localise.Cldr.LocaleDisplay","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.LocaleDisplay","nodeGroups":[{"name":"Functions","nodes":[{"id":"display_name/2","deprecated":false,"title":"display_name(language_tag, options \\\\ [])","anchor":"display_name/2"},{"id":"display_name!/2","deprecated":false,"title":"display_name!(language_tag, options \\\\ [])","anchor":"display_name!/2"},{"id":"display_names/1","deprecated":false,"title":"display_names(locale)","anchor":"display_names/1"},{"id":"time_zone_names/1","deprecated":false,"title":"time_zone_names(locale)","anchor":"time_zone_names/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Number","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number","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":"Bonfire.Common.Localise.Cldr.Number.Cardinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Cardinal","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":"Bonfire.Common.Localise.Cldr.Number.Format","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Format","sections":[{"id":"Number Pattern Examples","anchor":"module-number-pattern-examples"}],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Format","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_formats_for/1","deprecated":false,"title":"all_formats_for(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"all_formats_for/1"},{"id":"all_formats_for!/1","deprecated":false,"title":"all_formats_for!(locale \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"decimal_format_list_for/1"},{"id":"default_grouping_for/1","deprecated":false,"title":"default_grouping_for(locale \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Formatter.Decimal","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":"Bonfire.Common.Localise.Cldr.Number.Ordinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Ordinal","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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.PluralRule.Range","nodeGroups":[{"name":"Functions","nodes":[{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(first, last, locale)","anchor":"plural_rule/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Number.Symbol","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Symbol","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Symbol","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 \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.System","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.System","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":"Bonfire.Common.Localise.Cldr.Number.Transliterate","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Transliterate","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Transliterate","nodeGroups":[{"name":"Functions","nodes":[{"id":"transliterate/3","deprecated":false,"title":"transliterate(sequence, locale \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.NumberSystem","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":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.Ordinal","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":"digits_ordinal_feminine/2","deprecated":false,"title":"digits_ordinal_feminine(number, locale)","anchor":"digits_ordinal_feminine/2"},{"id":"digits_ordinal_feminine_plural/2","deprecated":false,"title":"digits_ordinal_feminine_plural(number, locale)","anchor":"digits_ordinal_feminine_plural/2"},{"id":"digits_ordinal_indicator_m/2","deprecated":false,"title":"digits_ordinal_indicator_m(number, language_tag)","anchor":"digits_ordinal_indicator_m/2"},{"id":"digits_ordinal_masculine/2","deprecated":false,"title":"digits_ordinal_masculine(number, locale)","anchor":"digits_ordinal_masculine/2"},{"id":"digits_ordinal_masculine_adjective/2","deprecated":false,"title":"digits_ordinal_masculine_adjective(number, locale)","anchor":"digits_ordinal_masculine_adjective/2"},{"id":"digits_ordinal_masculine_plural/2","deprecated":false,"title":"digits_ordinal_masculine_plural(number, locale)","anchor":"digits_ordinal_masculine_plural/2"},{"id":"dord_femabbrev/2","deprecated":false,"title":"dord_femabbrev(number, language_tag)","anchor":"dord_femabbrev/2"},{"id":"dord_mascabbrev/2","deprecated":false,"title":"dord_mascabbrev(number, language_tag)","anchor":"dord_mascabbrev/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":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.Spellout","nodeGroups":[{"name":"Functions","nodes":[{"id":"after_hundred/2","deprecated":false,"title":"after_hundred(number, language_tag)","anchor":"after_hundred/2"},{"id":"after_thousand_or_more/2","deprecated":false,"title":"after_thousand_or_more(number, language_tag)","anchor":"after_thousand_or_more/2"},{"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":"cents_f/2","deprecated":false,"title":"cents_f(number, language_tag)","anchor":"cents_f/2"},{"id":"cents_m/2","deprecated":false,"title":"cents_m(number, language_tag)","anchor":"cents_m/2"},{"id":"cents_o/2","deprecated":false,"title":"cents_o(number, language_tag)","anchor":"cents_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":"et_un/2","deprecated":false,"title":"et_un(number, language_tag)","anchor":"et_un/2"},{"id":"et_une/2","deprecated":false,"title":"et_une(number, language_tag)","anchor":"et_une/2"},{"id":"et_unieme/2","deprecated":false,"title":"et_unieme(number, language_tag)","anchor":"et_unieme/2"},{"id":"fem_with_a/2","deprecated":false,"title":"fem_with_a(number, language_tag)","anchor":"fem_with_a/2"},{"id":"fem_with_i/2","deprecated":false,"title":"fem_with_i(number, language_tag)","anchor":"fem_with_i/2"},{"id":"fem_with_o/2","deprecated":false,"title":"fem_with_o(number, language_tag)","anchor":"fem_with_o/2"},{"id":"lenient_parse/2","deprecated":false,"title":"lenient_parse(number, language_tag)","anchor":"lenient_parse/2"},{"id":"mille_o/2","deprecated":false,"title":"mille_o(number, language_tag)","anchor":"mille_o/2"},{"id":"msc_no_final/2","deprecated":false,"title":"msc_no_final(number, language_tag)","anchor":"msc_no_final/2"},{"id":"msc_with_a/2","deprecated":false,"title":"msc_with_a(number, language_tag)","anchor":"msc_with_a/2"},{"id":"msc_with_a_nofinal/2","deprecated":false,"title":"msc_with_a_nofinal(number, language_tag)","anchor":"msc_with_a_nofinal/2"},{"id":"msc_with_i/2","deprecated":false,"title":"msc_with_i(number, language_tag)","anchor":"msc_with_i/2"},{"id":"msc_with_i_nofinal/2","deprecated":false,"title":"msc_with_i_nofinal(number, language_tag)","anchor":"msc_with_i_nofinal/2"},{"id":"msc_with_o/2","deprecated":false,"title":"msc_with_o(number, language_tag)","anchor":"msc_with_o/2"},{"id":"msc_with_o_nofinal/2","deprecated":false,"title":"msc_with_o_nofinal(number, language_tag)","anchor":"msc_with_o_nofinal/2"},{"id":"msco_with_a/2","deprecated":false,"title":"msco_with_a(number, language_tag)","anchor":"msco_with_a/2"},{"id":"msco_with_i/2","deprecated":false,"title":"msco_with_i(number, language_tag)","anchor":"msco_with_i/2"},{"id":"msco_with_o/2","deprecated":false,"title":"msco_with_o(number, language_tag)","anchor":"msco_with_o/2"},{"id":"ordinal_esima/2","deprecated":false,"title":"ordinal_esima(number, language_tag)","anchor":"ordinal_esima/2"},{"id":"ordinal_esima_with_a/2","deprecated":false,"title":"ordinal_esima_with_a(number, language_tag)","anchor":"ordinal_esima_with_a/2"},{"id":"ordinal_esima_with_i/2","deprecated":false,"title":"ordinal_esima_with_i(number, language_tag)","anchor":"ordinal_esima_with_i/2"},{"id":"ordinal_esima_with_o/2","deprecated":false,"title":"ordinal_esima_with_o(number, language_tag)","anchor":"ordinal_esima_with_o/2"},{"id":"ordinal_esime/2","deprecated":false,"title":"ordinal_esime(number, language_tag)","anchor":"ordinal_esime/2"},{"id":"ordinal_esime_with_a/2","deprecated":false,"title":"ordinal_esime_with_a(number, language_tag)","anchor":"ordinal_esime_with_a/2"},{"id":"ordinal_esime_with_i/2","deprecated":false,"title":"ordinal_esime_with_i(number, language_tag)","anchor":"ordinal_esime_with_i/2"},{"id":"ordinal_esime_with_o/2","deprecated":false,"title":"ordinal_esime_with_o(number, language_tag)","anchor":"ordinal_esime_with_o/2"},{"id":"ordinal_esimi/2","deprecated":false,"title":"ordinal_esimi(number, language_tag)","anchor":"ordinal_esimi/2"},{"id":"ordinal_esimi_with_a/2","deprecated":false,"title":"ordinal_esimi_with_a(number, language_tag)","anchor":"ordinal_esimi_with_a/2"},{"id":"ordinal_esimi_with_i/2","deprecated":false,"title":"ordinal_esimi_with_i(number, language_tag)","anchor":"ordinal_esimi_with_i/2"},{"id":"ordinal_esimi_with_o/2","deprecated":false,"title":"ordinal_esimi_with_o(number, language_tag)","anchor":"ordinal_esimi_with_o/2"},{"id":"ordinal_esimo/2","deprecated":false,"title":"ordinal_esimo(number, language_tag)","anchor":"ordinal_esimo/2"},{"id":"ordinal_esimo_with_a/2","deprecated":false,"title":"ordinal_esimo_with_a(number, language_tag)","anchor":"ordinal_esimo_with_a/2"},{"id":"ordinal_esimo_with_i/2","deprecated":false,"title":"ordinal_esimo_with_i(number, language_tag)","anchor":"ordinal_esimo_with_i/2"},{"id":"ordinal_esimo_with_o/2","deprecated":false,"title":"ordinal_esimo_with_o(number, language_tag)","anchor":"ordinal_esimo_with_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_feminine/2","deprecated":false,"title":"spellout_cardinal_feminine(number, locale)","anchor":"spellout_cardinal_feminine/2"},{"id":"spellout_cardinal_feminine_cents/2","deprecated":false,"title":"spellout_cardinal_feminine_cents(number, language_tag)","anchor":"spellout_cardinal_feminine_cents/2"},{"id":"spellout_cardinal_masculine/2","deprecated":false,"title":"spellout_cardinal_masculine(number, locale)","anchor":"spellout_cardinal_masculine/2"},{"id":"spellout_cardinal_masculine_cents/2","deprecated":false,"title":"spellout_cardinal_masculine_cents(number, language_tag)","anchor":"spellout_cardinal_masculine_cents/2"},{"id":"spellout_cardinal_verbose/2","deprecated":false,"title":"spellout_cardinal_verbose(number, locale)","anchor":"spellout_cardinal_verbose/2"},{"id":"spellout_leading/2","deprecated":false,"title":"spellout_leading(number, language_tag)","anchor":"spellout_leading/2"},{"id":"spellout_numbering/2","deprecated":false,"title":"spellout_numbering(number, locale)","anchor":"spellout_numbering/2"},{"id":"spellout_numbering_cents/2","deprecated":false,"title":"spellout_numbering_cents(number, language_tag)","anchor":"spellout_numbering_cents/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_feminine/2","deprecated":false,"title":"spellout_ordinal_feminine(number, locale)","anchor":"spellout_ordinal_feminine/2"},{"id":"spellout_ordinal_feminine_cont/2","deprecated":false,"title":"spellout_ordinal_feminine_cont(number, language_tag)","anchor":"spellout_ordinal_feminine_cont/2"},{"id":"spellout_ordinal_feminine_conts/2","deprecated":false,"title":"spellout_ordinal_feminine_conts(number, language_tag)","anchor":"spellout_ordinal_feminine_conts/2"},{"id":"spellout_ordinal_feminine_plural/2","deprecated":false,"title":"spellout_ordinal_feminine_plural(number, locale)","anchor":"spellout_ordinal_feminine_plural/2"},{"id":"spellout_ordinal_masculine/2","deprecated":false,"title":"spellout_ordinal_masculine(number, locale)","anchor":"spellout_ordinal_masculine/2"},{"id":"spellout_ordinal_masculine_adjective/2","deprecated":false,"title":"spellout_ordinal_masculine_adjective(number, locale)","anchor":"spellout_ordinal_masculine_adjective/2"},{"id":"spellout_ordinal_masculine_cont/2","deprecated":false,"title":"spellout_ordinal_masculine_cont(number, language_tag)","anchor":"spellout_ordinal_masculine_cont/2"},{"id":"spellout_ordinal_masculine_conts/2","deprecated":false,"title":"spellout_ordinal_masculine_conts(number, language_tag)","anchor":"spellout_ordinal_masculine_conts/2"},{"id":"spellout_ordinal_masculine_plural/2","deprecated":false,"title":"spellout_ordinal_masculine_plural(number, locale)","anchor":"spellout_ordinal_masculine_plural/2"},{"id":"spellout_ordinal_verbose/2","deprecated":false,"title":"spellout_ordinal_verbose(number, locale)","anchor":"spellout_ordinal_verbose/2"},{"id":"subcents_f/2","deprecated":false,"title":"subcents_f(number, language_tag)","anchor":"subcents_f/2"},{"id":"subcents_m/2","deprecated":false,"title":"subcents_m(number, language_tag)","anchor":"subcents_m/2"},{"id":"subcents_o/2","deprecated":false,"title":"subcents_o(number, language_tag)","anchor":"subcents_o/2"},{"id":"teen/2","deprecated":false,"title":"teen(number, language_tag)","anchor":"teen/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"},{"id":"x_ty/2","deprecated":false,"title":"x_ty(number, language_tag)","anchor":"x_ty/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Territory","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Territory","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Territory","nodeGroups":[{"name":"Functions","nodes":[{"id":"available_styles/0","deprecated":false,"title":"available_styles()","anchor":"available_styles/0"},{"id":"available_subdivisions/1","deprecated":false,"title":"available_subdivisions(locale \\\\ Cldr.get_locale())","anchor":"available_subdivisions/1"},{"id":"available_territories/1","deprecated":false,"title":"available_territories(locale \\\\ Cldr.get_locale())","anchor":"available_territories/1"},{"id":"children/2","deprecated":false,"title":"children(territory_code, options \\\\ [as: :atom])","anchor":"children/2"},{"id":"children!/2","deprecated":false,"title":"children!(territory_code, options \\\\ [as: :atom])","anchor":"children!/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(parent, child)","anchor":"contains?/2"},{"id":"country_codes/1","deprecated":false,"title":"country_codes(options \\\\ [as: :atom])","anchor":"country_codes/1"},{"id":"from_language_tag/2","deprecated":false,"title":"from_language_tag(language_tag, options \\\\ [])","anchor":"from_language_tag/2"},{"id":"from_language_tag!/2","deprecated":false,"title":"from_language_tag!(language_tag, options \\\\ [])","anchor":"from_language_tag!/2"},{"id":"from_subdivision_code/2","deprecated":false,"title":"from_subdivision_code(subdivision_code, options \\\\ [])","anchor":"from_subdivision_code/2"},{"id":"from_subdivision_code!/2","deprecated":false,"title":"from_subdivision_code!(subdivision_code, options \\\\ [])","anchor":"from_subdivision_code!/2"},{"id":"from_territory_code/2","deprecated":false,"title":"from_territory_code(territory_code, options \\\\ [])","anchor":"from_territory_code/2"},{"id":"from_territory_code!/2","deprecated":false,"title":"from_territory_code!(territory_code, options \\\\ [])","anchor":"from_territory_code!/2"},{"id":"info/1","deprecated":false,"title":"info(territory_code)","anchor":"info/1"},{"id":"info!/1","deprecated":false,"title":"info!(territory_code)","anchor":"info!/1"},{"id":"inverted_subdivisions/1","deprecated":false,"title":"inverted_subdivisions(atom)","anchor":"inverted_subdivisions/1"},{"id":"inverted_territories/1","deprecated":false,"title":"inverted_territories(atom)","anchor":"inverted_territories/1"},{"id":"known_subdivisions/1","deprecated":false,"title":"known_subdivisions(locale \\\\ Cldr.get_locale())","anchor":"known_subdivisions/1"},{"id":"known_territories/1","deprecated":false,"title":"known_territories(locale \\\\ Cldr.get_locale())","anchor":"known_territories/1"},{"id":"known_territory_subdivisions/1","deprecated":false,"title":"known_territory_subdivisions(territory_code)","anchor":"known_territory_subdivisions/1"},{"id":"parent/2","deprecated":false,"title":"parent(territory_code, options \\\\ [as: :atom])","anchor":"parent/2"},{"id":"parent!/2","deprecated":false,"title":"parent!(territory_code, options \\\\ [as: :atom])","anchor":"parent!/2"},{"id":"subdivision_aliases/0","deprecated":false,"title":"subdivision_aliases()","anchor":"subdivision_aliases/0"},{"id":"to_currency_code/2","deprecated":false,"title":"to_currency_code(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_code/2"},{"id":"to_currency_code!/2","deprecated":false,"title":"to_currency_code!(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_code!/2"},{"id":"to_currency_codes/2","deprecated":false,"title":"to_currency_codes(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_codes/2"},{"id":"to_currency_codes!/2","deprecated":false,"title":"to_currency_codes!(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_codes!/2"},{"id":"to_unicode_flag/1","deprecated":false,"title":"to_unicode_flag(territory_code)","anchor":"to_unicode_flag/1"},{"id":"to_unicode_flag!/1","deprecated":false,"title":"to_unicode_flag!(territory_code)","anchor":"to_unicode_flag!/1"},{"id":"translate_language_tag/2","deprecated":false,"title":"translate_language_tag(tag, options \\\\ [])","anchor":"translate_language_tag/2"},{"id":"translate_language_tag!/2","deprecated":false,"title":"translate_language_tag!(locale_from, options \\\\ [])","anchor":"translate_language_tag!/2"},{"id":"translate_subdivision/4","deprecated":false,"title":"translate_subdivision(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_subdivision/4"},{"id":"translate_subdivision!/4","deprecated":false,"title":"translate_subdivision!(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_subdivision!/4"},{"id":"translate_territory/4","deprecated":false,"title":"translate_territory(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_territory/4"},{"id":"translate_territory!/4","deprecated":false,"title":"translate_territory!(localized_string, locale_from, locale_name \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_territory!/4"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Time","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Time","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Time","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Time.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Time.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Time.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string/3","deprecated":false,"title":"do_to_string(from, to, options)","anchor":"do_to_string/3"},{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Unit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Unit","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Unit","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/2","deprecated":false,"title":"add(unit_1, unit_2)","anchor":"add/2"},{"id":"add!/2","deprecated":false,"title":"add!(unit_1, unit_2)","anchor":"add!/2"},{"id":"compatible?/2","deprecated":false,"title":"compatible?(unit_1, unit_2)","anchor":"compatible?/2"},{"id":"convert/2","deprecated":false,"title":"convert(unit_1, to_unit)","anchor":"convert/2"},{"id":"convert!/2","deprecated":false,"title":"convert!(unit_1, to_unit)","anchor":"convert!/2"},{"id":"decompose/2","deprecated":false,"title":"decompose(unit, list)","anchor":"decompose/2"},{"id":"default_gender/1","deprecated":false,"title":"default_gender(locale_name)","anchor":"default_gender/1"},{"id":"default_style/0","deprecated":false,"title":"default_style()","anchor":"default_style/0"},{"id":"display_name/2","deprecated":false,"title":"display_name(unit, options \\\\ [])","anchor":"display_name/2"},{"id":"div/2","deprecated":false,"title":"div(unit_1, unit_2)","anchor":"div/2"},{"id":"div!/2","deprecated":false,"title":"div!(unit_1, unit_2)","anchor":"div!/2"},{"id":"grammatical_features/1","deprecated":false,"title":"grammatical_features(locale_name)","anchor":"grammatical_features/1"},{"id":"grammatical_gender/1","deprecated":false,"title":"grammatical_gender(locale_name)","anchor":"grammatical_gender/1"},{"id":"known_styles/0","deprecated":false,"title":"known_styles()","anchor":"known_styles/0"},{"id":"known_unit_categories/0","deprecated":false,"title":"known_unit_categories()","anchor":"known_unit_categories/0"},{"id":"known_units/0","deprecated":false,"title":"known_units()","anchor":"known_units/0"},{"id":"localize/1","deprecated":false,"title":"localize(unit)","anchor":"localize/1"},{"id":"localize/2","deprecated":false,"title":"localize(unit, options \\\\ [])","anchor":"localize/2"},{"id":"measurement_system?/2","deprecated":false,"title":"measurement_system?(unit, systems)","anchor":"measurement_system?/2"},{"id":"measurement_system_for/1","deprecated":true,"title":"measurement_system_for(territory)","anchor":"measurement_system_for/1"},{"id":"measurement_system_for/2","deprecated":true,"title":"measurement_system_for(territory, key)","anchor":"measurement_system_for/2"},{"id":"measurement_system_for_territory/1","deprecated":false,"title":"measurement_system_for_territory(territory)","anchor":"measurement_system_for_territory/1"},{"id":"measurement_system_for_territory/2","deprecated":false,"title":"measurement_system_for_territory(territory, key)","anchor":"measurement_system_for_territory/2"},{"id":"measurement_system_from_locale/1","deprecated":false,"title":"measurement_system_from_locale(locale)","anchor":"measurement_system_from_locale/1"},{"id":"measurement_system_from_locale/2","deprecated":false,"title":"measurement_system_from_locale(locale, category)","anchor":"measurement_system_from_locale/2"},{"id":"measurement_system_from_locale/3","deprecated":false,"title":"measurement_system_from_locale(locale, backend, category)","anchor":"measurement_system_from_locale/3"},{"id":"measurement_systems_for_unit/1","deprecated":false,"title":"measurement_systems_for_unit(unit)","anchor":"measurement_systems_for_unit/1"},{"id":"mult/2","deprecated":false,"title":"mult(unit_1, unit_2)","anchor":"mult/2"},{"id":"mult!/2","deprecated":false,"title":"mult!(unit_1, unit_2)","anchor":"mult!/2"},{"id":"new/2","deprecated":false,"title":"new(unit, value)","anchor":"new/2"},{"id":"new!/2","deprecated":false,"title":"new!(unit, value)","anchor":"new!/2"},{"id":"parse/2","deprecated":false,"title":"parse(unit_string, options \\\\ [])","anchor":"parse/2"},{"id":"parse!/2","deprecated":false,"title":"parse!(unit_string, options \\\\ [])","anchor":"parse!/2"},{"id":"parse_unit_name/2","deprecated":false,"title":"parse_unit_name(unit_name_string, options \\\\ [])","anchor":"parse_unit_name/2"},{"id":"parse_unit_name!/2","deprecated":false,"title":"parse_unit_name!(unit_name_string, options \\\\ [])","anchor":"parse_unit_name!/2"},{"id":"preferred_units/2","deprecated":false,"title":"preferred_units(unit, options \\\\ [])","anchor":"preferred_units/2"},{"id":"preferred_units!/2","deprecated":false,"title":"preferred_units!(unit, options \\\\ [])","anchor":"preferred_units!/2"},{"id":"round/1","deprecated":false,"title":"round(unit)","anchor":"round/1"},{"id":"round/2","deprecated":false,"title":"round(unit, places)","anchor":"round/2"},{"id":"round/3","deprecated":false,"title":"round(unit, places, mode)","anchor":"round/3"},{"id":"styles/0","deprecated":false,"title":"styles()","anchor":"styles/0"},{"id":"sub/2","deprecated":false,"title":"sub(unit_1, unit_2)","anchor":"sub/2"},{"id":"sub!/2","deprecated":false,"title":"sub!(unit_1, unit_2)","anchor":"sub!/2"},{"id":"to_iolist/2","deprecated":false,"title":"to_iolist(number, options \\\\ [])","anchor":"to_iolist/2"},{"id":"to_iolist!/2","deprecated":false,"title":"to_iolist!(number, options \\\\ [])","anchor":"to_iolist!/2"},{"id":"to_string/2","deprecated":false,"title":"to_string(number, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(number, options \\\\ [])","anchor":"to_string!/2"},{"id":"unit_category/1","deprecated":false,"title":"unit_category(unit)","anchor":"unit_category/1"},{"id":"unit_strings_for/1","deprecated":false,"title":"unit_strings_for(locale)","anchor":"unit_strings_for/1"},{"id":"validate_style/1","deprecated":false,"title":"validate_style(unit)","anchor":"validate_style/1"},{"id":"validate_unit/1","deprecated":false,"title":"validate_unit(unit)","anchor":"validate_unit/1"},{"id":"value/1","deprecated":false,"title":"value(unit)","anchor":"value/1"},{"id":"zero/1","deprecated":false,"title":"zero(unit)","anchor":"zero/1"},{"id":"zero?/1","deprecated":false,"title":"zero?(unit)","anchor":"zero?/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext","nodeGroups":[{"name":"Functions","nodes":[{"id":"dgettext/3","deprecated":false,"title":"dgettext(domain, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dgettext/3"},{"id":"dgettext_noop/2","deprecated":false,"title":"dgettext_noop(domain, msgid)","anchor":"dgettext_noop/2"},{"id":"dngettext/5","deprecated":false,"title":"dngettext(domain, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dngettext/5"},{"id":"dngettext_noop/3","deprecated":false,"title":"dngettext_noop(domain, msgid, msgid_plural)","anchor":"dngettext_noop/3"},{"id":"dpgettext/4","deprecated":false,"title":"dpgettext(domain, msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dpgettext/4"},{"id":"dpgettext_noop/3","deprecated":false,"title":"dpgettext_noop(domain, msgctxt, msgid)","anchor":"dpgettext_noop/3"},{"id":"dpngettext/6","deprecated":false,"title":"dpngettext(domain, msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dpngettext/6"},{"id":"dpngettext_noop/4","deprecated":false,"title":"dpngettext_noop(domain, msgctxt, msgid, msgid_plural)","anchor":"dpngettext_noop/4"},{"id":"gettext/2","deprecated":false,"title":"gettext(msgid, bindings \\\\ Macro.escape(%{}))","anchor":"gettext/2"},{"id":"gettext_comment/1","deprecated":false,"title":"gettext_comment(comment)","anchor":"gettext_comment/1"},{"id":"gettext_noop/1","deprecated":false,"title":"gettext_noop(msgid)","anchor":"gettext_noop/1"},{"id":"handle_missing_bindings/2","deprecated":false,"title":"handle_missing_bindings(exception, incomplete)","anchor":"handle_missing_bindings/2"},{"id":"handle_missing_plural_translation/7","deprecated":false,"title":"handle_missing_plural_translation(locale, domain, msgctxt, msgid, msgid_plural, n, bindings)","anchor":"handle_missing_plural_translation/7"},{"id":"handle_missing_translation/5","deprecated":false,"title":"handle_missing_translation(locale, domain, msgctxt, msgid, bindings)","anchor":"handle_missing_translation/5"},{"id":"ngettext/4","deprecated":false,"title":"ngettext(msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"ngettext/4"},{"id":"ngettext_noop/2","deprecated":false,"title":"ngettext_noop(msgid, msgid_plural)","anchor":"ngettext_noop/2"},{"id":"pgettext/3","deprecated":false,"title":"pgettext(msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"pgettext/3"},{"id":"pgettext_noop/2","deprecated":false,"title":"pgettext_noop(msgid, context)","anchor":"pgettext_noop/2"},{"id":"pngettext/5","deprecated":false,"title":"pngettext(msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"pngettext/5"},{"id":"pngettext_noop/3","deprecated":false,"title":"pngettext_noop(msgctxt, msgid, msgid_plural)","anchor":"pngettext_noop/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext.Helpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"l/4","deprecated":false,"title":"l(original_text_or_id, bindings \\\\ [], context \\\\ nil, domain \\\\ nil)","anchor":"l/4"},{"id":"localise_dynamic/2","deprecated":false,"title":"localise_dynamic(msgid, caller_module \\\\ nil)","anchor":"localise_dynamic/2"},{"id":"localise_strings/2","deprecated":false,"title":"localise_strings(strings, caller_module \\\\ nil)","anchor":"localise_strings/2"},{"id":"lp/6","deprecated":false,"title":"lp(original_text_or_id, msgid_plural, n, bindings \\\\ [], context \\\\ nil, domain \\\\ nil)","anchor":"lp/6"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext.Plural","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext.Plural","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext.Plural","nodeGroups":[{"name":"Functions","nodes":[{"id":"nplurals/1","deprecated":false,"title":"nplurals(locale_name)","anchor":"nplurals/1"},{"id":"plural/2","deprecated":false,"title":"plural(locale, n)","anchor":"plural/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Media","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Media","sections":[],"nested_context":"Bonfire","nested_title":".Common.Media","nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar_fallback/1","deprecated":false,"title":"avatar_fallback(_ \\\\ nil)","anchor":"avatar_fallback/1"},{"id":"avatar_media/1","deprecated":false,"title":"avatar_media(maybe_media)","anchor":"avatar_media/1"},{"id":"avatar_url/1","deprecated":false,"title":"avatar_url(media)","anchor":"avatar_url/1"},{"id":"banner_fallback/0","deprecated":false,"title":"banner_fallback()","anchor":"banner_fallback/0"},{"id":"banner_url/1","deprecated":false,"title":"banner_url(media)","anchor":"banner_url/1"},{"id":"extract_tar/2","deprecated":false,"title":"extract_tar(archive, opts \\\\ [:compressed, :memory])","anchor":"extract_tar/2"},{"id":"image_url/1","deprecated":false,"title":"image_url(url)","anchor":"image_url/1"},{"id":"maybe_dominant_color/4","deprecated":false,"title":"maybe_dominant_color(user, avatar_url \\\\ nil, banner_url \\\\ nil, banner_fallback \\\\ nil)","anchor":"maybe_dominant_color/4"},{"id":"media_url/1","deprecated":false,"title":"media_url(media)","anchor":"media_url/1"},{"id":"read_tar_files/3","deprecated":false,"title":"read_tar_files(archive, file_or_files, opts \\\\ [:compressed, :verbose])","anchor":"read_tar_files/3"},{"id":"thumbnail_url/1","deprecated":false,"title":"thumbnail_url(media)","anchor":"thumbnail_url/1"}],"key":"functions"}]},{"id":"Bonfire.Common.MemoryMonitor","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.MemoryMonitor","sections":[],"nested_context":"Bonfire","nested_title":".Common.MemoryMonitor","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"get_memory_usage/2","deprecated":false,"title":"get_memory_usage(name, pid \\\\ self())","anchor":"get_memory_usage/2"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(msg, state)","anchor":"handle_info/2"},{"id":"start_link/2","deprecated":false,"title":"start_link(name, pid_to_monitor \\\\ self())","anchor":"start_link/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Modularity.DeclareHelpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Modularity.DeclareHelpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Modularity.DeclareHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"app/1","deprecated":false,"title":"app(module)","anchor":"app/1"},{"id":"declare_extension/2","deprecated":false,"title":"declare_extension(name, opts \\\\ [])","anchor":"declare_extension/2"},{"id":"generate_link/3","deprecated":false,"title":"generate_link(name, module, opts)","anchor":"generate_link/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Module.Override","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Module.Override","sections":[],"nested_context":"Bonfire","nested_title":".Common.Module.Override","nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/2","deprecated":false,"title":"clone(old_module, new_module)","anchor":"clone/2"},{"id":"clone_original/2","deprecated":false,"title":"clone_original(old_module, prefix \\\\ nil)","anchor":"clone_original/2"},{"id":"module_name_atom/1","deprecated":false,"title":"module_name_atom(module)","anchor":"module_name_atom/1"},{"id":"module_name_string/1","deprecated":false,"title":"module_name_string(module)","anchor":"module_name_string/1"},{"id":"module_original_name_atom/2","deprecated":false,"title":"module_original_name_atom(module, prefix \\\\ nil)","anchor":"module_original_name_atom/2"},{"id":"module_original_name_str/2","deprecated":false,"title":"module_original_name_str(module, prefix \\\\ nil)","anchor":"module_original_name_str/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles","nodeGroups":[{"name":"Functions","nodes":[{"id":"dataloader/1","deprecated":false,"title":"dataloader(context)","anchor":"dataloader/1"},{"id":"exists?/2","deprecated":false,"title":"exists?(filters, opts \\\\ [])","anchor":"exists?/2"},{"id":"filter_one/1","deprecated":false,"title":"filter_one(filters)","anchor":"filter_one/1"},{"id":"filters/3","deprecated":false,"title":"filters(schema, id_filters, opts \\\\ [])","anchor":"filters/3"},{"id":"follow!/2","deprecated":false,"title":"follow!(pointer_or_pointers, opts \\\\ [])","anchor":"follow!/2"},{"id":"follow_function_error/2","deprecated":false,"title":"follow_function_error(error, args)","anchor":"follow_function_error/2"},{"id":"forge!/1","deprecated":false,"title":"forge!(pointed)","anchor":"forge!/1"},{"id":"forge!/2","deprecated":false,"title":"forge!(table_id, id)","anchor":"forge!/2"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(id, opts \\\\ [])","anchor":"get!/2"},{"id":"id_binary/1","deprecated":false,"title":"id_binary(id)","anchor":"id_binary/1"},{"id":"id_filter/2","deprecated":false,"title":"id_filter(query, id)","anchor":"id_filter/2"},{"id":"list!/2","deprecated":false,"title":"list!(pointers, opts \\\\ [])","anchor":"list!/2"},{"id":"list_by_type!/3","deprecated":false,"title":"list_by_type!(table_id_or_schema, filters \\\\ [], opts \\\\ [])","anchor":"list_by_type!/3"},{"id":"list_ids/0","deprecated":false,"title":"list_ids()","anchor":"list_ids/0"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"many!/2","deprecated":false,"title":"many!(filters \\\\ [], opts \\\\ [])","anchor":"many!/2"},{"id":"maybe_forge/1","deprecated":false,"title":"maybe_forge(thing)","anchor":"maybe_forge/1"},{"id":"maybe_forge!/1","deprecated":false,"title":"maybe_forge!(thing)","anchor":"maybe_forge!/1"},{"id":"maybe_resolve/4","deprecated":false,"title":"maybe_resolve(parent, field, args, context)","anchor":"maybe_resolve/4"},{"id":"one/2","deprecated":false,"title":"one(id, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(filters, opts \\\\ [])","anchor":"one!/2"},{"id":"pointer_preloads/2","deprecated":false,"title":"pointer_preloads(query, preloads)","anchor":"pointer_preloads/2"},{"id":"pointer_query/2","deprecated":false,"title":"pointer_query(q, opts)","anchor":"pointer_query/2"},{"id":"preload!/2","deprecated":false,"title":"preload!(pointer_or_pointers, opts \\\\ [])","anchor":"preload!/2"},{"id":"query/3","deprecated":false,"title":"query(schema, filters, opts \\\\ [])","anchor":"query/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Pointers.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Pointers.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Pointers.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters \\\\ Pointer)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"},{"id":"query_incl_deleted/0","deprecated":false,"title":"query_incl_deleted()","anchor":"query_incl_deleted/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Preload","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Preload","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Preload","nodeGroups":[{"name":"Functions","nodes":[{"id":"access_key/2","deprecated":false,"title":"access_key(key, default_val \\\\ nil)","anchor":"access_key/2"},{"id":"custom_access_key_fun/3","deprecated":false,"title":"custom_access_key_fun(key, fun \\\\ &preload_next_in/1, default_val \\\\ nil)","anchor":"custom_access_key_fun/3"},{"id":"maybe_preload_nested_pointers/3","deprecated":false,"title":"maybe_preload_nested_pointers(object, keys, opts \\\\ [])","anchor":"maybe_preload_nested_pointers/3"},{"id":"maybe_preload_pointer/2","deprecated":false,"title":"maybe_preload_pointer(pointer, opts \\\\ [])","anchor":"maybe_preload_pointer/2"},{"id":"maybe_preload_pointers/3","deprecated":false,"title":"maybe_preload_pointers(object, keys, opts \\\\ [])","anchor":"maybe_preload_pointers/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Tables","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Tables","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Tables","nodeGroups":[{"name":"Functions","nodes":[{"id":"list_ids/0","deprecated":false,"title":"list_ids()","anchor":"list_ids/0"},{"id":"list_schemas/0","deprecated":false,"title":"list_schemas()","anchor":"list_schemas/0"},{"id":"list_tables/1","deprecated":false,"title":"list_tables(source \\\\ :code)","anchor":"list_tables/1"},{"id":"list_tables_debug/0","deprecated":false,"title":"list_tables_debug()","anchor":"list_tables_debug/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(id)","anchor":"one/1"},{"id":"one!/1","deprecated":false,"title":"one!(filters)","anchor":"one!/1"},{"id":"schema_or_table!/1","deprecated":false,"title":"schema_or_table!(schema_or_tablename_or_id)","anchor":"schema_or_table!/1"},{"id":"table!/1","deprecated":false,"title":"table!(schema_or_tablename_or_id)","anchor":"table!/1"},{"id":"table_fields/1","deprecated":false,"title":"table_fields(schema)","anchor":"table_fields/1"},{"id":"table_fields_meta/1","deprecated":false,"title":"table_fields_meta(schema)","anchor":"table_fields_meta/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Tables.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Tables.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Tables.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Opts","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Opts","sections":[],"nested_context":"Bonfire","nested_title":".Common.Opts","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_from_opts/3","deprecated":false,"title":"maybe_from_opts(opts, key, fallback \\\\ nil)","anchor":"maybe_from_opts/3"},{"id":"to_options/1","deprecated":false,"title":"to_options(user_or_socket_or_opts)","anchor":"to_options/1"}],"key":"functions"}]},{"id":"Bonfire.Common.PubSub","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.PubSub","sections":[],"nested_context":"Bonfire","nested_title":".Common.PubSub","nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/2","deprecated":false,"title":"broadcast(topics, payload)","anchor":"broadcast/2"},{"id":"broadcast_with_telemetry/2","deprecated":false,"title":"broadcast_with_telemetry(topic, message)","anchor":"broadcast_with_telemetry/2"},{"id":"broadcast_with_telemetry/3","deprecated":false,"title":"broadcast_with_telemetry(topic, message, source)","anchor":"broadcast_with_telemetry/3"},{"id":"current_function/1","deprecated":false,"title":"current_function(env)","anchor":"current_function/1"},{"id":"subscribe/2","deprecated":false,"title":"subscribe(topics, socket)","anchor":"subscribe/2"}],"key":"functions"}]},{"id":"Bonfire.Common.PubSub.Event","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.PubSub.Event","sections":[],"nested_context":"Bonfire","nested_title":".Common.PubSub.Event"},{"id":"Bonfire.Common.QueryModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.QueryModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.QueryModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"apply_error/2","deprecated":false,"title":"apply_error(error, args)","anchor":"apply_error/2"},{"id":"linked_context_modules/0","deprecated":false,"title":"linked_context_modules()","anchor":"linked_context_modules/0"},{"id":"linked_schema_modules/0","deprecated":false,"title":"linked_schema_modules()","anchor":"linked_schema_modules/0"},{"id":"maybe_query/3","deprecated":false,"title":"maybe_query(schema, filters \\\\ [], fallback_fun \\\\ &apply_error/2)","anchor":"maybe_query/3"},{"id":"maybe_query_module/1","deprecated":false,"title":"maybe_query_module(query)","anchor":"maybe_query_module/1"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"query_function_error/3","deprecated":false,"title":"query_function_error(error, args, level \\\\ :info)","anchor":"query_function_error/3"},{"id":"query_module/1","deprecated":false,"title":"query_module(query)","anchor":"query_module/1"},{"id":"query_module!/1","deprecated":false,"title":"query_module!(query)","anchor":"query_module!/1"},{"id":"query_modules/1","deprecated":false,"title":"query_modules(modules)","anchor":"query_modules/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo","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":"default_repo_opts/0","deprecated":false,"title":"default_repo_opts()","anchor":"default_repo_opts/0"},{"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":"delete_many/1","deprecated":false,"title":"delete_many(query)","anchor":"delete_many/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":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"fetch/2","deprecated":false,"title":"fetch(queryable, id)","anchor":"fetch/2"},{"id":"fetch_all/2","deprecated":false,"title":"fetch_all(queryable, id_or_ids)","anchor":"fetch_all/2"},{"id":"fetch_by/2","deprecated":false,"title":"fetch_by(queryable, term)","anchor":"fetch_by/2"},{"id":"find/3","deprecated":false,"title":"find(q, changeset, field \\\\ :form)","anchor":"find/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_all_or_ignore/2","deprecated":false,"title":"insert_all_or_ignore(schema, data)","anchor":"insert_all_or_ignore/2"},{"id":"insert_or_ignore/1","deprecated":false,"title":"insert_or_ignore(cs_or_struct)","anchor":"insert_or_ignore/1"},{"id":"insert_or_ignore/2","deprecated":false,"title":"insert_or_ignore(schema, object)","anchor":"insert_or_ignore/2"},{"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":"make_subquery/1","deprecated":false,"title":"make_subquery(query)","anchor":"make_subquery/1"},{"id":"many/2","deprecated":false,"title":"many(query, opts \\\\ [])","anchor":"many/2"},{"id":"many_paginated/3","deprecated":false,"title":"many_paginated(queryable, opts \\\\ [], repo_opts \\\\ default_repo_opts())","anchor":"many_paginated/3"},{"id":"maybe_one/2","deprecated":false,"title":"maybe_one(q, fallback \\\\ nil)","anchor":"maybe_one/2"},{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_where_ilike/5","deprecated":false,"title":"maybe_where_ilike(query, field, user_query, system_prefix \\\\ \"\", system_suffix \\\\ \"\")","anchor":"maybe_where_ilike/5"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"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":"pluck/3","deprecated":false,"title":"pluck(query, fields, opts \\\\ [])","anchor":"pluck/3"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(obj, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(obj, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put/1","deprecated":false,"title":"put(changeset)","anchor":"put/1"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"put_many/1","deprecated":false,"title":"put_many(things)","anchor":"put_many/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":"single/1","deprecated":false,"title":"single(q)","anchor":"single/1"},{"id":"sql/3","deprecated":false,"title":"sql(raw_sql, data \\\\ [], opts \\\\ [])","anchor":"sql/3"},{"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":"trace/1","deprecated":false,"title":"trace(fun)","anchor":"trace/1"},{"id":"transact_many/1","deprecated":false,"title":"transact_many(queries)","anchor":"transact_many/1"},{"id":"transact_with/2","deprecated":false,"title":"transact_with(fun, opts \\\\ [])","anchor":"transact_with/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"},{"id":"upsert/3","deprecated":false,"title":"upsert(cs, keys_or_attrs_to_update \\\\ nil, conflict_target \\\\ [:id])","anchor":"upsert/3"},{"id":"upsert_all/3","deprecated":false,"title":"upsert_all(schema, data, conflict_target \\\\ [:id])","anchor":"upsert_all/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Delete","nodeGroups":[{"name":"Functions","nodes":[{"id":"deletion_result/1","deprecated":false,"title":"deletion_result(other)","anchor":"deletion_result/1"},{"id":"deletion_result!/1","deprecated":false,"title":"deletion_result!(arg)","anchor":"deletion_result!/1"},{"id":"hard_delete/1","deprecated":false,"title":"hard_delete(it)","anchor":"hard_delete/1"},{"id":"hard_delete!/1","deprecated":false,"title":"hard_delete!(it)","anchor":"hard_delete!/1"},{"id":"maybe_allow_delete?/2","deprecated":false,"title":"maybe_allow_delete?(user, context)","anchor":"maybe_allow_delete?/2"},{"id":"schema/1","deprecated":false,"title":"schema(it)","anchor":"schema/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(it)","anchor":"soft_delete/1"},{"id":"soft_delete!/1","deprecated":false,"title":"soft_delete!(it)","anchor":"soft_delete!/1"},{"id":"soft_delete_changeset/4","deprecated":false,"title":"soft_delete_changeset(it, column \\\\ :deleted_at, value \\\\ DateTime.utc_now(), error \\\\ \"was already deleted\")","anchor":"soft_delete_changeset/4"},{"id":"undelete/1","deprecated":false,"title":"undelete(it)","anchor":"undelete/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Filter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Filter","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Filter","nodeGroups":[{"name":"Functions","nodes":[{"id":"query_filter/4","deprecated":false,"title":"query_filter(module_or_query, filters, order_by_prop \\\\ :id, order_direction \\\\ :desc)","anchor":"query_filter/4"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Preload","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Preload","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Preload","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_preloads_per_nested_schema/4","deprecated":false,"title":"maybe_preloads_per_nested_schema(objects, path, preloads, opts \\\\ [])","anchor":"maybe_preloads_per_nested_schema/4"},{"id":"maybe_preloads_per_schema/3","deprecated":false,"title":"maybe_preloads_per_schema(object, schema_preloads, opts \\\\ [])","anchor":"maybe_preloads_per_schema/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(structure, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(structure, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"schema_mixins/1","deprecated":false,"title":"schema_mixins(structure)","anchor":"schema_mixins/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Utils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Utils","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"change_disabled/1","deprecated":false,"title":"change_disabled(changeset)","anchor":"change_disabled/1"},{"id":"change_muted/1","deprecated":false,"title":"change_muted(changeset)","anchor":"change_muted/1"},{"id":"change_public/1","deprecated":false,"title":"change_public(changeset)","anchor":"change_public/1"},{"id":"change_synced_timestamp/3","deprecated":false,"title":"change_synced_timestamp(changeset, bool_field, timestamp_field)","anchor":"change_synced_timestamp/3"},{"id":"change_synced_timestamps/5","deprecated":false,"title":"change_synced_timestamps(changeset, bool_field, on_field, off_field, default \\\\ true)","anchor":"change_synced_timestamps/5"},{"id":"match_admin/0","deprecated":false,"title":"match_admin()","anchor":"match_admin/0"},{"id":"validate_email/2","deprecated":false,"title":"validate_email(changeset, field)","anchor":"validate_email/2"},{"id":"validate_email_domain/2","deprecated":false,"title":"validate_email_domain(changeset, field)","anchor":"validate_email_domain/2"},{"id":"validate_exactly_one/3","deprecated":false,"title":"validate_exactly_one(changeset, columns, message)","anchor":"validate_exactly_one/3"},{"id":"validate_http_url/2","deprecated":false,"title":"validate_http_url(changeset, field)","anchor":"validate_http_url/2"},{"id":"validate_not_expired/4","deprecated":false,"title":"validate_not_expired(cs, now \\\\ DateTime.utc_now(), column \\\\ :expires_at, message \\\\ \"expired\")","anchor":"validate_not_expired/4"}],"key":"functions"}]},{"id":"Bonfire.Common.RepoTemplate","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.RepoTemplate","sections":[],"nested_context":"Bonfire","nested_title":".Common.RepoTemplate"},{"id":"Bonfire.Common.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"skip_test_tags/1","deprecated":false,"title":"skip_test_tags(extras \\\\ [])","anchor":"skip_test_tags/1"},{"id":"test_formatters/0","deprecated":false,"title":"test_formatters()","anchor":"test_formatters/0"},{"id":"test_formatters/1","deprecated":false,"title":"test_formatters(extra)","anchor":"test_formatters/1"}],"key":"functions"}]},{"id":"Bonfire.Common.SchemaModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.SchemaModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.SchemaModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"linked_context_modules/0","deprecated":false,"title":"linked_context_modules()","anchor":"linked_context_modules/0"},{"id":"linked_query_modules/0","deprecated":false,"title":"linked_query_modules()","anchor":"linked_query_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_get_in/2","deprecated":false,"title":"do_get_in(result, keys_tree)","anchor":"do_get_in/2"},{"id":"get/3","deprecated":false,"title":"get(key, default \\\\ nil, opts \\\\ [])","anchor":"get/3"},{"id":"get!/2","deprecated":false,"title":"get!(key, opts \\\\ [])","anchor":"get!/2"},{"id":"load_instance_settings/0","deprecated":false,"title":"load_instance_settings()","anchor":"load_instance_settings/0"},{"id":"put/3","deprecated":false,"title":"put(keys, value, opts \\\\ [])","anchor":"put/3"},{"id":"reset_all/0","deprecated":false,"title":"reset_all()","anchor":"reset_all/0"},{"id":"reset_instance/0","deprecated":false,"title":"reset_instance()","anchor":"reset_instance/0"},{"id":"set/2","deprecated":false,"title":"set(attrs, opts \\\\ [])","anchor":"set/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"input_name/1","deprecated":false,"title":"input_name(keys)","anchor":"input_name/1"},{"id":"maybe_assign_input_value_from_keys/1","deprecated":false,"title":"maybe_assign_input_value_from_keys(assigns)","anchor":"maybe_assign_input_value_from_keys/1"},{"id":"scoped/2","deprecated":false,"title":"scoped(scope, context)","anchor":"scoped/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings.LoadInstanceConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings.LoadInstanceConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings.LoadInstanceConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"load_config/0","deprecated":false,"title":"load_config()","anchor":"load_config/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Simulation","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Simulation","sections":[],"nested_context":"Bonfire","nested_title":".Common.Simulation","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_url_base/0","deprecated":false,"title":"ap_url_base()","anchor":"ap_url_base/0"},{"id":"base64/0","deprecated":false,"title":"base64()","anchor":"base64/0"},{"id":"bool/0","deprecated":false,"title":"bool()","anchor":"bool/0"},{"id":"canonical_url/0","deprecated":false,"title":"canonical_url()","anchor":"canonical_url/0"},{"id":"content_type/0","deprecated":false,"title":"content_type()","anchor":"content_type/0"},{"id":"content_url/0","deprecated":false,"title":"content_url()","anchor":"content_url/0"},{"id":"date_of_birth/0","deprecated":false,"title":"date_of_birth()","anchor":"date_of_birth/0"},{"id":"domain/0","deprecated":false,"title":"domain()","anchor":"domain/0"},{"id":"email/0","deprecated":false,"title":"email()","anchor":"email/0"},{"id":"email_user/0","deprecated":false,"title":"email_user()","anchor":"email_user/0"},{"id":"falsehood/0","deprecated":false,"title":"falsehood()","anchor":"falsehood/0"},{"id":"float/0","deprecated":false,"title":"float()","anchor":"float/0"},{"id":"future_date/0","deprecated":false,"title":"future_date()","anchor":"future_date/0"},{"id":"future_datetime/0","deprecated":false,"title":"future_datetime()","anchor":"future_datetime/0"},{"id":"future_datetime_iso/0","deprecated":false,"title":"future_datetime_iso()","anchor":"future_datetime_iso/0"},{"id":"icon/0","deprecated":false,"title":"icon()","anchor":"icon/0"},{"id":"image/0","deprecated":false,"title":"image()","anchor":"image/0"},{"id":"integer/0","deprecated":false,"title":"integer()","anchor":"integer/0"},{"id":"license/0","deprecated":false,"title":"license()","anchor":"license/0"},{"id":"location/0","deprecated":false,"title":"location()","anchor":"location/0"},{"id":"long_count/0","deprecated":false,"title":"long_count()","anchor":"long_count/0"},{"id":"long_list/1","deprecated":false,"title":"long_list(gen)","anchor":"long_list/1"},{"id":"markdown/0","deprecated":false,"title":"markdown()","anchor":"markdown/0"},{"id":"maybe_bool/0","deprecated":false,"title":"maybe_bool()","anchor":"maybe_bool/0"},{"id":"maybe_one_of/1","deprecated":false,"title":"maybe_one_of(list)","anchor":"maybe_one_of/1"},{"id":"med_count/0","deprecated":false,"title":"med_count()","anchor":"med_count/0"},{"id":"med_list/1","deprecated":false,"title":"med_list(gen)","anchor":"med_list/1"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"name/0"},{"id":"neg_integer/0","deprecated":false,"title":"neg_integer()","anchor":"neg_integer/0"},{"id":"one_of/1","deprecated":false,"title":"one_of(gens)","anchor":"one_of/1"},{"id":"paragraph/0","deprecated":false,"title":"paragraph()","anchor":"paragraph/0"},{"id":"password/0","deprecated":false,"title":"password()","anchor":"password/0"},{"id":"past_date/0","deprecated":false,"title":"past_date()","anchor":"past_date/0"},{"id":"past_datetime/0","deprecated":false,"title":"past_datetime()","anchor":"past_datetime/0"},{"id":"past_datetime_iso/0","deprecated":false,"title":"past_datetime_iso()","anchor":"past_datetime_iso/0"},{"id":"path/0","deprecated":false,"title":"path()","anchor":"path/0"},{"id":"pos_integer/0","deprecated":false,"title":"pos_integer()","anchor":"pos_integer/0"},{"id":"preferred_username/0","deprecated":false,"title":"preferred_username()","anchor":"preferred_username/0"},{"id":"short_count/0","deprecated":false,"title":"short_count()","anchor":"short_count/0"},{"id":"short_list/1","deprecated":false,"title":"short_list(gen)","anchor":"short_list/1"},{"id":"signing_key/0","deprecated":false,"title":"signing_key()","anchor":"signing_key/0"},{"id":"some/2","deprecated":false,"title":"some(count_or_range \\\\ 1, fun)","anchor":"some/2"},{"id":"summary/0","deprecated":false,"title":"summary()","anchor":"summary/0"},{"id":"title/0","deprecated":false,"title":"title()","anchor":"title/0"},{"id":"truth/0","deprecated":false,"title":"truth()","anchor":"truth/0"},{"id":"uid/1","deprecated":false,"title":"uid(schema \\\\ nil)","anchor":"uid/1"},{"id":"ulid/0","deprecated":false,"title":"ulid()","anchor":"ulid/0"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"url/0"},{"id":"username/0","deprecated":false,"title":"username()","anchor":"username/0"},{"id":"uuid/0","deprecated":false,"title":"uuid()","anchor":"uuid/0"},{"id":"verb/0","deprecated":false,"title":"verb()","anchor":"verb/0"},{"id":"website/0","deprecated":false,"title":"website()","anchor":"website/0"}],"key":"functions"}]},{"id":"Bonfire.Common.StartupTimer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.StartupTimer","sections":[],"nested_context":"Bonfire","nested_title":".Common.StartupTimer","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(application \\\\ :bonfire)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"run_all_tests/1","deprecated":false,"title":"run_all_tests(args)","anchor":"run_all_tests/1"},{"id":"run_failed_tests/1","deprecated":false,"title":"run_failed_tests(args)","anchor":"run_failed_tests/1"},{"id":"run_stale_tests/1","deprecated":false,"title":"run_stale_tests(args)","anchor":"run_stale_tests/1"},{"id":"setup_test_repo/1","deprecated":false,"title":"setup_test_repo(tags)","anchor":"setup_test_repo/1"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"unlock/0","deprecated":false,"title":"unlock()","anchor":"unlock/0"},{"id":"unwatch_tests/0","deprecated":false,"title":"unwatch_tests()","anchor":"unwatch_tests/0"},{"id":"watch_tests/1","deprecated":false,"title":"watch_tests(args)","anchor":"watch_tests/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive.Helpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"f/1","deprecated":false,"title":"f(args \\\\ nil)","anchor":"f/1"},{"id":"ready/0","deprecated":false,"title":"ready()","anchor":"ready/0"},{"id":"s/1","deprecated":false,"title":"s(args \\\\ nil)","anchor":"s/1"},{"id":"ta/1","deprecated":false,"title":"ta(args \\\\ nil)","anchor":"ta/1"},{"id":"uw/0","deprecated":false,"title":"uw()","anchor":"uw/0"},{"id":"w/1","deprecated":false,"title":"w(args \\\\ nil)","anchor":"w/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive.Observer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive.Observer","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive.Observer","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Bonfire.Common.TestInstanceRepo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.TestInstanceRepo","sections":[],"nested_context":"Bonfire","nested_title":".Common.TestInstanceRepo","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":"apply/1","deprecated":false,"title":"apply(fun)","anchor":"apply/1"},{"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_endpoint/0","deprecated":false,"title":"default_endpoint()","anchor":"default_endpoint/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"default_repo/0","deprecated":false,"title":"default_repo()","anchor":"default_repo/0"},{"id":"default_repo_opts/0","deprecated":false,"title":"default_repo_opts()","anchor":"default_repo_opts/0"},{"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":"delete_many/1","deprecated":false,"title":"delete_many(query)","anchor":"delete_many/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":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"fetch/2","deprecated":false,"title":"fetch(queryable, id)","anchor":"fetch/2"},{"id":"fetch_all/2","deprecated":false,"title":"fetch_all(queryable, id_or_ids)","anchor":"fetch_all/2"},{"id":"fetch_by/2","deprecated":false,"title":"fetch_by(queryable, term)","anchor":"fetch_by/2"},{"id":"find/3","deprecated":false,"title":"find(q, changeset, field \\\\ :form)","anchor":"find/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_all_or_ignore/2","deprecated":false,"title":"insert_all_or_ignore(schema, data)","anchor":"insert_all_or_ignore/2"},{"id":"insert_or_ignore/1","deprecated":false,"title":"insert_or_ignore(cs_or_struct)","anchor":"insert_or_ignore/1"},{"id":"insert_or_ignore/2","deprecated":false,"title":"insert_or_ignore(schema, object)","anchor":"insert_or_ignore/2"},{"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":"make_subquery/1","deprecated":false,"title":"make_subquery(query)","anchor":"make_subquery/1"},{"id":"many/2","deprecated":false,"title":"many(query, opts \\\\ [])","anchor":"many/2"},{"id":"many_paginated/3","deprecated":false,"title":"many_paginated(queryable, opts \\\\ [], repo_opts \\\\ default_repo_opts())","anchor":"many_paginated/3"},{"id":"maybe_declare_test_instance/1","deprecated":false,"title":"maybe_declare_test_instance(v)","anchor":"maybe_declare_test_instance/1"},{"id":"maybe_one/2","deprecated":false,"title":"maybe_one(q, fallback \\\\ nil)","anchor":"maybe_one/2"},{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_where_ilike/5","deprecated":false,"title":"maybe_where_ilike(query, field, user_query, system_prefix \\\\ \"\", system_suffix \\\\ \"\")","anchor":"maybe_where_ilike/5"},{"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":"pluck/3","deprecated":false,"title":"pluck(query, fields, opts \\\\ [])","anchor":"pluck/3"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(obj, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(obj, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"process_put/1","deprecated":false,"title":"process_put(enum)","anchor":"process_put/1"},{"id":"put/1","deprecated":false,"title":"put(changeset)","anchor":"put/1"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"put_many/1","deprecated":false,"title":"put_many(things)","anchor":"put_many/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":"single/1","deprecated":false,"title":"single(q)","anchor":"single/1"},{"id":"sql/3","deprecated":false,"title":"sql(raw_sql, data \\\\ [], opts \\\\ [])","anchor":"sql/3"},{"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":"trace/1","deprecated":false,"title":"trace(fun)","anchor":"trace/1"},{"id":"transact_many/1","deprecated":false,"title":"transact_many(queries)","anchor":"transact_many/1"},{"id":"transact_with/2","deprecated":false,"title":"transact_with(fun, opts \\\\ [])","anchor":"transact_with/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"},{"id":"upsert/3","deprecated":false,"title":"upsert(cs, keys_or_attrs_to_update \\\\ nil, conflict_target \\\\ [:id])","anchor":"upsert/3"},{"id":"upsert_all/3","deprecated":false,"title":"upsert_all(schema, data, conflict_target \\\\ [:id])","anchor":"upsert_all/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Text","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Text","sections":[],"nested_context":"Bonfire","nested_title":".Common.Text","nodeGroups":[{"name":"Functions","nodes":[{"id":"blank?/1","deprecated":false,"title":"blank?(str_or_nil)","anchor":"blank?/1"},{"id":"camelise/1","deprecated":false,"title":"camelise(str)","anchor":"camelise/1"},{"id":"code_syntax/2","deprecated":false,"title":"code_syntax(text, filename)","anchor":"code_syntax/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(string, substring)","anchor":"contains?/2"},{"id":"contains_html?/1","deprecated":false,"title":"contains_html?(string)","anchor":"contains_html?/1"},{"id":"hash/2","deprecated":false,"title":"hash(seed, opts \\\\ [])","anchor":"hash/2"},{"id":"list_checkboxes/1","deprecated":false,"title":"list_checkboxes(text)","anchor":"list_checkboxes/1"},{"id":"list_checked_boxes/1","deprecated":false,"title":"list_checked_boxes(text)","anchor":"list_checked_boxes/1"},{"id":"list_unchecked_boxes/1","deprecated":false,"title":"list_unchecked_boxes(text)","anchor":"list_unchecked_boxes/1"},{"id":"make_local_links_live/1","deprecated":false,"title":"make_local_links_live(content)","anchor":"make_local_links_live/1"},{"id":"markdown_as_html_earmark/2","deprecated":false,"title":"markdown_as_html_earmark(content, opts)","anchor":"markdown_as_html_earmark/2"},{"id":"markdown_as_html_mdex/2","deprecated":false,"title":"markdown_as_html_mdex(content, opts)","anchor":"markdown_as_html_mdex/2"},{"id":"markdown_checkboxes/1","deprecated":false,"title":"markdown_checkboxes(text)","anchor":"markdown_checkboxes/1"},{"id":"maybe_emote/3","deprecated":false,"title":"maybe_emote(content, user \\\\ nil, custom_emoji \\\\ [])","anchor":"maybe_emote/3"},{"id":"maybe_markdown_to_html/2","deprecated":false,"title":"maybe_markdown_to_html(nothing, opts \\\\ [])","anchor":"maybe_markdown_to_html/2"},{"id":"maybe_normalize_html/1","deprecated":false,"title":"maybe_normalize_html(html_string)","anchor":"maybe_normalize_html/1"},{"id":"maybe_other_custom_emoji/2","deprecated":false,"title":"maybe_other_custom_emoji(text, user)","anchor":"maybe_other_custom_emoji/2"},{"id":"maybe_render_templated/2","deprecated":false,"title":"maybe_render_templated(templated_content, data)","anchor":"maybe_render_templated/2"},{"id":"maybe_sane_html/1","deprecated":false,"title":"maybe_sane_html(content)","anchor":"maybe_sane_html/1"},{"id":"maybe_to_snake/1","deprecated":false,"title":"maybe_to_snake(string)","anchor":"maybe_to_snake/1"},{"id":"normalise_links/2","deprecated":false,"title":"normalise_links(content, format \\\\ :markdown)","anchor":"normalise_links/2"},{"id":"random_string/1","deprecated":false,"title":"random_string(length \\\\ 10)","anchor":"random_string/1"},{"id":"regex_list/2","deprecated":false,"title":"regex_list(regex, text)","anchor":"regex_list/2"},{"id":"sentence_truncate/3","deprecated":false,"title":"sentence_truncate(input, length \\\\ 250, add_to_end \\\\ \"\")","anchor":"sentence_truncate/3"},{"id":"slug/1","deprecated":false,"title":"slug(text)","anchor":"slug/1"},{"id":"split_lines/1","deprecated":false,"title":"split_lines(string)","anchor":"split_lines/1"},{"id":"strlen/1","deprecated":false,"title":"strlen(x)","anchor":"strlen/1"},{"id":"text_only/1","deprecated":false,"title":"text_only(content)","anchor":"text_only/1"},{"id":"truncate/3","deprecated":false,"title":"truncate(text, max_length \\\\ 250, add_to_end \\\\ nil)","anchor":"truncate/3"},{"id":"underscore_truncate/2","deprecated":false,"title":"underscore_truncate(input, length \\\\ 250)","anchor":"underscore_truncate/2"},{"id":"upcase_first/1","deprecated":false,"title":"upcase_first(arg)","anchor":"upcase_first/1"},{"id":"verb_infinitive/1","deprecated":false,"title":"verb_infinitive(verb_conjugated)","anchor":"verb_infinitive/1"}],"key":"functions"}]},{"id":"Bonfire.Common.TextExtended","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.TextExtended","sections":[],"nested_context":"Bonfire","nested_title":".Common.TextExtended","nodeGroups":[{"name":"Functions","nodes":[{"id":"blank?/1","deprecated":false,"title":"blank?(xA)","anchor":"blank?/1"},{"id":"camelise/1","deprecated":false,"title":"camelise(xA)","anchor":"camelise/1"},{"id":"code_syntax/2","deprecated":false,"title":"code_syntax(xA, xB)","anchor":"code_syntax/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(xA, xB)","anchor":"contains?/2"},{"id":"contains_html?/1","deprecated":false,"title":"contains_html?(xA)","anchor":"contains_html?/1"},{"id":"hash/1","deprecated":false,"title":"hash(xA)","anchor":"hash/1"},{"id":"hash/2","deprecated":false,"title":"hash(xA, xB)","anchor":"hash/2"},{"id":"list_checkboxes/1","deprecated":false,"title":"list_checkboxes(xA)","anchor":"list_checkboxes/1"},{"id":"list_checked_boxes/1","deprecated":false,"title":"list_checked_boxes(xA)","anchor":"list_checked_boxes/1"},{"id":"list_unchecked_boxes/1","deprecated":false,"title":"list_unchecked_boxes(xA)","anchor":"list_unchecked_boxes/1"},{"id":"make_local_links_live/1","deprecated":false,"title":"make_local_links_live(xA)","anchor":"make_local_links_live/1"},{"id":"markdown_as_html_earmark/2","deprecated":false,"title":"markdown_as_html_earmark(xA, xB)","anchor":"markdown_as_html_earmark/2"},{"id":"markdown_as_html_mdex/2","deprecated":false,"title":"markdown_as_html_mdex(xA, xB)","anchor":"markdown_as_html_mdex/2"},{"id":"markdown_checkboxes/1","deprecated":false,"title":"markdown_checkboxes(xA)","anchor":"markdown_checkboxes/1"},{"id":"maybe_emote/1","deprecated":false,"title":"maybe_emote(xA)","anchor":"maybe_emote/1"},{"id":"maybe_emote/2","deprecated":false,"title":"maybe_emote(xA, xB)","anchor":"maybe_emote/2"},{"id":"maybe_emote/3","deprecated":false,"title":"maybe_emote(xA, xB, xC)","anchor":"maybe_emote/3"},{"id":"maybe_markdown_to_html/1","deprecated":false,"title":"maybe_markdown_to_html(xA)","anchor":"maybe_markdown_to_html/1"},{"id":"maybe_markdown_to_html/2","deprecated":false,"title":"maybe_markdown_to_html(xA, xB)","anchor":"maybe_markdown_to_html/2"},{"id":"maybe_normalize_html/1","deprecated":false,"title":"maybe_normalize_html(xA)","anchor":"maybe_normalize_html/1"},{"id":"maybe_other_custom_emoji/2","deprecated":false,"title":"maybe_other_custom_emoji(xA, xB)","anchor":"maybe_other_custom_emoji/2"},{"id":"maybe_render_templated/2","deprecated":false,"title":"maybe_render_templated(xA, xB)","anchor":"maybe_render_templated/2"},{"id":"maybe_sane_html/1","deprecated":false,"title":"maybe_sane_html(xA)","anchor":"maybe_sane_html/1"},{"id":"maybe_to_snake/1","deprecated":false,"title":"maybe_to_snake(xA)","anchor":"maybe_to_snake/1"},{"id":"normalise_links/1","deprecated":false,"title":"normalise_links(xA)","anchor":"normalise_links/1"},{"id":"normalise_links/2","deprecated":false,"title":"normalise_links(xA, xB)","anchor":"normalise_links/2"},{"id":"random_string/0","deprecated":false,"title":"random_string()","anchor":"random_string/0"},{"id":"random_string/1","deprecated":false,"title":"random_string(xA)","anchor":"random_string/1"},{"id":"regex_list/2","deprecated":false,"title":"regex_list(xA, xB)","anchor":"regex_list/2"},{"id":"sentence_truncate/1","deprecated":false,"title":"sentence_truncate(xA)","anchor":"sentence_truncate/1"},{"id":"sentence_truncate/2","deprecated":false,"title":"sentence_truncate(xA, xB)","anchor":"sentence_truncate/2"},{"id":"sentence_truncate/3","deprecated":false,"title":"sentence_truncate(xA, xB, xC)","anchor":"sentence_truncate/3"},{"id":"slug/1","deprecated":false,"title":"slug(xA)","anchor":"slug/1"},{"id":"split_lines/1","deprecated":false,"title":"split_lines(xA)","anchor":"split_lines/1"},{"id":"strlen/1","deprecated":false,"title":"strlen(xA)","anchor":"strlen/1"},{"id":"text_only/1","deprecated":false,"title":"text_only(xA)","anchor":"text_only/1"},{"id":"truncate/1","deprecated":false,"title":"truncate(xA)","anchor":"truncate/1"},{"id":"truncate/2","deprecated":false,"title":"truncate(xA, xB)","anchor":"truncate/2"},{"id":"truncate/3","deprecated":false,"title":"truncate(xA, xB, xC)","anchor":"truncate/3"},{"id":"underscore_truncate/1","deprecated":false,"title":"underscore_truncate(xA)","anchor":"underscore_truncate/1"},{"id":"underscore_truncate/2","deprecated":false,"title":"underscore_truncate(xA, xB)","anchor":"underscore_truncate/2"},{"id":"upcase_first/1","deprecated":false,"title":"upcase_first(xA)","anchor":"upcase_first/1"},{"id":"verb_infinitive/1","deprecated":false,"title":"verb_infinitive(xA)","anchor":"verb_infinitive/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Types","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Types","sections":[],"nested_context":"Bonfire","nested_title":".Common.Types","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_object_type_names/0","deprecated":false,"title":"all_object_type_names()","anchor":"all_object_type_names/0"},{"id":"defines_struct?/1","deprecated":false,"title":"defines_struct?(module)","anchor":"defines_struct?/1"},{"id":"is_numeric/1","deprecated":false,"title":"is_numeric(num)","anchor":"is_numeric/1"},{"id":"is_uid?/2","deprecated":false,"title":"is_uid?(str, params \\\\ nil)","anchor":"is_uid?/2"},{"id":"maybe_convert_ulids/1","deprecated":false,"title":"maybe_convert_ulids(list)","anchor":"maybe_convert_ulids/1"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"},{"id":"maybe_to_atom!/1","deprecated":false,"title":"maybe_to_atom!(str)","anchor":"maybe_to_atom!/1"},{"id":"maybe_to_atom_or_module/3","deprecated":false,"title":"maybe_to_atom_or_module(k, force, to_snake)","anchor":"maybe_to_atom_or_module/3"},{"id":"maybe_to_float/2","deprecated":false,"title":"maybe_to_float(val, fallback \\\\ 0)","anchor":"maybe_to_float/2"},{"id":"maybe_to_integer/2","deprecated":false,"title":"maybe_to_integer(val, fallback \\\\ 0)","anchor":"maybe_to_integer/2"},{"id":"maybe_to_module/2","deprecated":false,"title":"maybe_to_module(str, force \\\\ true)","anchor":"maybe_to_module/2"},{"id":"maybe_to_snake_atom/1","deprecated":false,"title":"maybe_to_snake_atom(string)","anchor":"maybe_to_snake_atom/1"},{"id":"maybe_to_string/1","deprecated":false,"title":"maybe_to_string(atom)","anchor":"maybe_to_string/1"},{"id":"module_to_human_readable/1","deprecated":false,"title":"module_to_human_readable(module)","anchor":"module_to_human_readable/1"},{"id":"module_to_str/1","deprecated":false,"title":"module_to_str(str)","anchor":"module_to_str/1"},{"id":"object_type/1","deprecated":false,"title":"object_type(object)","anchor":"object_type/1"},{"id":"object_type_display/1","deprecated":false,"title":"object_type_display(object_type)","anchor":"object_type_display/1"},{"id":"sanitise_name/1","deprecated":false,"title":"sanitise_name(type)","anchor":"sanitise_name/1"},{"id":"table_id/1","deprecated":false,"title":"table_id(schema)","anchor":"table_id/1"},{"id":"table_type/1","deprecated":false,"title":"table_type(type)","anchor":"table_type/1"},{"id":"table_types/1","deprecated":false,"title":"table_types(types)","anchor":"table_types/1"},{"id":"typeof/1","deprecated":false,"title":"typeof(exception)","anchor":"typeof/1"},{"id":"uid/2","deprecated":false,"title":"uid(input, fallback \\\\ nil)","anchor":"uid/2"},{"id":"uid!/1","deprecated":false,"title":"uid!(object)","anchor":"uid!/1"},{"id":"uid_or_uids/1","deprecated":false,"title":"uid_or_uids(objects)","anchor":"uid_or_uids/1"},{"id":"uids/1","deprecated":false,"title":"uids(objects)","anchor":"uids/1"},{"id":"uids_or/2","deprecated":false,"title":"uids_or(objects, fallback_or_fun)","anchor":"uids_or/2"}],"key":"functions"}]},{"id":"Bonfire.Common.URIs","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.URIs","sections":[],"nested_context":"Bonfire","nested_title":".Common.URIs","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_domain/1","deprecated":false,"title":"base_domain(uri_or_endpoint_or_conn \\\\ nil)","anchor":"base_domain/1"},{"id":"base_uri/1","deprecated":false,"title":"base_uri(conn_or_socket \\\\ nil)","anchor":"base_uri/1"},{"id":"base_url/1","deprecated":false,"title":"base_url(conn_or_socket_or_uri \\\\ nil)","anchor":"base_url/1"},{"id":"based_url/2","deprecated":false,"title":"based_url(url, conn \\\\ nil)","anchor":"based_url/2"},{"id":"canonical_url/1","deprecated":false,"title":"canonical_url(object)","anchor":"canonical_url/1"},{"id":"display_url/1","deprecated":false,"title":"display_url(url)","anchor":"display_url/1"},{"id":"fallback/1","deprecated":false,"title":"fallback(args)","anchor":"fallback/1"},{"id":"fallback/2","deprecated":false,"title":"fallback(id, args)","anchor":"fallback/2"},{"id":"fallback/3","deprecated":false,"title":"fallback(id, type, args)","anchor":"fallback/3"},{"id":"is_uri?/1","deprecated":false,"title":"is_uri?(str)","anchor":"is_uri?/1"},{"id":"maybe_generate_canonical_url/1","deprecated":false,"title":"maybe_generate_canonical_url(thing)","anchor":"maybe_generate_canonical_url/1"},{"id":"path/3","deprecated":false,"title":"path(view_module_or_path_name_or_object, args \\\\ [], opts \\\\ [])","anchor":"path/3"},{"id":"path_by_id/4","deprecated":false,"title":"path_by_id(id, args, object, opts)","anchor":"path_by_id/4"},{"id":"remote_canonical_url/1","deprecated":false,"title":"remote_canonical_url(object)","anchor":"remote_canonical_url/1"},{"id":"static_path/2","deprecated":false,"title":"static_path(path, endpoint_module \\\\ Bonfire.Common.Config.endpoint_module())","anchor":"static_path/2"},{"id":"url_path/2","deprecated":false,"title":"url_path(view_module_or_path_name_or_object, args \\\\ [])","anchor":"url_path/2"},{"id":"validate_uri/1","deprecated":false,"title":"validate_uri(str)","anchor":"validate_uri/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Utils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Utils","sections":[],"nested_context":"Bonfire","nested_title":".Common.Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_error/3","deprecated":false,"title":"apply_error(error, args, opts)","anchor":"apply_error/3"},{"id":"apply_task/3","deprecated":false,"title":"apply_task(function \\\\ :async, fun, opts \\\\ [])","anchor":"apply_task/3"},{"id":"apply_task_supervised/3","deprecated":false,"title":"apply_task_supervised(supervisor, fun, opts \\\\ [])","anchor":"apply_task_supervised/3"},{"id":"current_account/2","deprecated":false,"title":"current_account(current_account_or_socket_or_opts, recursing \\\\ false)","anchor":"current_account/2"},{"id":"current_account_and_or_user_ids/1","deprecated":false,"title":"current_account_and_or_user_ids(assigns)","anchor":"current_account_and_or_user_ids/1"},{"id":"current_account_auth!/2","deprecated":false,"title":"current_account_auth!(context, password)","anchor":"current_account_auth!/2"},{"id":"current_account_id/2","deprecated":false,"title":"current_account_id(current_account_or_socket_or_opts, recursing \\\\ false)","anchor":"current_account_id/2"},{"id":"current_user/2","deprecated":false,"title":"current_user(current_user_or_socket_or_opts, recursing \\\\ false)","anchor":"current_user/2"},{"id":"current_user_auth!/2","deprecated":false,"title":"current_user_auth!(context, password)","anchor":"current_user_auth!/2"},{"id":"current_user_id/2","deprecated":false,"title":"current_user_id(current_user_or_socket_or_opts, recursing \\\\ false)","anchor":"current_user_id/2"},{"id":"current_user_required!/1","deprecated":false,"title":"current_user_required!(context)","anchor":"current_user_required!/1"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"empty?/1","deprecated":false,"title":"empty?(v)","anchor":"empty?/1"},{"id":"maybe/2","deprecated":false,"title":"maybe(val, change_fn)","anchor":"maybe/2"},{"id":"maybe_apply/4","deprecated":false,"title":"maybe_apply(module, fun, args \\\\ [], opts \\\\ [])","anchor":"maybe_apply/4"},{"id":"maybe_apply_fallback/3","deprecated":false,"title":"maybe_apply_fallback(error, args, opts)","anchor":"maybe_apply_fallback/3"},{"id":"maybe_from_opts/3","deprecated":false,"title":"maybe_from_opts(opts, key, fallback \\\\ nil)","anchor":"maybe_from_opts/3"},{"id":"nothing?/1","deprecated":false,"title":"nothing?(v)","anchor":"nothing?/1"},{"id":"ok_unwrap/2","deprecated":false,"title":"ok_unwrap(val, fallback \\\\ nil)","anchor":"ok_unwrap/2"},{"id":"round_nearest/1","deprecated":false,"title":"round_nearest(num)","anchor":"round_nearest/1"},{"id":"round_nearest/2","deprecated":false,"title":"round_nearest(num, target)","anchor":"round_nearest/2"},{"id":"to_options/1","deprecated":false,"title":"to_options(user_or_socket_or_opts)","anchor":"to_options/1"}],"key":"functions"}]},{"id":"Bonfire.Ecto","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto","sections":[{"id":"Introduction","anchor":"module-introduction"}],"nested_context":"Bonfire","nested_title":".Ecto"},{"id":"Bonfire.Ecto.Acts.Begin","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Begin","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Begin","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Commit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Commit","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Commit","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Delete","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_delete/2","deprecated":false,"title":"maybe_delete(objects, repo)","anchor":"maybe_delete/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Work","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Work","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Work","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/2","deprecated":false,"title":"add(epic, key)","anchor":"add/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Epics","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics","sections":[{"id":"Key components and concepts:","anchor":"module-key-components-and-concepts"},{"id":"How it works","anchor":"module-how-it-works"},{"id":"1. How to write an Act","anchor":"module-1-how-to-write-an-act"},{"id":"2. How to define an Epic","anchor":"module-2-how-to-define-an-epic"},{"id":"3. How to run an Epic","anchor":"module-3-how-to-run-an-epic"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Epics","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_debug/3","deprecated":false,"title":"maybe_debug(act_or_epic, thing, label \\\\ nil)","anchor":"maybe_debug/3"},{"id":"maybe_debug/4","deprecated":false,"title":"maybe_debug(epic, act, thing, label)","anchor":"maybe_debug/4"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(config_key, type, options \\\\ [])","anchor":"run_epic/3"},{"id":"smart/4","deprecated":false,"title":"smart(epic, act, thing, label \\\\ \"\")","anchor":"smart/4"}],"key":"functions"}]},{"id":"Bonfire.Epics.Act","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Act","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Act","nodeGroups":[{"name":"Types","nodes":[{"id":"ret/0","deprecated":false,"title":"ret()","anchor":"t:ret/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"run/2","deprecated":false,"title":"run(t, t)","anchor":"c:run/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"debug/3","deprecated":false,"title":"debug(act, thing, label \\\\ \"\")","anchor":"debug/3"},{"id":"new/1","deprecated":false,"title":"new(module)","anchor":"new/1"},{"id":"new/2","deprecated":false,"title":"new(module, options)","anchor":"new/2"},{"id":"new/3","deprecated":false,"title":"new(module, options, meta)","anchor":"new/3"}],"key":"functions"}]},{"id":"Bonfire.Epics.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Debug","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_maybe_debug/4","deprecated":false,"title":"do_maybe_debug(epic, act, thing, label)","anchor":"do_maybe_debug/4"},{"id":"opts/2","deprecated":false,"title":"opts(epic, act)","anchor":"opts/2"}],"key":"functions"}]},{"id":"Bonfire.Epics.Epic","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Epic","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Epic","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"add_error/2","deprecated":false,"title":"add_error(epic, error)","anchor":"add_error/2"},{"id":"add_error/5","deprecated":false,"title":"add_error(epic, act, error, source \\\\ nil, stacktrace \\\\ nil)","anchor":"add_error/5"},{"id":"append/2","deprecated":false,"title":"append(self, acts)","anchor":"append/2"},{"id":"assign/3","deprecated":false,"title":"assign(self, name, value)","anchor":"assign/3"},{"id":"debug/3","deprecated":false,"title":"debug(epic, thing, label \\\\ \"\")","anchor":"debug/3"},{"id":"from_config!/2","deprecated":false,"title":"from_config!(config_key, name)","anchor":"from_config!/2"},{"id":"from_spec!/1","deprecated":false,"title":"from_spec!(acts)","anchor":"from_spec!/1"},{"id":"maybe_debug/3","deprecated":false,"title":"maybe_debug(epic, thing, label \\\\ \"\")","anchor":"maybe_debug/3"},{"id":"new/1","deprecated":false,"title":"new(next \\\\ [])","anchor":"new/1"},{"id":"prepend/2","deprecated":false,"title":"prepend(self, acts)","anchor":"prepend/2"},{"id":"render_errors/1","deprecated":false,"title":"render_errors(epic)","anchor":"render_errors/1"},{"id":"run/1","deprecated":false,"title":"run(epic)","anchor":"run/1"},{"id":"update/4","deprecated":false,"title":"update(self, name, default, fun)","anchor":"update/4"}],"key":"functions"}]},{"id":"Bonfire.Epics.Error","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Error","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Error","nodeGroups":[{"name":"Functions","nodes":[{"id":"message/1","deprecated":false,"title":"message(self)","anchor":"message/1"}],"key":"functions"}]},{"id":"Bonfire.Epics.Test","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Test","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Test","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_epic_ok/1","deprecated":false,"title":"assert_epic_ok(expr)","anchor":"assert_epic_ok/1"},{"id":"debug_error/1","deprecated":false,"title":"debug_error(epic)","anchor":"debug_error/1"}],"key":"functions"}]},{"id":"Bonfire.Files","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files","sections":[{"id":"Configuration","anchor":"module-configuration"},{"id":"TODO's","anchor":"module-todo-s"}],"nested_context":"Bonfire","nested_title":".Files","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/1","deprecated":false,"title":"ap_publish_activity(medias)","anchor":"ap_publish_activity/1"},{"id":"ap_receive_attachments/2","deprecated":false,"title":"ap_receive_attachments(creator, attachments)","anchor":"ap_receive_attachments/2"},{"id":"data_url/2","deprecated":false,"title":"data_url(content, mime_type)","anchor":"data_url/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"delete_files/3","deprecated":false,"title":"delete_files(module \\\\ nil, media, opts \\\\ [])","anchor":"delete_files/3"},{"id":"extract_metadata/1","deprecated":false,"title":"extract_metadata(path)","anchor":"extract_metadata/1"},{"id":"file_extension/1","deprecated":false,"title":"file_extension(path)","anchor":"file_extension/1"},{"id":"file_extension_only/1","deprecated":false,"title":"file_extension_only(path)","anchor":"file_extension_only/1"},{"id":"full_url/3","deprecated":false,"title":"full_url(module, media, version \\\\ nil)","anchor":"full_url/3"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"local_path/3","deprecated":false,"title":"local_path(module \\\\ nil, media, version \\\\ :default)","anchor":"local_path/3"},{"id":"normalise_size/2","deprecated":false,"title":"normalise_size(size, default \\\\ 8)","anchor":"normalise_size/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"remote_url/3","deprecated":false,"title":"remote_url(module \\\\ nil, media, version \\\\ :default)","anchor":"remote_url/3"},{"id":"upload/5","deprecated":false,"title":"upload(module, creator_or_context, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/5"},{"id":"validate/3","deprecated":false,"title":"validate(other, allowed_media_types, max_file_size)","anchor":"validate/3"}],"key":"functions"}]},{"id":"Bonfire.Files.Acts.AttachMedia","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.AttachMedia","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.AttachMedia","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(changeset, uploaded_media)","anchor":"cast/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Acts.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.Delete"},{"id":"Bonfire.Files.Acts.URLPreviews","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.URLPreviews","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.URLPreviews","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_fetch_and_save/3","deprecated":false,"title":"maybe_fetch_and_save(current_user, url, opts \\\\ [])","anchor":"maybe_fetch_and_save/3"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Files.BannerUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.BannerUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.BannerUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_height/0","deprecated":false,"title":"max_height()","anchor":"max_height/0"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.Blurred","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Blurred","sections":[],"nested_context":"Bonfire","nested_title":".Files.Blurred","nodeGroups":[{"name":"Functions","nodes":[{"id":"blurhash/2","deprecated":false,"title":"blurhash(media, opts \\\\ [])","anchor":"blurhash/2"},{"id":"blurhash_cached/1","deprecated":false,"title":"blurhash_cached(arg1)","anchor":"blurhash_cached/1"},{"id":"blurred/2","deprecated":false,"title":"blurred(media_or_path, opts \\\\ [])","anchor":"blurred/2"},{"id":"make_blurhash/1","deprecated":false,"title":"make_blurhash(path)","anchor":"make_blurhash/1"}],"key":"functions"}]},{"id":"Bonfire.Files.CapsuleIntegration.Attacher","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.CapsuleIntegration.Attacher","sections":[],"nested_context":"Bonfire","nested_title":".Files.CapsuleIntegration.Attacher","nodeGroups":[{"name":"Functions","nodes":[{"id":"attach/3","deprecated":false,"title":"attach(upload, changeset, module \\\\ nil)","anchor":"attach/3"},{"id":"storages/2","deprecated":false,"title":"storages(upload, module)","anchor":"storages/2"},{"id":"store/3","deprecated":false,"title":"store(module, upload, changeset)","anchor":"store/3"},{"id":"upload/3","deprecated":false,"title":"upload(changeset, field, attrs)","anchor":"upload/3"}],"key":"functions"}]},{"id":"Bonfire.Files.DOI","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.DOI","sections":[],"nested_context":"Bonfire","nested_title":".Files.DOI","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","deprecated":false,"title":"fetch(url, opts \\\\ [])","anchor":"fetch/2"},{"id":"fetch_crossref/1","deprecated":false,"title":"fetch_crossref(url)","anchor":"fetch_crossref/1"},{"id":"is_doi?/1","deprecated":false,"title":"is_doi?(url)","anchor":"is_doi?/1"},{"id":"is_pub_id_or_uri_match?/1","deprecated":false,"title":"is_pub_id_or_uri_match?(url)","anchor":"is_pub_id_or_uri_match?/1"},{"id":"maybe_fetch/1","deprecated":false,"title":"maybe_fetch(url)","anchor":"maybe_fetch/1"},{"id":"pub_id_and_uri_matchers/0","deprecated":false,"title":"pub_id_and_uri_matchers()","anchor":"pub_id_and_uri_matchers/0"},{"id":"pub_id_matcher/1","deprecated":false,"title":"pub_id_matcher(type)","anchor":"pub_id_matcher/1"},{"id":"pub_id_matchers/0","deprecated":false,"title":"pub_id_matchers()","anchor":"pub_id_matchers/0"},{"id":"pub_uri_matchers/0","deprecated":false,"title":"pub_uri_matchers()","anchor":"pub_uri_matchers/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Definition","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Definition","sections":[],"nested_context":"Bonfire","nested_title":".Files.Definition","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"allowed_media_types/0","deprecated":false,"title":"allowed_media_types()","anchor":"c:allowed_media_types/0"},{"id":"max_file_size/0","deprecated":false,"title":"max_file_size()","anchor":"c:max_file_size/0"}],"key":"callbacks"}]},{"id":"Bonfire.Files.DocumentUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.DocumentUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.DocumentUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.EmojiUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.EmojiUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.EmojiUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"add_emoji/4","deprecated":false,"title":"add_emoji(user, file, label, shortcode)","anchor":"add_emoji/4"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"list/1","deprecated":false,"title":"list(scope)","anchor":"list/1"},{"id":"media_put_setting/3","deprecated":false,"title":"media_put_setting(media, metadata, opts)","anchor":"media_put_setting/3"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"prepare_meta/2","deprecated":false,"title":"prepare_meta(label, shortcode)","anchor":"prepare_meta/2"},{"id":"prepare_setting/1","deprecated":false,"title":"prepare_setting(map)","anchor":"prepare_setting/1"},{"id":"put_setting/3","deprecated":false,"title":"put_setting(metadata, setting, opts)","anchor":"put_setting/3"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(_, _)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.FaviconStore","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.FaviconStore","sections":[],"nested_context":"Bonfire","nested_title":".Files.FaviconStore","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"cached_or_async_fetch_url/2","deprecated":false,"title":"cached_or_async_fetch_url(url, opts \\\\ [])","anchor":"cached_or_async_fetch_url/2"},{"id":"cached_or_fetch/2","deprecated":false,"title":"cached_or_fetch(url, opts \\\\ [])","anchor":"cached_or_fetch/2"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"favicon_url/2","deprecated":false,"title":"favicon_url(url, opts \\\\ [])","anchor":"favicon_url/2"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(_, _)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.FileDenied","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.FileDenied","sections":[],"nested_context":"Bonfire","nested_title":".Files.FileDenied","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(size)","anchor":"new/1"}],"key":"functions"}]},{"id":"Bonfire.Files.IconUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.IconUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.IconUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.ImageUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.ImageUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.ImageUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Files.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"handle_progress/3","deprecated":false,"title":"handle_progress(type, entry, socket)","anchor":"handle_progress/3"},{"id":"set_fallback/5","deprecated":false,"title":"set_fallback(_, _, _, _, socket)","anchor":"set_fallback/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Media","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Media","sections":[],"nested_context":"Bonfire","nested_title":".Files.Media","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, media)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"description/1","deprecated":false,"title":"description(media)","anchor":"description/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"get_by_path/1","deprecated":false,"title":"get_by_path(url)","anchor":"get_by_path/1"},{"id":"hard_delete/2","deprecated":false,"title":"hard_delete(module \\\\ nil, media)","anchor":"hard_delete/2"},{"id":"insert/4","deprecated":false,"title":"insert(creator, file, file_info, attrs)","anchor":"insert/4"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"media_label/1","deprecated":false,"title":"media_label(media)","anchor":"media_label/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(media)","anchor":"soft_delete/1"},{"id":"unwrap/1","deprecated":false,"title":"unwrap(list)","anchor":"unwrap/1"},{"id":"update/3","deprecated":false,"title":"update(user \\\\ nil, media, updates)","anchor":"update/3"},{"id":"update_by/2","deprecated":false,"title":"update_by(filters, updates)","anchor":"update_by/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Media.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Media.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Files.Media.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(query, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Files.MediaEdit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.MediaEdit","sections":[],"nested_context":"Bonfire","nested_title":".Files.MediaEdit","nodeGroups":[{"name":"Functions","nodes":[{"id":"banner/3","deprecated":false,"title":"banner(filename, max_width, max_height)","anchor":"banner/3"},{"id":"blur/2","deprecated":false,"title":"blur(path, final_path)","anchor":"blur/2"},{"id":"dominant_color/3","deprecated":false,"title":"dominant_color(file_path_or_binary_or_stream, bins \\\\ 15, fallback \\\\ \"#FFF8E7\")","anchor":"dominant_color/3"},{"id":"frame_to_scrub/3","deprecated":false,"title":"frame_to_scrub(fps, frame_count, scrub_opts)","anchor":"frame_to_scrub/3"},{"id":"image/3","deprecated":false,"title":"image(filename, max_width, max_height)","anchor":"image/3"},{"id":"image_resize_thumbnail/4","deprecated":false,"title":"image_resize_thumbnail(image, max_size, waffle_file \\\\ %Waffle.File{}, tmp_path \\\\ nil)","anchor":"image_resize_thumbnail/4"},{"id":"image_save_temp_file/3","deprecated":false,"title":"image_save_temp_file(image, waffle_file \\\\ %Waffle.File{}, tmp_path \\\\ nil)","anchor":"image_save_temp_file/3"},{"id":"thumbnail/2","deprecated":false,"title":"thumbnail(filename, max_size)","anchor":"thumbnail/2"},{"id":"thumbnail_pdf/1","deprecated":false,"title":"thumbnail_pdf(filename)","anchor":"thumbnail_pdf/1"},{"id":"thumbnail_video/3","deprecated":false,"title":"thumbnail_video(filename, max_size, scrub_opts)","anchor":"thumbnail_video/3"},{"id":"video_convert/1","deprecated":false,"title":"video_convert(filename)","anchor":"video_convert/1"},{"id":"video_image_thumbnail/4","deprecated":false,"title":"video_image_thumbnail(filename, max_size, scrub_opts, waffle_file \\\\ %Waffle.File{})","anchor":"video_image_thumbnail/4"}],"key":"functions"}]},{"id":"Bonfire.Files.MimeTypes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.MimeTypes","sections":[],"nested_context":"Bonfire","nested_title":".Files.MimeTypes","nodeGroups":[{"name":"Functions","nodes":[{"id":"extra_media/0","deprecated":false,"title":"extra_media()","anchor":"extra_media/0"},{"id":"image_media/0","deprecated":false,"title":"image_media()","anchor":"image_media/0"},{"id":"supported_media/0","deprecated":false,"title":"supported_media()","anchor":"supported_media/0"},{"id":"unique_extension_for_mime/0","deprecated":false,"title":"unique_extension_for_mime()","anchor":"unique_extension_for_mime/0"},{"id":"video_media/0","deprecated":false,"title":"video_media()","anchor":"video_media/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Prepare","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Prepare","sections":[],"nested_context":"Bonfire","nested_title":".Files.Prepare","nodeGroups":[{"name":"Functions","nodes":[{"id":"prepare/2","deprecated":false,"title":"prepare(definition, filepath)","anchor":"prepare/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Queues.VideoTranscode","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Queues.VideoTranscode","sections":[],"nested_context":"Bonfire","nested_title":".Files.Queues.VideoTranscode","nodeGroups":[{"name":"Functions","nodes":[{"id":"transcode/1","deprecated":false,"title":"transcode(job)","anchor":"transcode/1"}],"key":"functions"}]},{"id":"Bonfire.Files.ResponsiveImage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.ResponsiveImage","sections":[],"nested_context":"Bonfire","nested_title":".Files.ResponsiveImage","nodeGroups":[{"name":"Functions","nodes":[{"id":"compile_src/2","deprecated":false,"title":"compile_src(path, width)","anchor":"compile_src/2"},{"id":"compile_srcset/2","deprecated":false,"title":"compile_srcset(path, widths)","anchor":"compile_srcset/2"},{"id":"resize/1","deprecated":false,"title":"resize(attr)","anchor":"resize/1"},{"id":"resize/2","deprecated":false,"title":"resize(path, width)","anchor":"resize/2"},{"id":"resize_timed/1","deprecated":false,"title":"resize_timed(images)","anchor":"resize_timed/1"},{"id":"src/2","deprecated":false,"title":"src(path, width)","anchor":"src/2"},{"id":"srcset/2","deprecated":false,"title":"srcset(path, widths)","anchor":"srcset/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Files.Routes"},{"id":"Bonfire.Files.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Files.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Simulation","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Simulation","sections":[],"nested_context":"Bonfire","nested_title":".Files.Simulation","nodeGroups":[{"name":"Functions","nodes":[{"id":"cleanup/1","deprecated":false,"title":"cleanup(path)","anchor":"cleanup/1"},{"id":"fake_upload/2","deprecated":false,"title":"fake_upload(file, upload_def \\\\ nil)","anchor":"fake_upload/2"},{"id":"geometry/1","deprecated":false,"title":"geometry(path)","anchor":"geometry/1"},{"id":"icon_file/0","deprecated":false,"title":"icon_file()","anchor":"icon_file/0"},{"id":"image_file/0","deprecated":false,"title":"image_file()","anchor":"image_file/0"},{"id":"pdf_file/0","deprecated":false,"title":"pdf_file()","anchor":"pdf_file/0"},{"id":"text_file/0","deprecated":false,"title":"text_file()","anchor":"text_file/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Versions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Versions","sections":[],"nested_context":"Bonfire","nested_title":".Files.Versions"},{"id":"Bonfire.Files.VideoUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.VideoUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.VideoUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_height/0","deprecated":false,"title":"max_height()","anchor":"max_height/0"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"transform_timeout/0","deprecated":false,"title":"transform_timeout()","anchor":"transform_timeout/0"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Mailer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer","sections":[{"id":"Before You Begin","anchor":"module-before-you-begin"},{"id":"Choosing an Email Delivery Method","anchor":"module-choosing-an-email-delivery-method"},{"id":"1. Default Behaviour: Direct SMTP Delivery","anchor":"module-1-default-behaviour-direct-smtp-delivery"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Mailer","nodeGroups":[{"name":"Functions","nodes":[{"id":"app_name/0","deprecated":false,"title":"app_name()","anchor":"app_name/0"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/1"},{"id":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"handle_error/2","deprecated":false,"title":"handle_error(error, stacktrace \\\\ nil)","anchor":"handle_error/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"send/4","deprecated":false,"title":"send(email, to, mode \\\\ :async, opts \\\\ [])","anchor":"send/4"},{"id":"send_app_feedback/3","deprecated":false,"title":"send_app_feedback(subject, body, opts \\\\ [])","anchor":"send_app_feedback/3"},{"id":"send_async/3","deprecated":false,"title":"send_async(email, to, opts \\\\ [])","anchor":"send_async/3"},{"id":"send_now/3","deprecated":false,"title":"send_now(email, to, opts \\\\ [])","anchor":"send_now/3"},{"id":"start/2","deprecated":false,"title":"start(_, _)","anchor":"start/2"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Bamboo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Bamboo","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Bamboo","nodeGroups":[{"name":"Functions","nodes":[{"id":"deliver/1","deprecated":false,"title":"deliver(email)","anchor":"deliver/1"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/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":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Behaviour","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Behaviour","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Behaviour","nodeGroups":[{"name":"Types","nodes":[{"id":"email/0","deprecated":false,"title":"email()","anchor":"t:email/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"c:deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"c:deliver_inline/1"},{"id":"from/2","deprecated":false,"title":"from(email, arg2)","anchor":"c:from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, t)","anchor":"c:html_body/2"},{"id":"new/0","deprecated":false,"title":"new()","anchor":"c:new/0"},{"id":"new/1","deprecated":false,"title":"new(term)","anchor":"c:new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, t)","anchor":"c:subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, t)","anchor":"c:text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, arg2)","anchor":"c:to/2"}],"key":"callbacks"}]},{"id":"Bonfire.Mailer.Checker","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Checker","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Checker","nodeGroups":[{"name":"Types","nodes":[{"id":"error_reason/0","deprecated":false,"title":"error_reason()","anchor":"t:error_reason/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"validate_domain/1","deprecated":false,"title":"validate_domain(domain)","anchor":"validate_domain/1"},{"id":"validate_email/1","deprecated":false,"title":"validate_email(email)","anchor":"validate_email/1"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Render","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Render","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Render","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_layout/0","deprecated":false,"title":"default_layout()","anchor":"default_layout/0"},{"id":"maybe_with_layout/4","deprecated":false,"title":"maybe_with_layout(format, inner_content, assigns, layout)","anchor":"maybe_with_layout/4"},{"id":"new_templated/3","deprecated":false,"title":"new_templated(mod, assigns, opts \\\\ [])","anchor":"new_templated/3"},{"id":"render_templated/6","deprecated":false,"title":"render_templated(format, mod, assigns, template \\\\ nil, layout \\\\ nil, opts \\\\ [])","anchor":"render_templated/6"},{"id":"render_to_string/3","deprecated":false,"title":"render_to_string(mod, format, assigns)","anchor":"render_to_string/3"},{"id":"render_to_string/4","deprecated":false,"title":"render_to_string(mod, template, format, assigns)","anchor":"render_to_string/4"},{"id":"templated/4","deprecated":false,"title":"templated(email, mod, assigns, opts \\\\ [])","anchor":"templated/4"}],"key":"functions"}]},{"id":"Bonfire.Mailer.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"bamboo_service/2","deprecated":false,"title":"bamboo_service(adapter, extra \\\\ [])","anchor":"bamboo_service/2"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"mail_blackhole/1","deprecated":false,"title":"mail_blackhole(var)","anchor":"mail_blackhole/1"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"swoosh_service/2","deprecated":false,"title":"swoosh_service(adapter, extra \\\\ [])","anchor":"swoosh_service/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Swoosh","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Swoosh","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Swoosh","nodeGroups":[{"name":"Functions","nodes":[{"id":"deliver/2","deprecated":false,"title":"deliver(email, config \\\\ [])","anchor":"deliver/2"},{"id":"deliver!/2","deprecated":false,"title":"deliver!(email, config \\\\ [])","anchor":"deliver!/2"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/1"},{"id":"deliver_many/2","deprecated":false,"title":"deliver_many(emails, config \\\\ [])","anchor":"deliver_many/2"},{"id":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Web.Endpoint","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Endpoint","sections":[],"nested_context":"Bonfire","nested_title":".Web.Endpoint","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":"generate_reverse_router!/1","deprecated":false,"title":"generate_reverse_router!(app \\\\ :bonfire)","anchor":"generate_reverse_router!/1"},{"id":"halt_live_reload/2","deprecated":false,"title":"halt_live_reload(conn, _)","anchor":"halt_live_reload/2"},{"id":"host/0","deprecated":false,"title":"host()","anchor":"host/0"},{"id":"include_assets/1","deprecated":false,"title":"include_assets(conn)","anchor":"include_assets/1"},{"id":"include_assets/2","deprecated":false,"title":"include_assets(conn, atom)","anchor":"include_assets/2"},{"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":"log_ip/2","deprecated":false,"title":"log_ip(conn, _)","anchor":"log_ip/2"},{"id":"node_name/0","deprecated":false,"title":"node_name()","anchor":"node_name/0"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"publish_mutation/3","deprecated":false,"title":"publish_mutation(topic, mutation_result, subscribed_fields)","anchor":"publish_mutation/3"},{"id":"publish_subscription/2","deprecated":false,"title":"publish_subscription(topic, data)","anchor":"publish_subscription/2"},{"id":"reload!/1","deprecated":false,"title":"reload!(opts \\\\ [\"--no-all-warnings\"])","anchor":"reload!/1"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"Bonfire.Web.FakeRemoteEndpoint","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.FakeRemoteEndpoint","sections":[],"nested_context":"Bonfire","nested_title":".Web.FakeRemoteEndpoint","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":"log_ip/2","deprecated":false,"title":"log_ip(conn, _)","anchor":"log_ip/2"},{"id":"node_name/0","deprecated":false,"title":"node_name()","anchor":"node_name/0"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"publish_mutation/3","deprecated":false,"title":"publish_mutation(topic, mutation_result, subscribed_fields)","anchor":"publish_mutation/3"},{"id":"publish_subscription/2","deprecated":false,"title":"publish_subscription(topic, data)","anchor":"publish_subscription/2"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"Bonfire.Web.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router","nodeGroups":[{"name":"Functions","nodes":[{"id":"account_required/2","deprecated":false,"title":"account_required(conn, _)","anchor":"account_required/2"},{"id":"activity_json/2","deprecated":false,"title":"activity_json(conn, _)","anchor":"activity_json/2"},{"id":"activity_json_or_html/2","deprecated":false,"title":"activity_json_or_html(conn, _)","anchor":"activity_json_or_html/2"},{"id":"admin_required/2","deprecated":false,"title":"admin_required(conn, _)","anchor":"admin_required/2"},{"id":"basic/2","deprecated":false,"title":"basic(conn, _)","anchor":"basic/2"},{"id":"basic_html/2","deprecated":false,"title":"basic_html(conn, _)","anchor":"basic_html/2"},{"id":"basic_json/2","deprecated":false,"title":"basic_json(conn, _)","anchor":"basic_json/2"},{"id":"browser/2","deprecated":false,"title":"browser(conn, _)","anchor":"browser/2"},{"id":"browser_unsafe/2","deprecated":false,"title":"browser_unsafe(conn, _)","anchor":"browser_unsafe/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"early_hints_authed/2","deprecated":false,"title":"early_hints_authed(conn, _)","anchor":"early_hints_authed/2"},{"id":"guest_only/2","deprecated":false,"title":"guest_only(conn, _)","anchor":"guest_only/2"},{"id":"html_only/2","deprecated":false,"title":"html_only(conn, _)","anchor":"html_only/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"load_current_auth/2","deprecated":false,"title":"load_current_auth(conn, _)","anchor":"load_current_auth/2"},{"id":"require_authenticated_user/2","deprecated":false,"title":"require_authenticated_user(conn, _)","anchor":"require_authenticated_user/2"},{"id":"signed_activity_pub_fetch/2","deprecated":false,"title":"signed_activity_pub_fetch(conn, _)","anchor":"signed_activity_pub_fetch/2"},{"id":"signed_activity_pub_incoming/2","deprecated":false,"title":"signed_activity_pub_incoming(conn, _)","anchor":"signed_activity_pub_incoming/2"},{"id":"static_generator/2","deprecated":false,"title":"static_generator(conn, _)","anchor":"static_generator/2"},{"id":"throttle_plug_attacks/2","deprecated":false,"title":"throttle_plug_attacks(conn, _)","anchor":"throttle_plug_attacks/2"},{"id":"user_required/2","deprecated":false,"title":"user_required(conn, _)","anchor":"user_required/2"},{"id":"webfinger/2","deprecated":false,"title":"webfinger(conn, _)","anchor":"webfinger/2"},{"id":"well_known_nodeinfo/2","deprecated":false,"title":"well_known_nodeinfo(conn, _)","anchor":"well_known_nodeinfo/2"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.CORS","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.CORS","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.CORS","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"},{"id":"local_origin?/3","deprecated":false,"title":"local_origin?(conn, origin, scope)","anchor":"local_origin?/3"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.Reverse","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.Reverse","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.Reverse","nodeGroups":[{"name":"Functions","nodes":[{"id":"path/2","deprecated":false,"title":"path(conn_or_socket_or_endpoint, atom)","anchor":"path/2"},{"id":"path/3","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, qs)","anchor":"path/3"},{"id":"path/4","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1)","anchor":"path/4"},{"id":"path/5","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, qs)","anchor":"path/5"},{"id":"path/6","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, arg2, qs)","anchor":"path/6"},{"id":"path/7","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, arg2, arg3, qs)","anchor":"path/7"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.Routes"},{"id":"Bonfire.Web.ViewInventoryLive.GraphQL","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.ViewInventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Web.ViewInventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"ValueFlows","deprecated":false,"group":"Feature extensions","title":"ValueFlows","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}]},{"id":"ValueFlows.Agent.Agents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.Agents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_type/1","deprecated":false,"title":"add_type(a)","anchor":"add_type/1"},{"id":"agent/2","deprecated":false,"title":"agent(id, signed_in_user)","anchor":"agent/2"},{"id":"agent_location/1","deprecated":false,"title":"agent_location(a)","anchor":"agent_location/1"},{"id":"agent_to_character/1","deprecated":false,"title":"agent_to_character(a)","anchor":"agent_to_character/1"},{"id":"agents/1","deprecated":false,"title":"agents(signed_in_user)","anchor":"agents/1"},{"id":"character_to_agent/1","deprecated":false,"title":"character_to_agent(a)","anchor":"character_to_agent/1"}],"key":"functions"}]},{"id":"ValueFlows.Agent.Organizations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.Organizations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"organization/2","deprecated":false,"title":"organization(id, current_user)","anchor":"organization/2"},{"id":"organizations/1","deprecated":false,"title":"organizations(signed_in_user)","anchor":"organizations/1"}],"key":"functions"}]},{"id":"ValueFlows.Agent.People","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.People","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"people/1","deprecated":false,"title":"people(signed_in_user)","anchor":"people/1"},{"id":"person/2","deprecated":false,"title":"person(id, current_user)","anchor":"person/2"}],"key":"functions"}]},{"id":"ValueFlows.Agreement","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agreement","sections":[]},{"id":"ValueFlows.AllMigrations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.AllMigrations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"down/0","deprecated":false,"title":"down()","anchor":"down/0"},{"id":"up/0","deprecated":false,"title":"up()","anchor":"up/0"}],"key":"functions"}]},{"id":"ValueFlows.Claim","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/4","deprecated":false,"title":"create_changeset(creator, provider, receiver, attrs)","anchor":"create_changeset/4"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(claim, attrs)","anchor":"update_changeset/2"},{"id":"validate_required/1","deprecated":false,"title":"validate_required(changeset)","anchor":"validate_required/1"}],"key":"functions"}]},{"id":"ValueFlows.Claim.Claims","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.Claims","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/4","deprecated":false,"title":"create(creator, provider, receiver, attrs)","anchor":"create/4"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(claim)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(claim)","anchor":"soft_delete/1"},{"id":"update/2","deprecated":false,"title":"update(claim, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Claim.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"claim/2","deprecated":false,"title":"claim(map, info)","anchor":"claim/2"},{"id":"claims/2","deprecated":false,"title":"claims(page_opts, info)","anchor":"claims/2"},{"id":"create_claim/2","deprecated":false,"title":"create_claim(map, info)","anchor":"create_claim/2"},{"id":"delete_claim/2","deprecated":false,"title":"delete_claim(map, info)","anchor":"delete_claim/2"},{"id":"fetch_claim/2","deprecated":false,"title":"fetch_claim(info, id)","anchor":"fetch_claim/2"},{"id":"fetch_events/2","deprecated":false,"title":"fetch_events(page_opts, info)","anchor":"fetch_events/2"},{"id":"fetch_triggered_by_edge/3","deprecated":false,"title":"fetch_triggered_by_edge(thing, _, _)","anchor":"fetch_triggered_by_edge/3"},{"id":"update_claim/2","deprecated":false,"title":"update_claim(map, info)","anchor":"update_claim/2"}],"key":"functions"}]},{"id":"ValueFlows.Claim.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(event, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"},{"id":"validate_create_changeset/1","deprecated":false,"title":"validate_create_changeset(cs)","anchor":"validate_create_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.EconomicEvents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.EconomicEvents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/3","deprecated":false,"title":"create(creator, event_attrs, extra_attrs \\\\ %{})","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs_of/2","deprecated":false,"title":"inputs_of(attrs, action_id \\\\ nil)","anchor":"inputs_of/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs_of/2","deprecated":false,"title":"outputs_of(attrs, action_id \\\\ nil)","anchor":"outputs_of/2"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(event)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(event)","anchor":"preload_all/1"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator \\\\ nil)","anchor":"prepare_attrs/2"},{"id":"prepare_create_attrs/2","deprecated":false,"title":"prepare_create_attrs(attrs, creator \\\\ nil)","anchor":"prepare_create_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(event)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/3","deprecated":false,"title":"update(user, event, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.EventSideEffects","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.EventSideEffects","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_side_effects/1","deprecated":false,"title":"event_side_effects(event)","anchor":"event_side_effects/1"},{"id":"measurement_effect/3","deprecated":false,"title":"measurement_effect(arg1, measurement, amount)","anchor":"measurement_effect/3"},{"id":"quantity_effect/4","deprecated":false,"title":"quantity_effect(field, resource, by_quantity, operation)","anchor":"quantity_effect/4"},{"id":"return_updated_event/2","deprecated":false,"title":"return_updated_event(event, resource)","anchor":"return_updated_event/2"},{"id":"return_updated_event/3","deprecated":false,"title":"return_updated_event(event, resource, to_resource)","anchor":"return_updated_event/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_events/3","deprecated":false,"title":"agent_events(arg1, page_opts, info)","anchor":"agent_events/3"},{"id":"agent_events_edge/3","deprecated":false,"title":"agent_events_edge(map, page_opts, info)","anchor":"agent_events_edge/3"},{"id":"all_events/2","deprecated":false,"title":"all_events(_, _)","anchor":"all_events/2"},{"id":"create_event/2","deprecated":false,"title":"create_event(params, info)","anchor":"create_event/2"},{"id":"delete_event/2","deprecated":false,"title":"delete_event(map, info)","anchor":"delete_event/2"},{"id":"event/2","deprecated":false,"title":"event(map, info)","anchor":"event/2"},{"id":"events/2","deprecated":false,"title":"events(page_opts, info)","anchor":"events/2"},{"id":"events_filtered/2","deprecated":false,"title":"events_filtered(page_opts, _ \\\\ nil)","anchor":"events_filtered/2"},{"id":"fetch_agent_events_edge/3","deprecated":false,"title":"fetch_agent_events_edge(page_opts, info, ids)","anchor":"fetch_agent_events_edge/3"},{"id":"fetch_event/2","deprecated":false,"title":"fetch_event(info, id)","anchor":"fetch_event/2"},{"id":"fetch_events/2","deprecated":false,"title":"fetch_events(page_opts, info)","anchor":"fetch_events/2"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(thing, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(thing, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_to_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_to_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_to_resource_inventoried_as_edge/3"},{"id":"fetch_trace/2","deprecated":false,"title":"fetch_trace(_, event)","anchor":"fetch_trace/2"},{"id":"fetch_track/2","deprecated":false,"title":"fetch_track(_, event)","anchor":"fetch_track/2"},{"id":"fetch_triggered_by_edge/3","deprecated":false,"title":"fetch_triggered_by_edge(thing, _, _)","anchor":"fetch_triggered_by_edge/3"},{"id":"list_events/4","deprecated":false,"title":"list_events(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_events/4"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"trace/3","deprecated":false,"title":"trace(event, _, info)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, _, info)","anchor":"track/3"},{"id":"update_event/2","deprecated":false,"title":"update_event(map, info)","anchor":"update_event/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator)","anchor":"prepare_attrs/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Trace","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Trace","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/3","deprecated":false,"title":"event(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"event/3"},{"id":"process/3","deprecated":false,"title":"process(process, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"process/3"},{"id":"resource/3","deprecated":false,"title":"resource(resource_or_id, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"resource/3"},{"id":"trace/3","deprecated":false,"title":"trace(obj, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Track","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Track","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/3","deprecated":false,"title":"event(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"event/3"},{"id":"process/3","deprecated":false,"title":"process(process, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"process/3"},{"id":"resource/3","deprecated":false,"title":"resource(id, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"resource/3"},{"id":"track/3","deprecated":false,"title":"track(obj, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(resource, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.EconomicResources","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.EconomicResources","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs_of/1","deprecated":false,"title":"inputs_of(process)","anchor":"inputs_of/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs_of/1","deprecated":false,"title":"outputs_of(process)","anchor":"outputs_of/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(resource)","anchor":"preload_all/1"},{"id":"preload_state/1","deprecated":false,"title":"preload_state(resource)","anchor":"preload_state/1"},{"id":"search/1","deprecated":false,"title":"search(search)","anchor":"search/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(resource)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/2","deprecated":false,"title":"update(resource, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, search, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(resource_spec)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.Action","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.Action","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"ValueFlows.Knowledge.Action.Actions","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.Action.Actions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"action/1","deprecated":false,"title":"action(label)","anchor":"action/1"},{"id":"action!/1","deprecated":false,"title":"action!(label)","anchor":"action!/1"},{"id":"actions_list/0","deprecated":false,"title":"actions_list()","anchor":"actions_list/0"},{"id":"actions_map/0","deprecated":false,"title":"actions_map()","anchor":"actions_map/0"},{"id":"default_actions/0","deprecated":false,"title":"default_actions()","anchor":"default_actions/0"},{"id":"id/1","deprecated":false,"title":"id(label)","anchor":"id/1"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(process_spec, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_process_specs/2","deprecated":false,"title":"all_process_specs(_, _)","anchor":"all_process_specs/2"},{"id":"create_process_spec/2","deprecated":false,"title":"create_process_spec(map, info)","anchor":"create_process_spec/2"},{"id":"creator_process_specs_edge/3","deprecated":false,"title":"creator_process_specs_edge(map, page_opts, info)","anchor":"creator_process_specs_edge/3"},{"id":"delete_process_spec/2","deprecated":false,"title":"delete_process_spec(map, info)","anchor":"delete_process_spec/2"},{"id":"fetch_creator_process_specs_edge/3","deprecated":false,"title":"fetch_creator_process_specs_edge(page_opts, info, ids)","anchor":"fetch_creator_process_specs_edge/3"},{"id":"fetch_process_spec/2","deprecated":false,"title":"fetch_process_spec(info, id)","anchor":"fetch_process_spec/2"},{"id":"fetch_process_specs/2","deprecated":false,"title":"fetch_process_specs(page_opts, info)","anchor":"fetch_process_specs/2"},{"id":"list_process_specs/4","deprecated":false,"title":"list_process_specs(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_process_specs/4"},{"id":"process_spec/2","deprecated":false,"title":"process_spec(map, info)","anchor":"process_spec/2"},{"id":"process_specs/2","deprecated":false,"title":"process_specs(page_opts, info)","anchor":"process_specs/2"},{"id":"process_specs_filtered/2","deprecated":false,"title":"process_specs_filtered(page_opts, _)","anchor":"process_specs_filtered/2"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"update_process_spec/2","deprecated":false,"title":"update_process_spec(map, info)","anchor":"update_process_spec/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(process_spec)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(process_spec, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, context, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(resource_spec, attrs)","anchor":"update_changeset/2"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(resource_spec, context, attrs)","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_resource_specs/2","deprecated":false,"title":"all_resource_specs(_, _)","anchor":"all_resource_specs/2"},{"id":"create_resource_spec/2","deprecated":false,"title":"create_resource_spec(map, info)","anchor":"create_resource_spec/2"},{"id":"creator_resource_specs_edge/3","deprecated":false,"title":"creator_resource_specs_edge(map, page_opts, info)","anchor":"creator_resource_specs_edge/3"},{"id":"delete_resource_spec/2","deprecated":false,"title":"delete_resource_spec(map, info)","anchor":"delete_resource_spec/2"},{"id":"fetch_conforming_resources_edge/3","deprecated":false,"title":"fetch_conforming_resources_edge(map, page_opts, info)","anchor":"fetch_conforming_resources_edge/3"},{"id":"fetch_creator_resource_specs_edge/3","deprecated":false,"title":"fetch_creator_resource_specs_edge(page_opts, info, ids)","anchor":"fetch_creator_resource_specs_edge/3"},{"id":"fetch_default_unit_of_effort_edge/3","deprecated":false,"title":"fetch_default_unit_of_effort_edge(thing, _, _)","anchor":"fetch_default_unit_of_effort_edge/3"},{"id":"fetch_resource_spec/2","deprecated":false,"title":"fetch_resource_spec(info, id)","anchor":"fetch_resource_spec/2"},{"id":"fetch_resource_specs/2","deprecated":false,"title":"fetch_resource_specs(page_opts, info)","anchor":"fetch_resource_specs/2"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"list_resource_specs/4","deprecated":false,"title":"list_resource_specs(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_resource_specs/4"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"resource_spec/2","deprecated":false,"title":"resource_spec(map, info)","anchor":"resource_spec/2"},{"id":"resource_specs/2","deprecated":false,"title":"resource_specs(page_opts, info)","anchor":"resource_specs/2"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"update_resource_spec/2","deprecated":false,"title":"update_resource_spec(map, info)","anchor":"update_resource_spec/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"create_in_autocomplete/2","deprecated":false,"title":"create_in_autocomplete(creator, name)","anchor":"create_in_autocomplete/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(resource_spec)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"maybe_get/1","deprecated":false,"title":"maybe_get(arg1)","anchor":"maybe_get/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"prepare_attrs/1","deprecated":false,"title":"prepare_attrs(attrs)","anchor":"prepare_attrs/1"},{"id":"search/1","deprecated":false,"title":"search(search)","anchor":"search/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(resource_spec)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(resource_spec, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Classifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Classifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/4","deprecated":false,"title":"create(user, attrs, facet, extra_info \\\\ nil)","anchor":"create/4"},{"id":"flatten/1","deprecated":false,"title":"flatten(obj)","anchor":"flatten/1"},{"id":"from_classification/1","deprecated":false,"title":"from_classification(attrs)","anchor":"from_classification/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"preload/2","deprecated":false,"title":"preload(thing, fields)","anchor":"preload/2"},{"id":"to_classification/2","deprecated":false,"title":"to_classification(attrs, facet \\\\ nil)","anchor":"to_classification/2"},{"id":"to_ecto_struct/2","deprecated":false,"title":"to_ecto_struct(module, map)","anchor":"to_ecto_struct/2"},{"id":"update/4","deprecated":false,"title":"update(user, id, attrs, facet)","anchor":"update/4"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Hydration","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Hydration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Integration","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Integration","sections":[]},{"id":"ValueFlows.Observe.ObservablePhenomenons","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePhenomenons","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/3","deprecated":false,"title":"create(user, observable_property_id, attrs)","anchor":"create/3"},{"id":"facet/0","deprecated":false,"title":"facet()","anchor":"facet/0"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"update/3","deprecated":false,"title":"update(user, obj, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"choice_of_edge/3","deprecated":false,"title":"choice_of_edge(thing, _, _)","anchor":"choice_of_edge/3"},{"id":"create_observable_phenomenon/2","deprecated":false,"title":"create_observable_phenomenon(map, info)","anchor":"create_observable_phenomenon/2"},{"id":"delete_observable_phenomenon/2","deprecated":false,"title":"delete_observable_phenomenon(map, info)","anchor":"delete_observable_phenomenon/2"},{"id":"formula_quantifier_edge/3","deprecated":false,"title":"formula_quantifier_edge(thing, _, _)","anchor":"formula_quantifier_edge/3"},{"id":"get/2","deprecated":false,"title":"get(map, info)","anchor":"get/2"},{"id":"observable_phenomenons/2","deprecated":false,"title":"observable_phenomenons(page_opts, info)","anchor":"observable_phenomenons/2"},{"id":"update_observable_phenomenon/2","deprecated":false,"title":"update_observable_phenomenon(map, info)","anchor":"update_observable_phenomenon/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservableProperties","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservableProperties","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"facet/0","deprecated":false,"title":"facet()","anchor":"facet/0"},{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"update/3","deprecated":false,"title":"update(user, obj, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservablePropertiesGraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePropertiesGraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_observable_property/2","deprecated":false,"title":"create_observable_property(map, info)","anchor":"create_observable_property/2"},{"id":"delete_observable_property/2","deprecated":false,"title":"delete_observable_property(map, info)","anchor":"delete_observable_property/2"},{"id":"observable_properties/2","deprecated":false,"title":"observable_properties(page_opts, info)","anchor":"observable_properties/2"},{"id":"observable_property/2","deprecated":false,"title":"observable_property(map, info)","anchor":"observable_property/2"},{"id":"phenomenons_edge/3","deprecated":false,"title":"phenomenons_edge(thing, page_info, info)","anchor":"phenomenons_edge/3"},{"id":"update_observable_property/2","deprecated":false,"title":"update_observable_property(map, info)","anchor":"update_observable_property/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset_validate/1","deprecated":false,"title":"create_changeset_validate(cs)","anchor":"create_changeset_validate/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(event, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observation.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observation.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, map, observation_attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(observation)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(observation)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/3","deprecated":false,"title":"update(user, observation, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observations.ObservationsResolvers","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observations.ObservationsResolvers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_observations/2","deprecated":false,"title":"all_observations(_, _)","anchor":"all_observations/2"},{"id":"create_observation/2","deprecated":false,"title":"create_observation(params, info)","anchor":"create_observation/2"},{"id":"delete_observation/2","deprecated":false,"title":"delete_observation(map, info)","anchor":"delete_observation/2"},{"id":"fetch_observation/2","deprecated":false,"title":"fetch_observation(info, id)","anchor":"fetch_observation/2"},{"id":"fetch_observations/2","deprecated":false,"title":"fetch_observations(page_opts, info)","anchor":"fetch_observations/2"},{"id":"has_feature_of_interest/3","deprecated":false,"title":"has_feature_of_interest(thing, _, _)","anchor":"has_feature_of_interest/3"},{"id":"has_result_edge/3","deprecated":false,"title":"has_result_edge(thing, _, _)","anchor":"has_result_edge/3"},{"id":"list_observations/4","deprecated":false,"title":"list_observations(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_observations/4"},{"id":"made_by_edge/3","deprecated":false,"title":"made_by_edge(thing, _, _)","anchor":"made_by_edge/3"},{"id":"name_as_label/3","deprecated":false,"title":"name_as_label(obj, _, _)","anchor":"name_as_label/3"},{"id":"observation/2","deprecated":false,"title":"observation(map, info)","anchor":"observation/2"},{"id":"observations/2","deprecated":false,"title":"observations(page_opts, info)","anchor":"observations/2"},{"id":"resolve_observable_object_type/2","deprecated":false,"title":"resolve_observable_object_type(_, _)","anchor":"resolve_observable_object_type/2"},{"id":"resolve_observable_result_type/2","deprecated":false,"title":"resolve_observable_result_type(arg1, _)","anchor":"resolve_observable_result_type/2"},{"id":"resolve_observer_type/2","deprecated":false,"title":"resolve_observer_type(_, _)","anchor":"resolve_observer_type/2"},{"id":"update_observation/2","deprecated":false,"title":"update_observation(map, info)","anchor":"update_observation/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Seeds","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Seeds","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"down/1","deprecated":false,"title":"down(repo)","anchor":"down/1"},{"id":"up/1","deprecated":false,"title":"up(repo)","anchor":"up/1"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Simulate","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Simulate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_observable_phenomenon!/3","deprecated":false,"title":"fake_observable_phenomenon!(user, observable_property \\\\ nil, overrides \\\\ %{})","anchor":"fake_observable_phenomenon!/3"},{"id":"fake_observable_property!/2","deprecated":false,"title":"fake_observable_property!(user, overrides \\\\ %{})","anchor":"fake_observable_property!/2"},{"id":"fake_observation!/3","deprecated":false,"title":"fake_observation!(user, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_observation!/3"},{"id":"observable_phenomenon/1","deprecated":false,"title":"observable_phenomenon(overrides \\\\ %{})","anchor":"observable_phenomenon/1"},{"id":"observable_phenomenon_input/2","deprecated":false,"title":"observable_phenomenon_input(observable_property \\\\ nil, overrides \\\\ %{})","anchor":"observable_phenomenon_input/2"},{"id":"observable_property/1","deprecated":false,"title":"observable_property(overrides \\\\ %{})","anchor":"observable_property/1"},{"id":"observable_property_input/1","deprecated":false,"title":"observable_property_input(overrides \\\\ %{})","anchor":"observable_property_input/1"},{"id":"observation/4","deprecated":false,"title":"observation(base \\\\ %{}, has_feature_of_interest \\\\ nil, observed_property \\\\ nil, has_result \\\\ nil)","anchor":"observation/4"},{"id":"observation_input/2","deprecated":false,"title":"observation_input(user, base \\\\ %{})","anchor":"observation_input/2"},{"id":"observation_with_req_fields/2","deprecated":false,"title":"observation_with_req_fields(user, overrides \\\\ %{})","anchor":"observation_with_req_fields/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"attrs/0","deprecated":false,"title":"attrs()","anchor":"t:attrs/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(comm, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.Commitments","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.Commitments","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_id/2","deprecated":false,"title":"by_id(id, user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(comm)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(comm)","anchor":"preload_all/1"},{"id":"prep_attrs/2","deprecated":false,"title":"prep_attrs(attrs, creator \\\\ nil)","anchor":"prep_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(id)","anchor":"soft_delete/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(comm, user)","anchor":"soft_delete/2"},{"id":"update/3","deprecated":false,"title":"update(user, id, changes)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"commitment/2","deprecated":false,"title":"commitment(map, info)","anchor":"commitment/2"},{"id":"commitments_filtered/2","deprecated":false,"title":"commitments_filtered(args, arg2)","anchor":"commitments_filtered/2"},{"id":"create_commitment/2","deprecated":false,"title":"create_commitment(map, info)","anchor":"create_commitment/2"},{"id":"delete_commitment/2","deprecated":false,"title":"delete_commitment(map, info)","anchor":"delete_commitment/2"},{"id":"fetch_commitment/2","deprecated":false,"title":"fetch_commitment(info, id)","anchor":"fetch_commitment/2"},{"id":"fetch_created/3","deprecated":false,"title":"fetch_created(arg1, _, _)","anchor":"fetch_created/3"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(comm, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(comm, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(comm, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_satisfies_edge/3","deprecated":false,"title":"fetch_satisfies_edge(arg1, _, _)","anchor":"fetch_satisfies_edge/3"},{"id":"update_commitment/2","deprecated":false,"title":"update_commitment(map, info)","anchor":"update_commitment/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(intent, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_intents/3","deprecated":false,"title":"agent_intents(arg1, page_opts, info)","anchor":"agent_intents/3"},{"id":"agent_intents_edge/3","deprecated":false,"title":"agent_intents_edge(map, page_opts, info)","anchor":"agent_intents_edge/3"},{"id":"create_intent/2","deprecated":false,"title":"create_intent(map, info)","anchor":"create_intent/2"},{"id":"create_need/2","deprecated":false,"title":"create_need(map, info)","anchor":"create_need/2"},{"id":"create_offer/2","deprecated":false,"title":"create_offer(map, info)","anchor":"create_offer/2"},{"id":"delete_intent/2","deprecated":false,"title":"delete_intent(map, info)","anchor":"delete_intent/2"},{"id":"fetch_agent_intents_edge/3","deprecated":false,"title":"fetch_agent_intents_edge(page_opts, info, ids)","anchor":"fetch_agent_intents_edge/3"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(thing, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_intent/2","deprecated":false,"title":"fetch_intent(info, id)","anchor":"fetch_intent/2"},{"id":"fetch_intents/2","deprecated":false,"title":"fetch_intents(page_opts, info)","anchor":"fetch_intents/2"},{"id":"fetch_needs/2","deprecated":false,"title":"fetch_needs(page_opts, info)","anchor":"fetch_needs/2"},{"id":"fetch_offers/2","deprecated":false,"title":"fetch_offers(page_opts, info)","anchor":"fetch_offers/2"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(thing, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_provider_intents_edge/3","deprecated":false,"title":"fetch_provider_intents_edge(page_opts, info, ids)","anchor":"fetch_provider_intents_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_satisfied_by_edge/3","deprecated":false,"title":"fetch_satisfied_by_edge(arg1, _, _)","anchor":"fetch_satisfied_by_edge/3"},{"id":"intent/2","deprecated":false,"title":"intent(map, info)","anchor":"intent/2"},{"id":"intents/2","deprecated":false,"title":"intents(page_opts, info)","anchor":"intents/2"},{"id":"intents_filtered/2","deprecated":false,"title":"intents_filtered(args, info)","anchor":"intents_filtered/2"},{"id":"list_intents/2","deprecated":false,"title":"list_intents(page_opts, base_filters)","anchor":"list_intents/2"},{"id":"needs/2","deprecated":false,"title":"needs(page_opts, info)","anchor":"needs/2"},{"id":"offers/2","deprecated":false,"title":"offers(page_opts, info)","anchor":"offers/2"},{"id":"provider_intents/3","deprecated":false,"title":"provider_intents(arg1, page_opts, info)","anchor":"provider_intents/3"},{"id":"provider_intents_edge/3","deprecated":false,"title":"provider_intents_edge(map, page_opts, info)","anchor":"provider_intents_edge/3"},{"id":"update_intent/2","deprecated":false,"title":"update_intent(map, info)","anchor":"update_intent/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.Intents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.Intents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, current_user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, inputs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(intent)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(intent)","anchor":"preload_all/1"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator \\\\ nil)","anchor":"prepare_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(intent)","anchor":"soft_delete/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(id, current_user)","anchor":"soft_delete/2"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/4","deprecated":false,"title":"update(current_user, id, changes, verb \\\\ :update)","anchor":"update/4"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_to/4","deprecated":false,"title":"assign_to(assign_to, intent, socket, field \\\\ :provider)","anchor":"assign_to/4"},{"id":"create_from_list/6","deprecated":false,"title":"create_from_list(current_user, obj_attrs, list, tree_of_parent_ids, previous_indentation \\\\ \"\", latest_intent_id \\\\ nil)","anchor":"create_from_list/6"},{"id":"create_from_list/7","deprecated":false,"title":"create_from_list(_, _, list, _, _, _, _)","anchor":"create_from_list/7"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(arg1, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_param/3","deprecated":false,"title":"handle_param(binary, attrs, socket)","anchor":"handle_param/3"},{"id":"input_date/1","deprecated":false,"title":"input_date(date)","anchor":"input_date/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_verb/1","deprecated":false,"title":"update_verb(verb)","anchor":"update_verb/1"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(schema \\\\ Intent)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"attrs/0","deprecated":false,"title":"attrs()","anchor":"t:attrs/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(satis, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(map, info)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(map, info)","anchor":"delete/2"},{"id":"event_or_commitment_resolve_type/2","deprecated":false,"title":"event_or_commitment_resolve_type(arg1, _)","anchor":"event_or_commitment_resolve_type/2"},{"id":"fetch_satisfaction/2","deprecated":false,"title":"fetch_satisfaction(info, id)","anchor":"fetch_satisfaction/2"},{"id":"fetch_satisfied_by_edge/3","deprecated":false,"title":"fetch_satisfied_by_edge(satis, _, _)","anchor":"fetch_satisfied_by_edge/3"},{"id":"fetch_satisfies_edge/3","deprecated":false,"title":"fetch_satisfies_edge(satis, _, _)","anchor":"fetch_satisfies_edge/3"},{"id":"satisfaction/2","deprecated":false,"title":"satisfaction(map, info)","anchor":"satisfaction/2"},{"id":"satisfactions_filtered/2","deprecated":false,"title":"satisfactions_filtered(args, info)","anchor":"satisfactions_filtered/2"},{"id":"update/2","deprecated":false,"title":"update(map, info)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.Satisfactions","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.Satisfactions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_id/2","deprecated":false,"title":"by_id(id, user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(map)","anchor":"preload_all/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(id, user)","anchor":"soft_delete/2"},{"id":"update/3","deprecated":false,"title":"update(user, id, changes)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Process","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(process, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.Process.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"do_update/3","deprecated":false,"title":"do_update(id, attrs, socket)","anchor":"do_update/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"ValueFlows.Process.Processes","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.Processes","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, inputs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs/2","deprecated":false,"title":"inputs(attrs, action_id \\\\ nil)","anchor":"inputs/2"},{"id":"intended_inputs/2","deprecated":false,"title":"intended_inputs(map, filters \\\\ [])","anchor":"intended_inputs/2"},{"id":"intended_outputs/2","deprecated":false,"title":"intended_outputs(map, filters \\\\ [])","anchor":"intended_outputs/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs/2","deprecated":false,"title":"outputs(attrs, action_id \\\\ nil)","anchor":"outputs/2"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(process)","anchor":"preload_all/1"},{"id":"prepare_attrs/1","deprecated":false,"title":"prepare_attrs(attrs)","anchor":"prepare_attrs/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(process)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/2","deprecated":false,"title":"update(process, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Process.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(proposal, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_proposals/3","deprecated":false,"title":"agent_proposals(arg1, page_opts, info)","anchor":"agent_proposals/3"},{"id":"all_proposals/2","deprecated":false,"title":"all_proposals(page_opts, info)","anchor":"all_proposals/2"},{"id":"create_proposal/2","deprecated":false,"title":"create_proposal(map, info)","anchor":"create_proposal/2"},{"id":"delete_proposal/2","deprecated":false,"title":"delete_proposal(map, info)","anchor":"delete_proposal/2"},{"id":"eligible_location_edge/3","deprecated":false,"title":"eligible_location_edge(proposal, _, _)","anchor":"eligible_location_edge/3"},{"id":"fetch_proposal/2","deprecated":false,"title":"fetch_proposal(info, id)","anchor":"fetch_proposal/2"},{"id":"fetch_proposals/2","deprecated":false,"title":"fetch_proposals(page_opts, info)","anchor":"fetch_proposals/2"},{"id":"proposal/2","deprecated":false,"title":"proposal(map, info)","anchor":"proposal/2"},{"id":"proposals/2","deprecated":false,"title":"proposals(page_opts, info)","anchor":"proposals/2"},{"id":"proposals_filtered/2","deprecated":false,"title":"proposals_filtered(page_opts, _ \\\\ nil)","anchor":"proposals_filtered/2"},{"id":"update_proposal/2","deprecated":false,"title":"update_proposal(map, info)","anchor":"update_proposal/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.Proposals","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.Proposals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(proposal)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(proposal)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(proposal, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntent","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(published_in, publishes, attrs)","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntentQueries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntentQueries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"delete/1","deprecated":false,"title":"delete(proposed_intent)","anchor":"delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"propose_intent/3","deprecated":false,"title":"propose_intent(proposal, intent, attrs)","anchor":"propose_intent/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedTo","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedTo","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(proposed_to, proposed)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedToQueries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedToQueries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedTos","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedTos","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"delete/1","deprecated":false,"title":"delete(proposed_to)","anchor":"delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"propose_to/2","deprecated":false,"title":"propose_to(proposed_to, proposed)","anchor":"propose_to/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Util","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Util","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"attr_get_agent/3","deprecated":false,"title":"attr_get_agent(attrs, field, creator)","anchor":"attr_get_agent/3"},{"id":"can?/3","deprecated":false,"title":"can?(current_user, verb \\\\ :update, object)","anchor":"can?/3"},{"id":"change_measures/3","deprecated":false,"title":"change_measures(changeset, attrs, measure_fields)","anchor":"change_measures/3"},{"id":"common_filters/2","deprecated":false,"title":"common_filters(q, unknown_filter)","anchor":"common_filters/2"},{"id":"content_url_or_path/1","deprecated":false,"title":"content_url_or_path(content)","anchor":"content_url_or_path/1"},{"id":"default_recurse_limit/0","deprecated":false,"title":"default_recurse_limit()","anchor":"default_recurse_limit/0"},{"id":"handle_changeset_errors/3","deprecated":false,"title":"handle_changeset_errors(cs, attrs, fn_list)","anchor":"handle_changeset_errors/3"},{"id":"image_schema/0","deprecated":false,"title":"image_schema()","anchor":"image_schema/0"},{"id":"image_url/1","deprecated":false,"title":"image_url(thing)","anchor":"image_url/1"},{"id":"index_for_search/1","deprecated":false,"title":"index_for_search(object)","anchor":"index_for_search/1"},{"id":"indexing_format_creator/1","deprecated":false,"title":"indexing_format_creator(obj)","anchor":"indexing_format_creator/1"},{"id":"indexing_format_tags/1","deprecated":false,"title":"indexing_format_tags(obj)","anchor":"indexing_format_tags/1"},{"id":"map_values/2","deprecated":false,"title":"map_values(map, func)","anchor":"map_values/2"},{"id":"max_recurse_limit/0","deprecated":false,"title":"max_recurse_limit()","anchor":"max_recurse_limit/0"},{"id":"maybe_classification/2","deprecated":false,"title":"maybe_classification(user, tags)","anchor":"maybe_classification/2"},{"id":"maybe_classification_id/2","deprecated":false,"title":"maybe_classification_id(user, tags)","anchor":"maybe_classification_id/2"},{"id":"maybe_search/2","deprecated":false,"title":"maybe_search(search, facets)","anchor":"maybe_search/2"},{"id":"org_schema/0","deprecated":false,"title":"org_schema()","anchor":"org_schema/0"},{"id":"parse_measurement_attrs/2","deprecated":false,"title":"parse_measurement_attrs(attrs, user \\\\ nil)","anchor":"parse_measurement_attrs/2"},{"id":"prepare_opts_and_maybe_set_boundaries/3","deprecated":false,"title":"prepare_opts_and_maybe_set_boundaries(creator, thing, opts \\\\ [])","anchor":"prepare_opts_and_maybe_set_boundaries/3"},{"id":"publish/2","deprecated":false,"title":"publish(thing, verb)","anchor":"publish/2"},{"id":"publish/4","deprecated":false,"title":"publish(creator, verb, thing, opts \\\\ [])","anchor":"publish/4"},{"id":"search_for_matches/1","deprecated":false,"title":"search_for_matches(map)","anchor":"search_for_matches/1"},{"id":"try_tag_thing/3","deprecated":false,"title":"try_tag_thing(user, thing, attrs)","anchor":"try_tag_thing/3"},{"id":"user_or_org_schema/0","deprecated":false,"title":"user_or_org_schema()","anchor":"user_or_org_schema/0"},{"id":"user_schema/0","deprecated":false,"title":"user_schema()","anchor":"user_schema/0"}],"key":"functions"}]},{"id":"ValueFlows.Util.Federation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Util.Federation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_object_id/1","deprecated":false,"title":"activity_object_id(map)","anchor":"activity_object_id/1"},{"id":"ap_graphql_fields/2","deprecated":false,"title":"ap_graphql_fields(e, field_filters \\\\ [])","anchor":"ap_graphql_fields/2"},{"id":"ap_prepare_object/1","deprecated":false,"title":"ap_prepare_object(obj)","anchor":"ap_prepare_object/1"},{"id":"ap_publish/3","deprecated":false,"title":"ap_publish(user, verb, thing)","anchor":"ap_publish/3"},{"id":"ap_publish_activity/6","deprecated":false,"title":"ap_publish_activity(subject, activity_type, schema_type, thing, query_depth \\\\ 2, extra_field_filters \\\\ [])","anchor":"ap_publish_activity/6"},{"id":"ap_receive_activity/4","deprecated":false,"title":"ap_receive_activity(creator, activity, attrs, fun)","anchor":"ap_receive_activity/4"},{"id":"fetch_api_object/4","deprecated":false,"title":"fetch_api_object(id, schema_type, query_depth \\\\ 2, extra_field_filters \\\\ [])","anchor":"fetch_api_object/4"},{"id":"maybe_create_nested_object/3","deprecated":false,"title":"maybe_create_nested_object(creator, object_or_id, parent_key)","anchor":"maybe_create_nested_object/3"},{"id":"maybe_id/2","deprecated":false,"title":"maybe_id(thing, key)","anchor":"maybe_id/2"},{"id":"struct_to_json/1","deprecated":false,"title":"struct_to_json(struct)","anchor":"struct_to_json/1"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(calculation, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_value_calculation/2","deprecated":false,"title":"create_value_calculation(map, info)","anchor":"create_value_calculation/2"},{"id":"delete_value_calculation/2","deprecated":false,"title":"delete_value_calculation(map, info)","anchor":"delete_value_calculation/2"},{"id":"fetch_value_calculation/2","deprecated":false,"title":"fetch_value_calculation(info, id)","anchor":"fetch_value_calculation/2"},{"id":"fetch_value_calculations/2","deprecated":false,"title":"fetch_value_calculations(page_opts, info)","anchor":"fetch_value_calculations/2"},{"id":"resource_conforms_to_edge/3","deprecated":false,"title":"resource_conforms_to_edge(thing, _, _)","anchor":"resource_conforms_to_edge/3"},{"id":"update_value_calculation/2","deprecated":false,"title":"update_value_calculation(map, info)","anchor":"update_value_calculation/2"},{"id":"value_action_edge/3","deprecated":false,"title":"value_action_edge(thing, opts, info)","anchor":"value_action_edge/3"},{"id":"value_calculation/2","deprecated":false,"title":"value_calculation(map, info)","anchor":"value_calculation/2"},{"id":"value_calculations/2","deprecated":false,"title":"value_calculations(page_opts, info)","anchor":"value_calculations/2"},{"id":"value_resource_conforms_to_edge/3","deprecated":false,"title":"value_resource_conforms_to_edge(thing, _, _)","anchor":"value_resource_conforms_to_edge/3"},{"id":"value_unit_edge/3","deprecated":false,"title":"value_unit_edge(thing, _, _)","anchor":"value_unit_edge/3"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.ValueCalculations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.ValueCalculations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_to/2","deprecated":false,"title":"apply_to(event, calc)","anchor":"apply_to/2"},{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(calculation)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(calculation)","anchor":"soft_delete/1"},{"id":"update/2","deprecated":false,"title":"update(calculation, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Breadpub","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.IntentLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.IntentLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.IntentLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.MapLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.MapLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.MapLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.Web.HomeLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.Web.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Classify","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Classify","nodeGroups":[{"name":"Functions","nodes":[{"id":"arrange_categories_tree/1","deprecated":false,"title":"arrange_categories_tree(categories)","anchor":"arrange_categories_tree/1"},{"id":"ensure_update_allowed/2","deprecated":false,"title":"ensure_update_allowed(user, c)","anchor":"ensure_update_allowed/2"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"maybe_unindex/1","deprecated":false,"title":"maybe_unindex(object)","anchor":"maybe_unindex/1"},{"id":"my_followed_tree/2","deprecated":false,"title":"my_followed_tree(current_user, opts)","anchor":"my_followed_tree/2"},{"id":"publish/5","deprecated":false,"title":"publish(creator, verb, item, attrs, for_module \\\\ __MODULE__)","anchor":"publish/5"}],"key":"functions"}]},{"id":"Bonfire.Classify.Categories","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Categories","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Categories","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, category)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"attrs_prepare_tree/2","deprecated":false,"title":"attrs_prepare_tree(creator, attrs)","anchor":"attrs_prepare_tree/2"},{"id":"attrs_with_username/1","deprecated":false,"title":"attrs_with_username(attrs)","anchor":"attrs_with_username/1"},{"id":"by_username/2","deprecated":false,"title":"by_username(u, opts \\\\ [])","anchor":"by_username/2"},{"id":"clean_username/1","deprecated":false,"title":"clean_username(input)","anchor":"clean_username/1"},{"id":"create/3","deprecated":false,"title":"create(creator, attrs, is_local? \\\\ true)","anchor":"create/3"},{"id":"create_remote/1","deprecated":false,"title":"create_remote(attrs)","anchor":"create_remote/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"format_actor/1","deprecated":false,"title":"format_actor(cat)","anchor":"format_actor/1"},{"id":"get/2","deprecated":false,"title":"get(id, filters_and_or_opts \\\\ [:default])","anchor":"get/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"indexing_object_format_name/1","deprecated":false,"title":"indexing_object_format_name(object)","anchor":"indexing_object_format_name/1"},{"id":"indexing_object_format_parent/1","deprecated":false,"title":"indexing_object_format_parent(obj)","anchor":"indexing_object_format_parent/1"},{"id":"list/2","deprecated":false,"title":"list(filters \\\\ [:default], opts \\\\ [])","anchor":"list/2"},{"id":"list_tree/2","deprecated":false,"title":"list_tree(filters \\\\ [:default, tree_max_depth: 2], opts \\\\ [limit: 100])","anchor":"list_tree/2"},{"id":"moderators/1","deprecated":false,"title":"moderators(category)","anchor":"moderators/1"},{"id":"name_already_taken?/1","deprecated":false,"title":"name_already_taken?(changeset)","anchor":"name_already_taken?/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put_attrs_with_parent_category/2","deprecated":false,"title":"put_attrs_with_parent_category(attrs, parent_category)","anchor":"put_attrs_with_parent_category/2"},{"id":"put_generated_username/2","deprecated":false,"title":"put_generated_username(attrs, username)","anchor":"put_generated_username/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(c, user)","anchor":"soft_delete/2"},{"id":"try_several_usernames/4","deprecated":false,"title":"try_several_usernames(attrs, original_username, try_username, attempt \\\\ 1)","anchor":"try_several_usernames/4"},{"id":"update/4","deprecated":false,"title":"update(user \\\\ nil, category, attrs, is_local? \\\\ true)","anchor":"update/4"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(cat, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(cat, params)","anchor":"update_remote_actor/2"},{"id":"username_with_parent/2","deprecated":false,"title":"username_with_parent(arg1, name)","anchor":"username_with_parent/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.Category","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Category","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Category","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"base_create_changeset/2","deprecated":false,"title":"base_create_changeset(attrs, is_local?)","anchor":"base_create_changeset/2"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, attrs, is_local? \\\\ true)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(category, attrs, is_local? \\\\ true)","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"Bonfire.Classify.Category.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Category.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Category.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, table_or_tables, jq \\\\ :left)","anchor":"join_to/3"},{"id":"queries/4","deprecated":false,"title":"queries(query, base_filters, data_filters, count_filters)","anchor":"queries/4"},{"id":"query/1","deprecated":false,"title":"query(q \\\\ Category)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Classify.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, url, socket)","anchor":"handle_params/3"},{"id":"mounted/3","deprecated":false,"title":"mounted(params, session, socket)","anchor":"mounted/3"},{"id":"new/3","deprecated":false,"title":"new(type \\\\ :topic, attrs, socket)","anchor":"new/3"},{"id":"set_image/5","deprecated":false,"title":"set_image(atom, object, uploaded_media, assign_field, socket)","anchor":"set_image/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Classify.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Classify.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"category/1","deprecated":false,"title":"category(base \\\\ %{})","anchor":"category/1"},{"id":"fake_category!/3","deprecated":false,"title":"fake_category!(user, parent_category \\\\ nil, overrides \\\\ %{})","anchor":"fake_category!/3"}],"key":"functions"}]},{"id":"Bonfire.Classify.Tree","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Tree","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Tree","nodeGroups":[{"name":"Functions","nodes":[{"id":"ancestor_ids/1","deprecated":false,"title":"ancestor_ids(schema)","anchor":"ancestor_ids/1"},{"id":"ancestors/1","deprecated":false,"title":"ancestors(schema)","anchor":"ancestors/1"},{"id":"arrange/2","deprecated":false,"title":"arrange(structs_list, opts \\\\ [])","anchor":"arrange/2"},{"id":"build_child/1","deprecated":false,"title":"build_child(schema)","anchor":"build_child/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(tree \\\\ %Tree{}, attrs)","anchor":"changeset/2"},{"id":"children/1","deprecated":false,"title":"children(schema)","anchor":"children/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"depth/1","deprecated":false,"title":"depth(schema)","anchor":"depth/1"},{"id":"descendants/1","deprecated":false,"title":"descendants(schema)","anchor":"descendants/1"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"make_child_of/2","deprecated":false,"title":"make_child_of(changeset, parent)","anchor":"make_child_of/2"},{"id":"parent/1","deprecated":false,"title":"parent(schema)","anchor":"parent/1"},{"id":"parent_id/1","deprecated":false,"title":"parent_id(schema)","anchor":"parent_id/1"},{"id":"path/1","deprecated":false,"title":"path(schema)","anchor":"path/1"},{"id":"path_ids/1","deprecated":false,"title":"path_ids(schema)","anchor":"path_ids/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"put_tree/3","deprecated":false,"title":"put_tree(changeset, custodian, parent)","anchor":"put_tree/3"},{"id":"root/1","deprecated":false,"title":"root(schema)","anchor":"root/1"},{"id":"root?/1","deprecated":false,"title":"root?(schema)","anchor":"root?/1"},{"id":"root_id/1","deprecated":false,"title":"root_id(schema)","anchor":"root_id/1"},{"id":"siblings/1","deprecated":false,"title":"siblings(schema)","anchor":"siblings/1"},{"id":"subtree/1","deprecated":false,"title":"subtree(schema)","anchor":"subtree/1"},{"id":"where_depth/2","deprecated":false,"title":"where_depth(query \\\\ __MODULE__, depth_params)","anchor":"where_depth/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub","sections":[{"id":"Testing","anchor":"module-testing"},{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub","nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/1","deprecated":false,"title":"disable(scope \\\\ :instance)","anchor":"disable/1"},{"id":"federating?/1","deprecated":false,"title":"federating?(subject \\\\ nil)","anchor":"federating?/1"},{"id":"federating_default?/0","deprecated":false,"title":"federating_default?()","anchor":"federating_default?/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"set_federating/2","deprecated":false,"title":"set_federating(subject, set)","anchor":"set_federating/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Adapter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Adapter","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Adapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(actor, activity_data)","anchor":"external_followers_for_activity/2"},{"id":"federate_actor?/3","deprecated":false,"title":"federate_actor?(actor, direction \\\\ nil, by_actor \\\\ nil)","anchor":"federate_actor?/3"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(ap_id)","anchor":"get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(actor)","anchor":"get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(actor)","anchor":"get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(id_or_username_or_object)","anchor":"get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(activity)","anchor":"handle_activity/1"},{"id":"local_actor_updated/2","deprecated":false,"title":"local_actor_updated(character, is_local?)","anchor":"local_actor_updated/2"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(actor)","anchor":"maybe_create_remote_actor/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(pointer_id, manually_fetching?)","anchor":"maybe_publish_object/2"},{"id":"redirect_to_actor/1","deprecated":false,"title":"redirect_to_actor(username)","anchor":"redirect_to_actor/1"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(actor, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(actor)","anchor":"update_remote_actor/1"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(character, data)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.AdapterUtils","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.AdapterUtils","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.AdapterUtils","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_actors/1","deprecated":false,"title":"all_actors(activity)","anchor":"all_actors/1"},{"id":"all_recipients/2","deprecated":false,"title":"all_recipients(activity, fields \\\\ [:to, :bto, :cc, :bcc, :audience])","anchor":"all_recipients/2"},{"id":"ap_base_url/0","deprecated":false,"title":"ap_base_url()","anchor":"ap_base_url/0"},{"id":"apply_fun_style/3","deprecated":false,"title":"apply_fun_style(fallback_module \\\\ __MODULE__, fun, args)","anchor":"apply_fun_style/3"},{"id":"character_module/1","deprecated":false,"title":"character_module(struct)","anchor":"character_module/1"},{"id":"character_to_actor/1","deprecated":false,"title":"character_to_actor(character)","anchor":"character_to_actor/1"},{"id":"create_author_object/1","deprecated":false,"title":"create_author_object(map)","anchor":"create_author_object/1"},{"id":"create_remote_actor/1","deprecated":false,"title":"create_remote_actor(actor)","anchor":"create_remote_actor/1"},{"id":"determine_recipients/2","deprecated":false,"title":"determine_recipients(actor, comment)","anchor":"determine_recipients/2"},{"id":"determine_recipients/3","deprecated":false,"title":"determine_recipients(actor, comment, parent)","anchor":"determine_recipients/3"},{"id":"determine_recipients/4","deprecated":false,"title":"determine_recipients(actor, comment, to, cc)","anchor":"determine_recipients/4"},{"id":"format_actor/2","deprecated":false,"title":"format_actor(user_etc, type \\\\ \"Person\")","anchor":"format_actor/2"},{"id":"get_actor_by_ap_id/2","deprecated":false,"title":"get_actor_by_ap_id(ap_id, local_instance \\\\ nil)","anchor":"get_actor_by_ap_id/2"},{"id":"get_actor_username/1","deprecated":false,"title":"get_actor_username(obj)","anchor":"get_actor_username/1"},{"id":"get_author/1","deprecated":false,"title":"get_author(author)","anchor":"get_author/1"},{"id":"get_by_url_ap_id_or_username/2","deprecated":false,"title":"get_by_url_ap_id_or_username(q, opts \\\\ [])","anchor":"get_by_url_ap_id_or_username/2"},{"id":"get_character/1","deprecated":false,"title":"get_character(q)","anchor":"get_character/1"},{"id":"get_character_by_ap_id/1","deprecated":false,"title":"get_character_by_ap_id(ap_id)","anchor":"get_character_by_ap_id/1"},{"id":"get_character_by_ap_id!/1","deprecated":false,"title":"get_character_by_ap_id!(ap_id)","anchor":"get_character_by_ap_id!/1"},{"id":"get_character_by_id/2","deprecated":false,"title":"get_character_by_id(id, opts \\\\ [skip_boundary_check: true])","anchor":"get_character_by_id/2"},{"id":"get_character_by_username/1","deprecated":false,"title":"get_character_by_username(character)","anchor":"get_character_by_username/1"},{"id":"get_context_ap_id/1","deprecated":false,"title":"get_context_ap_id(arg1)","anchor":"get_context_ap_id/1"},{"id":"get_creator_ap_id/1","deprecated":false,"title":"get_creator_ap_id(arg1)","anchor":"get_creator_ap_id/1"},{"id":"get_different_creator_ap_id/1","deprecated":false,"title":"get_different_creator_ap_id(character)","anchor":"get_different_creator_ap_id/1"},{"id":"get_in_reply_to/1","deprecated":false,"title":"get_in_reply_to(comment)","anchor":"get_in_reply_to/1"},{"id":"get_local_actor_by_ap_id/1","deprecated":false,"title":"get_local_actor_by_ap_id(ap_id)","anchor":"get_local_actor_by_ap_id/1"},{"id":"get_local_character_by_ap_id/2","deprecated":false,"title":"get_local_character_by_ap_id(ap_id, local_instance \\\\ nil)","anchor":"get_local_character_by_ap_id/2"},{"id":"get_object_ap_id/1","deprecated":false,"title":"get_object_ap_id(arg1)","anchor":"get_object_ap_id/1"},{"id":"get_object_ap_id!/1","deprecated":false,"title":"get_object_ap_id!(object)","anchor":"get_object_ap_id!/1"},{"id":"get_object_or_actor_by_ap_id!/1","deprecated":false,"title":"get_object_or_actor_by_ap_id!(ap_id)","anchor":"get_object_or_actor_by_ap_id!/1"},{"id":"get_or_create_service_character/2","deprecated":false,"title":"get_or_create_service_character(service_character_id \\\\ service_character_id(), service_character_username \\\\ service_character_username())","anchor":"get_or_create_service_character/2"},{"id":"get_or_fetch_and_create_by_uri/2","deprecated":false,"title":"get_or_fetch_and_create_by_uri(q, opts \\\\ [])","anchor":"get_or_fetch_and_create_by_uri/2"},{"id":"get_or_fetch_and_create_by_username/2","deprecated":false,"title":"get_or_fetch_and_create_by_username(q, opts \\\\ [])","anchor":"get_or_fetch_and_create_by_username/2"},{"id":"get_or_fetch_character_by_ap_id/1","deprecated":false,"title":"get_or_fetch_character_by_ap_id(actor_or_ap_id)","anchor":"get_or_fetch_character_by_ap_id/1"},{"id":"get_pointer_id_by_ap_id/1","deprecated":false,"title":"get_pointer_id_by_ap_id(ap_id)","anchor":"get_pointer_id_by_ap_id/1"},{"id":"id_or_object_id/1","deprecated":false,"title":"id_or_object_id(id)","anchor":"id_or_object_id/1"},{"id":"is_follow?/1","deprecated":false,"title":"is_follow?(arg1)","anchor":"is_follow?/1"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"is_local_collection?/1","deprecated":false,"title":"is_local_collection?(ap_id)","anchor":"is_local_collection?/1"},{"id":"is_local_collection_or_built_in?/1","deprecated":false,"title":"is_local_collection_or_built_in?(ap_id)","anchor":"is_local_collection_or_built_in?/1"},{"id":"local_actor_ids/1","deprecated":false,"title":"local_actor_ids(actors)","anchor":"local_actor_ids/1"},{"id":"log/1","deprecated":false,"title":"log(l)","anchor":"log/1"},{"id":"maybe_add_aliases/2","deprecated":false,"title":"maybe_add_aliases(user_etc, aliases)","anchor":"maybe_add_aliases/2"},{"id":"maybe_attach_property_value/2","deprecated":false,"title":"maybe_attach_property_value(key, url)","anchor":"maybe_attach_property_value/2"},{"id":"maybe_create_banner_object/2","deprecated":false,"title":"maybe_create_banner_object(url, actor)","anchor":"maybe_create_banner_object/2"},{"id":"maybe_create_icon_object/2","deprecated":false,"title":"maybe_create_icon_object(url, actor)","anchor":"maybe_create_icon_object/2"},{"id":"maybe_create_image_object/2","deprecated":false,"title":"maybe_create_image_object(url, actor)","anchor":"maybe_create_image_object/2"},{"id":"maybe_fix_image_object/1","deprecated":false,"title":"maybe_fix_image_object(url)","anchor":"maybe_fix_image_object/1"},{"id":"maybe_format_image_object_from_path/1","deprecated":false,"title":"maybe_format_image_object_from_path(url)","anchor":"maybe_format_image_object_from_path/1"},{"id":"maybe_pointer_id_for_ap_id/1","deprecated":false,"title":"maybe_pointer_id_for_ap_id(ap_id)","anchor":"maybe_pointer_id_for_ap_id/1"},{"id":"preload_peered/1","deprecated":false,"title":"preload_peered(object)","anchor":"preload_peered/1"},{"id":"public_uri/0","deprecated":false,"title":"public_uri()","anchor":"public_uri/0"},{"id":"return_pointable/2","deprecated":false,"title":"return_pointable(f, opts \\\\ [skip_boundary_check: true])","anchor":"return_pointable/2"},{"id":"return_pointer/2","deprecated":false,"title":"return_pointer(id, opts)","anchor":"return_pointer/2"},{"id":"service_character_id/0","deprecated":false,"title":"service_character_id()","anchor":"service_character_id/0"},{"id":"service_character_username/0","deprecated":false,"title":"service_character_username()","anchor":"service_character_username/0"},{"id":"the_ap_id/1","deprecated":false,"title":"the_ap_id(ap_id)","anchor":"the_ap_id/1"},{"id":"validate_url/1","deprecated":false,"title":"validate_url(str)","anchor":"validate_url/1"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.BoundariesMRF","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.BoundariesMRF","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.BoundariesMRF","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_blocked?/3","deprecated":false,"title":"actor_blocked?(actor, direction \\\\ nil, by_user \\\\ nil)","anchor":"actor_blocked?/3"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.FederationModules","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.FederationModules","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.FederationModules","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"c:federation_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"federation_module/2","deprecated":false,"title":"federation_module(query, modules \\\\ federation_modules_data_types())","anchor":"federation_module/2"},{"id":"federation_module!/2","deprecated":false,"title":"federation_module!(query, modules \\\\ federation_modules_data_types())","anchor":"federation_module!/2"},{"id":"federation_modules/1","deprecated":false,"title":"federation_modules(queries)","anchor":"federation_modules/1"},{"id":"federation_modules_data_types/0","deprecated":false,"title":"federation_modules_data_types()","anchor":"federation_modules_data_types/0"},{"id":"maybe_federation_module/2","deprecated":false,"title":"maybe_federation_module(query, fallback \\\\ nil)","anchor":"maybe_federation_module/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Incoming","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Incoming","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Incoming","nodeGroups":[{"name":"Functions","nodes":[{"id":"no_federation_module_match/2","deprecated":false,"title":"no_federation_module_match(error, attrs \\\\ nil)","anchor":"no_federation_module_match/2"},{"id":"receive_activity/1","deprecated":false,"title":"receive_activity(activity_id)","anchor":"receive_activity/1"},{"id":"receive_activity/2","deprecated":false,"title":"receive_activity(activity, object)","anchor":"receive_activity/2"},{"id":"receive_object/2","deprecated":false,"title":"receive_object(creator, object_uri)","anchor":"receive_object/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Instances","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Instances","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Instances","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(canonical_uri)","anchor":"get/1"},{"id":"get_by_domain/1","deprecated":false,"title":"get_by_domain(canonical_uri)","anchor":"get_by_domain/1"},{"id":"get_or_create/1","deprecated":false,"title":"get_or_create(canonical_uri)","anchor":"get_or_create/1"},{"id":"get_or_create_instance_circle/1","deprecated":false,"title":"get_or_create_instance_circle(host)","anchor":"get_or_create_instance_circle/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(peered, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"list_paginated/1","deprecated":false,"title":"list_paginated(opts)","anchor":"list_paginated/1"},{"id":"list_query/0","deprecated":false,"title":"list_query()","anchor":"list_query/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.LoadTesting","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.LoadTesting","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.LoadTesting","nodeGroups":[{"name":"Functions","nodes":[{"id":"cases/0","deprecated":false,"title":"cases()","anchor":"cases/0"},{"id":"run_bench/0","deprecated":false,"title":"run_bench()","anchor":"run_bench/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.NodeinfoAdapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"gather_nodeinfo_data/0","deprecated":false,"title":"gather_nodeinfo_data()","anchor":"gather_nodeinfo_data/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Outgoing","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Outgoing","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Outgoing","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_activity!/1","deprecated":false,"title":"ap_activity!(activity)","anchor":"ap_activity!/1"},{"id":"federate_outgoing?/1","deprecated":false,"title":"federate_outgoing?(subject \\\\ nil)","anchor":"federate_outgoing?/1"},{"id":"maybe_federate/4","deprecated":false,"title":"maybe_federate(subject, verb, thing, opts \\\\ [])","anchor":"maybe_federate/4"},{"id":"preparation_error/2","deprecated":false,"title":"preparation_error(error, object)","anchor":"preparation_error/2"},{"id":"push_actor_update/1","deprecated":false,"title":"push_actor_update(actor)","anchor":"push_actor_update/1"},{"id":"push_now!/1","deprecated":false,"title":"push_now!(activity)","anchor":"push_now!/1"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Peered","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Peered","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Peered","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/3","deprecated":false,"title":"create(id, peer, canonical_uri)","anchor":"create/3"},{"id":"get/1","deprecated":false,"title":"get(id)","anchor":"get/1"},{"id":"get_canonical_uri/1","deprecated":false,"title":"get_canonical_uri(obj_or_id)","anchor":"get_canonical_uri/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(peered, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"save_canonical_uri/2","deprecated":false,"title":"save_canonical_uri(id, canonical_uri)","anchor":"save_canonical_uri/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_json/1","deprecated":false,"title":"actor_json(binary)","anchor":"actor_json/1"},{"id":"fake_remote_user/1","deprecated":false,"title":"fake_remote_user(actor_id \\\\ \"https://mocked.local/users/karen\")","anchor":"fake_remote_user/1"},{"id":"webfingered/0","deprecated":false,"title":"webfingered()","anchor":"webfingered/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Geolocate","nodeGroups":[{"name":"Functions","nodes":[{"id":"start/2","deprecated":false,"title":"start(type, args)","anchor":"start/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geocode","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geocode","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geocode","nodeGroups":[{"name":"Functions","nodes":[{"id":"coordinates/1","deprecated":false,"title":"coordinates(query)","anchor":"coordinates/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geolocation","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geolocation","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geolocation","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, attrs, opts \\\\ [])","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(geolocation, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geolocations","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geolocations","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geolocations","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, context, attrs)","anchor":"create/3"},{"id":"cursor/1","deprecated":false,"title":"cursor(atom)","anchor":"cursor/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(u)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"populate_coordinates/1","deprecated":false,"title":"populate_coordinates(objects)","anchor":"populate_coordinates/1"},{"id":"populate_result/1","deprecated":false,"title":"populate_result(geo)","anchor":"populate_result/1"},{"id":"resolve_mappable_address/1","deprecated":false,"title":"resolve_mappable_address(attrs)","anchor":"resolve_mappable_address/1"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(geo, opts)","anchor":"soft_delete/2"},{"id":"test_cursor/1","deprecated":false,"title":"test_cursor(atom)","anchor":"test_cursor/1"},{"id":"thing_add_location/3","deprecated":false,"title":"thing_add_location(user, thing, mappable_address)","anchor":"thing_add_location/3"},{"id":"update/3","deprecated":false,"title":"update(user, geolocation, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.GraphQL.Hydration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.GraphQL.Hydration","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.GraphQL.Hydration","nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_in_autocomplete/2","deprecated":false,"title":"create_in_autocomplete(creator, name)","anchor":"create_in_autocomplete/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(geolocation)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Places","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Places","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Places","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_place/2","deprecated":false,"title":"fetch_place(id, socket)","anchor":"fetch_place/2"},{"id":"fetch_place_things/2","deprecated":false,"title":"fetch_place_things(filters, socket)","anchor":"fetch_place_things/2"},{"id":"fetch_places/1","deprecated":false,"title":"fetch_places(socket)","anchor":"fetch_places/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"address/0","deprecated":false,"title":"address()","anchor":"address/0"},{"id":"fake_geolocation!/3","deprecated":false,"title":"fake_geolocation!(user \\\\ nil, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_geolocation!/3"},{"id":"geolocation/1","deprecated":false,"title":"geolocation(base \\\\ %{})","anchor":"geolocation/1"},{"id":"geolocation_input/1","deprecated":false,"title":"geolocation_input(base \\\\ %{})","anchor":"geolocation_input/1"},{"id":"mappable_address/0","deprecated":false,"title":"mappable_address()","anchor":"mappable_address/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Invite.Links","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"date_expires/1","deprecated":false,"title":"date_expires(invite)","anchor":"date_expires/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(invite)","anchor":"expired?/1"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"redeem/1","deprecated":false,"title":"redeem(invite)","anchor":"redeem/1"},{"id":"redeemable?/1","deprecated":false,"title":"redeemable?(invite)","anchor":"redeemable?/1"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Fake"},{"id":"Bonfire.Invite.Links.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.InviteLink","deprecated":false,"group":"Feature extensions","title":"Bonfire.InviteLink","sections":[],"nested_context":"Bonfire","nested_title":".InviteLink","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(obj \\\\ %InviteLink{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Label","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label","sections":[{"id":"Features","anchor":"module-features"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Label","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(label \\\\ %Label{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Label.Acts.LabelObject","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Acts.LabelObject","sections":[],"nested_context":"Bonfire","nested_title":".Label.Acts.LabelObject"},{"id":"Bonfire.Label.ContentLabels","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.ContentLabels","sections":[],"nested_context":"Bonfire","nested_title":".Label.ContentLabels","nodeGroups":[{"name":"Functions","nodes":[{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"built_ins/0","deprecated":false,"title":"built_ins()","anchor":"built_ins/0"},{"id":"can_label?/3","deprecated":false,"title":"can_label?(context, object, object_boundary \\\\ nil)","anchor":"can_label?/3"},{"id":"labels/0","deprecated":false,"title":"labels()","anchor":"labels/0"},{"id":"labels_under/1","deprecated":false,"title":"labels_under(parent_label \\\\ parent_label_id())","anchor":"labels_under/1"},{"id":"parent_label_id/0","deprecated":false,"title":"parent_label_id()","anchor":"parent_label_id/0"}],"key":"functions"}]},{"id":"Bonfire.Label.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Label.Fake"},{"id":"Bonfire.Label.Labelling","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Labelling","sections":[],"nested_context":"Bonfire","nested_title":".Label.Labelling","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, label)","anchor":"ap_publish_activity/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"date_last_labelled/2","deprecated":false,"title":"date_last_labelled(user, object)","anchor":"date_last_labelled/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"label_object/3","deprecated":false,"title":"label_object(label, object, opts \\\\ [])","anchor":"label_object/3"},{"id":"labelled?/2","deprecated":false,"title":"labelled?(user, object)","anchor":"labelled?/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(id, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :page)","anchor":"run_epic/4"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unlabel/3","deprecated":false,"title":"unlabel(labeler, labelled, opts \\\\ [])","anchor":"unlabel/3"}],"key":"functions"}]},{"id":"Bonfire.Label.Labels","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Labels","sections":[],"nested_context":"Bonfire","nested_title":".Label.Labels","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/4","deprecated":false,"title":"create(id, name, parent_id \\\\ nil, username \\\\ nil)","anchor":"create/4"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_or_create/4","deprecated":false,"title":"get_or_create(id, name, parent_id \\\\ nil, username \\\\ nil)","anchor":"get_or_create/4"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"top_label_id/0","deprecated":false,"title":"top_label_id()","anchor":"top_label_id/0"}],"key":"functions"}]},{"id":"Bonfire.Label.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Label.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(current_user, object, tags, params)","anchor":"maybe_tag/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Label.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Label.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Label.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Label.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Localise","deprecated":false,"group":"Feature extensions","title":"Bonfire.Localise","sections":[],"nested_context":"Bonfire","nested_title":".Localise"},{"id":"Bonfire.Me","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Me","nodeGroups":[{"name":"Functions","nodes":[{"id":"make_account_and_user/4","deprecated":false,"title":"make_account_and_user(name, email, password, opts \\\\ [])","anchor":"make_account_and_user/4"},{"id":"make_account_only/3","deprecated":false,"title":"make_account_only(email, password, opts \\\\ [])","anchor":"make_account_only/3"},{"id":"make_admin/1","deprecated":false,"title":"make_admin(username)","anchor":"make_admin/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts","nodeGroups":[{"name":"Types","nodes":[{"id":"changeset_name/0","deprecated":false,"title":"changeset_name()","anchor":"t:changeset_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allow_signup?/1","deprecated":false,"title":"allow_signup?(opts)","anchor":"allow_signup?/1"},{"id":"change_email/3","deprecated":false,"title":"change_email(current_account, params_or_changeset, opts \\\\ [])","anchor":"change_email/3"},{"id":"change_password/3","deprecated":false,"title":"change_password(current_account, params_or_changeset, opts \\\\ [])","anchor":"change_password/3"},{"id":"change_password/4","deprecated":false,"title":"change_password(current_account, cs, params, opts)","anchor":"change_password/4"},{"id":"changeset/3","deprecated":false,"title":"changeset(changeset_name, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"confirm_email/2","deprecated":false,"title":"confirm_email(account_or_token, opts \\\\ [])","anchor":"confirm_email/2"},{"id":"confirm_email_manually/1","deprecated":false,"title":"confirm_email_manually(email)","anchor":"confirm_email_manually/1"},{"id":"count/0","deprecated":false,"title":"count()","anchor":"count/0"},{"id":"delete/2","deprecated":false,"title":"delete(account, opts \\\\ [])","anchor":"delete/2"},{"id":"do_signup/2","deprecated":false,"title":"do_signup(cs_or_params, opts)","anchor":"do_signup/2"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(account)","anchor":"enqueue_delete/1"},{"id":"fetch_current/1","deprecated":false,"title":"fetch_current(id)","anchor":"fetch_current/1"},{"id":"get_by_email/1","deprecated":false,"title":"get_by_email(email)","anchor":"get_by_email/1"},{"id":"get_current/1","deprecated":false,"title":"get_current(id)","anchor":"get_current/1"},{"id":"instance_is_invite_only?/0","deprecated":false,"title":"instance_is_invite_only?()","anchor":"instance_is_invite_only?/0"},{"id":"is_admin?/1","deprecated":false,"title":"is_admin?(assigns)","anchor":"is_admin?/1"},{"id":"is_first_account?/0","deprecated":false,"title":"is_first_account?()","anchor":"is_first_account?/0"},{"id":"login/2","deprecated":false,"title":"login(params_or_changeset, opts \\\\ [])","anchor":"login/2"},{"id":"login_valid?/2","deprecated":false,"title":"login_valid?(user, password)","anchor":"login_valid?/2"},{"id":"make_account/2","deprecated":false,"title":"make_account(attrs \\\\ %{}, opts \\\\ [])","anchor":"make_account/2"},{"id":"maybe_redeem_invite/2","deprecated":false,"title":"maybe_redeem_invite(data, opts)","anchor":"maybe_redeem_invite/2"},{"id":"prepare_signup_opts/1","deprecated":false,"title":"prepare_signup_opts(opts)","anchor":"prepare_signup_opts/1"},{"id":"redeemable_invite?/1","deprecated":false,"title":"redeemable_invite?(invite)","anchor":"redeemable_invite?/1"},{"id":"request_confirm_email/2","deprecated":false,"title":"request_confirm_email(params_or_changeset_or_form_or_account, opts \\\\ [])","anchor":"request_confirm_email/2"},{"id":"request_forgot_password/1","deprecated":false,"title":"request_forgot_password(params)","anchor":"request_forgot_password/1"},{"id":"signup/2","deprecated":false,"title":"signup(params_or_changeset, opts \\\\ [])","anchor":"signup/2"},{"id":"update_is_admin/3","deprecated":false,"title":"update_is_admin(user_or_account, make_admin_or_revoke, user \\\\ nil)","anchor":"update_is_admin/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ChangeEmailFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ChangeEmailFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ChangeEmailFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ChangeEmailFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ChangePasswordFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ChangePasswordFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ChangePasswordFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(form \\\\ %ChangePasswordFields{}, attrs, resetting_password? \\\\ false)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ConfirmEmailFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ConfirmEmailFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ConfirmEmailFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ConfirmEmailFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ForgotPasswordFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ForgotPasswordFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ForgotPasswordFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ForgotPasswordFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.LoginFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.LoginFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.LoginFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %LoginFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_confirm_token/1","deprecated":false,"title":"by_confirm_token(token)","anchor":"by_confirm_token/1"},{"id":"by_email/1","deprecated":false,"title":"by_email(email)","anchor":"by_email/1"},{"id":"count/1","deprecated":false,"title":"count(q \\\\ Account)","anchor":"count/1"},{"id":"current/1","deprecated":false,"title":"current(id)","anchor":"current/1"},{"id":"login_by_account_id/1","deprecated":false,"title":"login_by_account_id(id)","anchor":"login_by_account_id/1"},{"id":"login_by_email/1","deprecated":false,"title":"login_by_email(email)","anchor":"login_by_email/1"},{"id":"login_by_username/1","deprecated":false,"title":"login_by_username(username)","anchor":"login_by_username/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.SecondFactors","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.SecondFactors","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.SecondFactors","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(totp \\\\ %AuthSecondFactor{}, attrs, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete_account_totp/1","deprecated":false,"title":"delete_account_totp(account_totp)","anchor":"delete_account_totp/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"format_secret/1","deprecated":false,"title":"format_secret(secret \\\\ new())","anchor":"format_secret/1"},{"id":"get_account_totp/1","deprecated":false,"title":"get_account_totp(account)","anchor":"get_account_totp/1"},{"id":"maybe_authenticate/2","deprecated":false,"title":"maybe_authenticate(account, params)","anchor":"maybe_authenticate/2"},{"id":"maybe_cast_totp_changeset/3","deprecated":false,"title":"maybe_cast_totp_changeset(changeset, params, opts)","anchor":"maybe_cast_totp_changeset/3"},{"id":"new/0","deprecated":false,"title":"new()","anchor":"new/0"},{"id":"new_qrcode/1","deprecated":false,"title":"new_qrcode(opts \\\\ [])","anchor":"new_qrcode/1"},{"id":"new_struct/1","deprecated":false,"title":"new_struct(secret \\\\ nil)","anchor":"new_struct/1"},{"id":"new_uri/1","deprecated":false,"title":"new_uri(secret \\\\ nil)","anchor":"new_uri/1"},{"id":"validate_account_totp/2","deprecated":false,"title":"validate_account_totp(totp, code)","anchor":"validate_account_totp/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Acts.Caretaker","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Acts.Caretaker","sections":[],"nested_context":"Bonfire","nested_title":".Me.Acts.Caretaker","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Acts.Creator","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Acts.Creator","sections":[],"nested_context":"Bonfire","nested_title":".Me.Acts.Creator"},{"id":"Bonfire.Me.Archive.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Archive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Archive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Characters","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Characters","sections":[],"nested_context":"Bonfire","nested_title":".Me.Characters","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_username/1","deprecated":false,"title":"by_username(username)","anchor":"by_username/1"},{"id":"by_username!/1","deprecated":false,"title":"by_username!(username)","anchor":"by_username!/1"},{"id":"by_username_q/1","deprecated":false,"title":"by_username_q(username)","anchor":"by_username_q/1"},{"id":"changeset/3","deprecated":false,"title":"changeset(char \\\\ %Character{}, params, profile \\\\ :local)","anchor":"changeset/3"},{"id":"character_mention_prefix/1","deprecated":false,"title":"character_mention_prefix(object)","anchor":"character_mention_prefix/1"},{"id":"character_url/1","deprecated":false,"title":"character_url(character)","anchor":"character_url/1"},{"id":"clean_username/1","deprecated":false,"title":"clean_username(username)","anchor":"clean_username/1"},{"id":"display_username/4","deprecated":false,"title":"display_username(user, always_include_domain \\\\ false, is_local? \\\\ nil, prefix \\\\ nil)","anchor":"display_username/4"},{"id":"get/1","deprecated":false,"title":"get(ids)","anchor":"get/1"},{"id":"hash_available?/1","deprecated":false,"title":"hash_available?(hash)","anchor":"hash_available?/1"},{"id":"hash_delete/1","deprecated":false,"title":"hash_delete(hash)","anchor":"hash_delete/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"q_by_id/1","deprecated":false,"title":"q_by_id(ids)","anchor":"q_by_id/1"},{"id":"remote_changeset/2","deprecated":false,"title":"remote_changeset(changeset, params)","anchor":"remote_changeset/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"update/2","deprecated":false,"title":"update(character, attrs)","anchor":"update/2"},{"id":"username_available?/1","deprecated":false,"title":"username_available?(username)","anchor":"username_available?/1"}],"key":"functions"}]},{"id":"Bonfire.Me.DeleteWorker","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.DeleteWorker","sections":[],"nested_context":"Bonfire","nested_title":".Me.DeleteWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(ids, opts)","anchor":"delete/2"},{"id":"delete_now/1","deprecated":false,"title":"delete_now(ids)","anchor":"delete_now/1"},{"id":"delete_structs_now/1","deprecated":false,"title":"delete_structs_now(structs)","anchor":"delete_structs_now/1"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(ids)","anchor":"enqueue_delete/1"},{"id":"perform/1","deprecated":false,"title":"perform(map)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Me.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_user!/3","deprecated":false,"title":"fake_user!(account \\\\ %{}, attrs \\\\ %{}, opts_or_extra \\\\ [])","anchor":"fake_user!/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Fake.Helpers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Fake.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Me.Fake.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"atusername/0","deprecated":false,"title":"atusername()","anchor":"atusername/0"},{"id":"avatar_url/0","deprecated":false,"title":"avatar_url()","anchor":"avatar_url/0"},{"id":"avatar_url/1","deprecated":false,"title":"avatar_url(slug)","anchor":"avatar_url/1"},{"id":"character_subform/1","deprecated":false,"title":"character_subform(base \\\\ %{})","anchor":"character_subform/1"},{"id":"confirm_token/0","deprecated":false,"title":"confirm_token()","anchor":"confirm_token/0"},{"id":"create_user_form/1","deprecated":false,"title":"create_user_form(base \\\\ %{})","anchor":"create_user_form/1"},{"id":"credential_subform/1","deprecated":false,"title":"credential_subform(base \\\\ %{})","anchor":"credential_subform/1"},{"id":"email_subform/1","deprecated":false,"title":"email_subform(base \\\\ %{})","anchor":"email_subform/1"},{"id":"icon_url/1","deprecated":false,"title":"icon_url(slug \\\\ nil)","anchor":"icon_url/1"},{"id":"image/1","deprecated":false,"title":"image(arg1)","anchor":"image/1"},{"id":"image_url/1","deprecated":false,"title":"image_url(slug \\\\ nil)","anchor":"image_url/1"},{"id":"profile_subform/1","deprecated":false,"title":"profile_subform(base \\\\ %{})","anchor":"profile_subform/1"},{"id":"signup_form/1","deprecated":false,"title":"signup_form(base \\\\ %{})","anchor":"signup_form/1"},{"id":"user_live/1","deprecated":false,"title":"user_live(base \\\\ %{})","anchor":"user_live/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Me.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"indexing_format_created/2","deprecated":false,"title":"indexing_format_created(profile, character)","anchor":"indexing_format_created/2"},{"id":"indexing_format_creator/2","deprecated":false,"title":"indexing_format_creator(profile, character)","anchor":"indexing_format_creator/2"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Me.Mails","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Mails","sections":[],"nested_context":"Bonfire","nested_title":".Me.Mails","nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm_email/2","deprecated":false,"title":"confirm_email(account, opts \\\\ [])","anchor":"confirm_email/2"},{"id":"forgot_password/1","deprecated":false,"title":"forgot_password(account)","anchor":"forgot_password/1"},{"id":"render/3","deprecated":false,"title":"render(email, template, assigns \\\\ [])","anchor":"render/3"},{"id":"signup_confirm_email/1","deprecated":false,"title":"signup_confirm_email(account)","anchor":"signup_confirm_email/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Mails.EmailView","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Mails.EmailView","sections":[],"nested_context":"Bonfire","nested_title":".Me.Mails.EmailView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render_template/2","deprecated":false,"title":"render_template(template, assigns)","anchor":"render_template/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Profiles","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Profiles","sections":[],"nested_context":"Bonfire","nested_title":".Me.Profiles","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(profile \\\\ %Profile{}, params)","anchor":"changeset/2"},{"id":"changeset_simple/2","deprecated":false,"title":"changeset_simple(profile \\\\ %Profile{}, params)","anchor":"changeset_simple/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"set_profile_image/3","deprecated":false,"title":"set_profile_image(atom, user, uploaded_media)","anchor":"set_profile_image/3"},{"id":"spam?/2","deprecated":false,"title":"spam?(text, context)","anchor":"spam?/2"},{"id":"spam_check!/2","deprecated":false,"title":"spam_check!(text, context)","anchor":"spam_check!/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Profiles.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Profiles.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Profiles.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_assigns/1","deprecated":false,"title":"default_assigns(is_guest?)","anchor":"default_assigns/1"},{"id":"get/1","deprecated":false,"title":"get(username)","anchor":"get/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"init/2","deprecated":false,"title":"init(params, socket)","anchor":"init/2"},{"id":"maybe_assign_aliases/2","deprecated":false,"title":"maybe_assign_aliases(socket, user)","anchor":"maybe_assign_aliases/2"},{"id":"set_image_setting/5","deprecated":false,"title":"set_image_setting(atom, scope, uploaded_media, settings_key, socket)","anchor":"set_image_setting/5"},{"id":"set_profile_image/5","deprecated":false,"title":"set_profile_image(atom, user, uploaded_media, assign_field, socket)","anchor":"set_profile_image/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"user_assigns/3","deprecated":false,"title":"user_assigns(user, current_user, follows_me \\\\ false)","anchor":"user_assigns/3"}],"key":"functions"}]},{"id":"Bonfire.Me.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Me.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Me.SharedUsers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.SharedUsers","sections":[],"nested_context":"Bonfire","nested_title":".Me.SharedUsers","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_account/3","deprecated":false,"title":"add_account(shared_user_or_username, email_or_username, params \\\\ %{})","anchor":"add_account/3"},{"id":"add_accounts/3","deprecated":false,"title":"add_accounts(shared_user_or_username, emails_or_usernames, params \\\\ %{})","anchor":"add_accounts/3"},{"id":"by_account/1","deprecated":false,"title":"by_account(account)","anchor":"by_account/1"},{"id":"by_username_and_account_query/2","deprecated":false,"title":"by_username_and_account_query(username, account)","anchor":"by_username_and_account_query/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"init_shared_user/2","deprecated":false,"title":"init_shared_user(user, params \\\\ %{})","anchor":"init_shared_user/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Users","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users","nodeGroups":[{"name":"Types","nodes":[{"id":"changeset_extra/0","deprecated":false,"title":"changeset_extra()","anchor":"t:changeset_extra/0"},{"id":"changeset_name/0","deprecated":false,"title":"changeset_name()","anchor":"t:changeset_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"automod_id/0","deprecated":false,"title":"automod_id()","anchor":"automod_id/0"},{"id":"by_account/1","deprecated":false,"title":"by_account(account)","anchor":"by_account/1"},{"id":"by_account!/1","deprecated":false,"title":"by_account!(account)","anchor":"by_account!/1"},{"id":"by_ap_id/1","deprecated":false,"title":"by_ap_id(ap_id)","anchor":"by_ap_id/1"},{"id":"by_ap_id!/1","deprecated":false,"title":"by_ap_id!(ap_id)","anchor":"by_ap_id!/1"},{"id":"by_canonical_uri/1","deprecated":false,"title":"by_canonical_uri(uri)","anchor":"by_canonical_uri/1"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, opts \\\\ [])","anchor":"by_id/2"},{"id":"by_user_and_account/2","deprecated":false,"title":"by_user_and_account(username_or_user_id, account_id)","anchor":"by_user_and_account/2"},{"id":"by_username/2","deprecated":false,"title":"by_username(username, opts \\\\ [])","anchor":"by_username/2"},{"id":"by_username!/1","deprecated":false,"title":"by_username!(username)","anchor":"by_username!/1"},{"id":"changeset/4","deprecated":false,"title":"changeset(name, user \\\\ %User{}, params, extra)","anchor":"changeset/4"},{"id":"check_active/1","deprecated":false,"title":"check_active(users)","anchor":"check_active/1"},{"id":"check_active!/1","deprecated":false,"title":"check_active!(users)","anchor":"check_active!/1"},{"id":"count/1","deprecated":false,"title":"count(show \\\\ :local)","anchor":"count/1"},{"id":"create/2","deprecated":false,"title":"create(params_or_changeset, opts \\\\ [])","anchor":"create/2"},{"id":"create_remote/1","deprecated":false,"title":"create_remote(params)","anchor":"create_remote/1"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(user)","anchor":"enqueue_delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fetch_current/1","deprecated":false,"title":"fetch_current(id)","anchor":"fetch_current/1"},{"id":"flatten/1","deprecated":false,"title":"flatten(user)","anchor":"flatten/1"},{"id":"format_actor/1","deprecated":false,"title":"format_actor(user)","anchor":"format_actor/1"},{"id":"get_current/1","deprecated":false,"title":"get_current(id)","anchor":"get_current/1"},{"id":"get_current/2","deprecated":false,"title":"get_current(id, account_id)","anchor":"get_current/2"},{"id":"get_only_in_account/1","deprecated":false,"title":"get_only_in_account(account)","anchor":"get_only_in_account/1"},{"id":"get_or_create_automod/0","deprecated":false,"title":"get_or_create_automod()","anchor":"get_or_create_automod/0"},{"id":"get_or_create_service_character/2","deprecated":false,"title":"get_or_create_service_character(service_character_id, service_character_username)","anchor":"get_or_create_service_character/2"},{"id":"ids_by_account/1","deprecated":false,"title":"ids_by_account(account_id)","anchor":"ids_by_account/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(u)","anchor":"indexing_object_format/1"},{"id":"is_active?/1","deprecated":false,"title":"is_active?(user)","anchor":"is_active?/1"},{"id":"is_first_user?/0","deprecated":false,"title":"is_first_user?()","anchor":"is_first_user?/0"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_admins/0","deprecated":false,"title":"list_admins()","anchor":"list_admins/0"},{"id":"list_boundarised_query/1","deprecated":false,"title":"list_boundarised_query(opts)","anchor":"list_boundarised_query/1"},{"id":"list_paginated/1","deprecated":false,"title":"list_paginated(opts \\\\ [])","anchor":"list_paginated/1"},{"id":"make_admin/1","deprecated":false,"title":"make_admin(username)","anchor":"make_admin/1"},{"id":"make_user/3","deprecated":false,"title":"make_user(attrs, account, opts \\\\ [])","anchor":"make_user/3"},{"id":"maybe_count/1","deprecated":false,"title":"maybe_count(show \\\\ :local)","anchor":"maybe_count/1"},{"id":"maybe_index_user/1","deprecated":false,"title":"maybe_index_user(object)","anchor":"maybe_index_user/1"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"remote_fetcher_id/0","deprecated":false,"title":"remote_fetcher_id()","anchor":"remote_fetcher_id/0"},{"id":"revoke_admin/1","deprecated":false,"title":"revoke_admin(username)","anchor":"revoke_admin/1"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"search_query/2","deprecated":false,"title":"search_query(search, opts \\\\ [])","anchor":"search_query/2"},{"id":"update/3","deprecated":false,"title":"update(user, params, extra \\\\ [])","anchor":"update/3"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(user, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(user, params)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Users.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"disconnect_account_session/1","deprecated":false,"title":"disconnect_account_session(conn)","anchor":"disconnect_account_session/1"},{"id":"disconnect_sockets/1","deprecated":false,"title":"disconnect_sockets(context)","anchor":"disconnect_sockets/1"},{"id":"disconnect_user_session/1","deprecated":false,"title":"disconnect_user_session(conn)","anchor":"disconnect_user_session/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, search, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(u)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Users.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"admins/1","deprecated":false,"title":"admins(opts \\\\ [])","anchor":"admins/1"},{"id":"base_by_id/1","deprecated":false,"title":"base_by_id(id)","anchor":"base_by_id/1"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"by_account/1","deprecated":false,"title":"by_account(account_id)","anchor":"by_account/1"},{"id":"by_canonical_uri/2","deprecated":false,"title":"by_canonical_uri(canonical_uri, opts \\\\ [])","anchor":"by_canonical_uri/2"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, opts \\\\ [])","anchor":"by_id/2"},{"id":"by_user_and_account/2","deprecated":false,"title":"by_user_and_account(username_or_user_id, account_id)","anchor":"by_user_and_account/2"},{"id":"by_username_or_id/2","deprecated":false,"title":"by_username_or_id(username_or_id, opts \\\\ [])","anchor":"by_username_or_id/2"},{"id":"by_username_query/2","deprecated":false,"title":"by_username_query(username, opts \\\\ [])","anchor":"by_username_query/2"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"count/1","deprecated":false,"title":"count(arg1)","anchor":"count/1"},{"id":"current/1","deprecated":false,"title":"current(user_id)","anchor":"current/1"},{"id":"current/2","deprecated":false,"title":"current(user_id, account_id)","anchor":"current/2"},{"id":"join_peered/1","deprecated":false,"title":"join_peered(q)","anchor":"join_peered/1"},{"id":"list/1","deprecated":false,"title":"list(arg1)","anchor":"list/1"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(text, opts \\\\ [])","anchor":"search/2"}],"key":"functions"}]},{"id":"Bonfire.Messages","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Messages","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, message)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, attrs, opts \\\\ [])","anchor":"changeset/3"},{"id":"draft/2","deprecated":false,"title":"draft(context, attrs)","anchor":"draft/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"filter/3","deprecated":false,"title":"filter(atom, arg2, query)","anchor":"filter/3"},{"id":"list/3","deprecated":false,"title":"list(current_user, with_user \\\\ nil, opts \\\\ [])","anchor":"list/3"},{"id":"list/4","deprecated":false,"title":"list(current_user, with_user, cursor_before, preloads)","anchor":"list/4"},{"id":"maybe_spam_check/3","deprecated":false,"title":"maybe_spam_check(changeset, attrs, context)","anchor":"maybe_spam_check/3"},{"id":"read/2","deprecated":false,"title":"read(message_id, opts)","anchor":"read/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"send/3","deprecated":false,"title":"send(sender_or_context, attrs, to \\\\ nil)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.Messages.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Messages.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_comment!/4","deprecated":false,"title":"fake_comment!(user, reply_to, boundary \\\\ nil, attrs \\\\ nil)","anchor":"fake_comment!/4"},{"id":"fake_post!/4","deprecated":false,"title":"fake_post!(user, boundary \\\\ nil, attrs \\\\ nil, opts \\\\ [])","anchor":"fake_post!/4"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Messages.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Messages.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Messages.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Messages.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(attrs, _, socket)","anchor":"handle_params/3"},{"id":"list_threads/3","deprecated":false,"title":"list_threads(current_user, user \\\\ nil, opts \\\\ [])","anchor":"list_threads/3"},{"id":"live_more/3","deprecated":false,"title":"live_more(context, opts, socket)","anchor":"live_more/3"},{"id":"send_message/2","deprecated":false,"title":"send_message(params, socket)","anchor":"send_message/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"thread_meta/4","deprecated":false,"title":"thread_meta(thread_id, activity, object, opts)","anchor":"thread_meta/4"},{"id":"thread_meta/5","deprecated":false,"title":"thread_meta(key, thread_id, activity, object, opts)","anchor":"thread_meta/5"},{"id":"thread_participants/4","deprecated":false,"title":"thread_participants(thread_id, activity, object, opts)","anchor":"thread_participants/4"},{"id":"threads_widget/3","deprecated":false,"title":"threads_widget(current_user, user \\\\ nil, opts \\\\ [])","anchor":"threads_widget/3"}],"key":"functions"}]},{"id":"Bonfire.OpenID","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".OpenID"},{"id":"Bonfire.OpenID.Client","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Client","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Client","nodeGroups":[{"name":"Functions","nodes":[{"id":"oauth2_providers/0","deprecated":false,"title":"oauth2_providers()","anchor":"oauth2_providers/0"},{"id":"open_id_connect_providers/0","deprecated":false,"title":"open_id_connect_providers()","anchor":"open_id_connect_providers/0"},{"id":"providers_authorization_urls/1","deprecated":false,"title":"providers_authorization_urls(source \\\\ :login)","anchor":"providers_authorization_urls/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Fake","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_user!/2","deprecated":false,"title":"fake_user!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_user!/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.AuthRequired","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.AuthRequired","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.AuthRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"require_auth/2","deprecated":false,"title":"require_auth(conn, opts)","anchor":"require_auth/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.Authorize","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.Authorize","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.Authorize","nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize/2","deprecated":false,"title":"authorize(conn, required_scopes)","anchor":"authorize/2"},{"id":"load_authorization/2","deprecated":false,"title":"load_authorization(conn, opts)","anchor":"load_authorization/2"},{"id":"maybe_load_authorization/2","deprecated":false,"title":"maybe_load_authorization(conn, opts \\\\ [])","anchor":"maybe_load_authorization/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.ClientID","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.ClientID","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.ClientID","nodeGroups":[{"name":"Functions","nodes":[{"id":"validate_client_id/2","deprecated":false,"title":"validate_client_id(conn, opts)","anchor":"validate_client_id/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Provider.ClientApps","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Provider.ClientApps","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Provider.ClientApps","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(clauses)","anchor":"get/1"},{"id":"get/2","deprecated":false,"title":"get(name, redirect_uri)","anchor":"get/2"},{"id":"get_or_new/1","deprecated":false,"title":"get_or_new(clauses)","anchor":"get_or_new/1"},{"id":"get_or_new/2","deprecated":false,"title":"get_or_new(name, redirect_uri)","anchor":"get_or_new/2"},{"id":"init_test_client_app/0","deprecated":false,"title":"init_test_client_app()","anchor":"init_test_client_app/0"},{"id":"list_active_tokens/0","deprecated":false,"title":"list_active_tokens()","anchor":"list_active_tokens/0"},{"id":"list_clients/0","deprecated":false,"title":"list_clients()","anchor":"list_clients/0"},{"id":"list_scopes/0","deprecated":false,"title":"list_scopes()","anchor":"list_scopes/0"},{"id":"new/1","deprecated":false,"title":"new(params)","anchor":"new/1"},{"id":"new/2","deprecated":false,"title":"new(name, redirect_uris)","anchor":"new/2"},{"id":"prepare_redirect_uri/1","deprecated":false,"title":"prepare_redirect_uri(uri)","anchor":"prepare_redirect_uri/1"},{"id":"prepare_redirect_uris/1","deprecated":false,"title":"prepare_redirect_uris(other)","anchor":"prepare_redirect_uris/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Provider.OAuth","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Provider.OAuth","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Provider.OAuth","nodeGroups":[{"name":"Functions","nodes":[{"id":"redirect_uri_validate/1","deprecated":false,"title":"redirect_uri_validate(arg1)","anchor":"redirect_uri_validate/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.OpenScience","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".OpenScience","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"user_aliases/1","deprecated":false,"title":"user_aliases(user)","anchor":"user_aliases/1"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.APIs","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.APIs","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.APIs","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","deprecated":false,"title":"fetch(url, opts \\\\ [])","anchor":"fetch/2"},{"id":"fetch_crossref/1","deprecated":false,"title":"fetch_crossref(url)","anchor":"fetch_crossref/1"},{"id":"fetch_orcid_for_all_known_scientists/1","deprecated":false,"title":"fetch_orcid_for_all_known_scientists(opts \\\\ [])","anchor":"fetch_orcid_for_all_known_scientists/1"},{"id":"fetch_orcid_latest/3","deprecated":false,"title":"fetch_orcid_latest(user, media, opts \\\\ [])","anchor":"fetch_orcid_latest/3"},{"id":"fetch_orcid_record/3","deprecated":false,"title":"fetch_orcid_record(user, orcid_user_media, opts \\\\ [])","anchor":"fetch_orcid_record/3"},{"id":"fetch_orcid_works/3","deprecated":false,"title":"fetch_orcid_works(user, orcid_user_media, opts \\\\ [])","anchor":"fetch_orcid_works/3"},{"id":"find_orcid_id/1","deprecated":false,"title":"find_orcid_id(aliases)","anchor":"find_orcid_id/1"},{"id":"is_doi?/1","deprecated":false,"title":"is_doi?(url)","anchor":"is_doi?/1"},{"id":"is_pub_id_or_uri_match?/1","deprecated":false,"title":"is_pub_id_or_uri_match?(url)","anchor":"is_pub_id_or_uri_match?/1"},{"id":"maybe_fetch/1","deprecated":false,"title":"maybe_fetch(url)","anchor":"maybe_fetch/1"},{"id":"open_alex_fetch_topics/1","deprecated":false,"title":"open_alex_fetch_topics(orcid_id)","anchor":"open_alex_fetch_topics/1"},{"id":"pub_id_and_uri_matchers/0","deprecated":false,"title":"pub_id_and_uri_matchers()","anchor":"pub_id_and_uri_matchers/0"},{"id":"pub_id_matcher/1","deprecated":false,"title":"pub_id_matcher(type)","anchor":"pub_id_matcher/1"},{"id":"pub_id_matchers/0","deprecated":false,"title":"pub_id_matchers()","anchor":"pub_id_matchers/0"},{"id":"pub_uri_matchers/0","deprecated":false,"title":"pub_uri_matchers()","anchor":"pub_uri_matchers/0"},{"id":"trigger/3","deprecated":false,"title":"trigger(atom, user, media)","anchor":"trigger/3"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.Fake","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.Fake"},{"id":"Bonfire.OpenScience.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"declared_nav/0"}],"key":"functions"}]},{"id":"Bonfire.Pages","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Pages","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/1","deprecated":false,"title":"create(options \\\\ [])","anchor":"create/1"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters \\\\ [], opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"page_path/2","deprecated":false,"title":"page_path(page, opts \\\\ [])","anchor":"page_path/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :page)","anchor":"run_epic/4"},{"id":"slug/1","deprecated":false,"title":"slug(title)","anchor":"slug/1"},{"id":"summary/1","deprecated":false,"title":"summary(page)","anchor":"summary/1"}],"key":"functions"}]},{"id":"Bonfire.Pages.Acts.Page.Create","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Acts.Page.Create","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Acts.Page.Create"},{"id":"Bonfire.Pages.Acts.Section.Upsert","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Acts.Section.Upsert","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Acts.Section.Upsert"},{"id":"Bonfire.Pages.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Pages.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Pages.Page","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Page","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Page","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(page \\\\ %Page{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Pages.Section","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Section","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Section","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(section \\\\ %Section{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Pages.Sections","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Sections","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Sections","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters \\\\ [], opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put_in_page/3","deprecated":false,"title":"put_in_page(section_id, page_id, position \\\\ nil)","anchor":"put_in_page/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"remove_from_page/2","deprecated":false,"title":"remove_from_page(section_id, page_id)","anchor":"remove_from_page/2"},{"id":"upsert/1","deprecated":false,"title":"upsert(options \\\\ [])","anchor":"upsert/1"}],"key":"functions"}]},{"id":"Bonfire.Pages.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Poll","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Poll","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Poll.Acts.Choices.Upsert","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Acts.Choices.Upsert","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Acts.Choices.Upsert"},{"id":"Bonfire.Poll.Choice","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Choice","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Choice","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(section \\\\ %Choice{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Choices","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Choices","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Choices","nodeGroups":[{"name":"Functions","nodes":[{"id":"put_choice/3","deprecated":false,"title":"put_choice(choice, question, position \\\\ nil)","anchor":"put_choice/3"},{"id":"simple_create_and_put/4","deprecated":false,"title":"simple_create_and_put(index \\\\ nil, choices_or_choice_attrs, question_id, opts)","anchor":"simple_create_and_put/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Fake"},{"id":"Bonfire.Poll.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Poll.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"negative_score_info/0","deprecated":false,"title":"negative_score_info()","anchor":"negative_score_info/0"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Poll.Question","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Question","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Question","nodeGroups":[{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Question.Create","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Question.Create","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Question.Create"},{"id":"Bonfire.Poll.Questions","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Questions","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Questions","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(question \\\\ %Bonfire.Poll.Question{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(options \\\\ [])","anchor":"create/1"},{"id":"create_simple/1","deprecated":false,"title":"create_simple(question)","anchor":"create_simple/1"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ nil)","anchor":"query/2"},{"id":"query_paginated/2","deprecated":false,"title":"query_paginated(filters, opts \\\\ [])","anchor":"query_paginated/2"},{"id":"read/2","deprecated":false,"title":"read(post_id, opts_or_socket_or_current_user \\\\ [])","anchor":"read/2"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :question)","anchor":"run_epic/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Poll.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Poll.Vote","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Vote","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Vote","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(vote \\\\ %Vote{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Votes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Votes","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Votes","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_voter/2","deprecated":false,"title":"by_voter(subject, opts \\\\ [])","anchor":"by_voter/2"},{"id":"calculate_total/3","deprecated":false,"title":"calculate_total(votes, weighting, sum \\\\ 0)","anchor":"calculate_total/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"get_average_base_score/2","deprecated":false,"title":"get_average_base_score(total, num_voters)","anchor":"get_average_base_score/2"},{"id":"get_average_emoji/4","deprecated":false,"title":"get_average_emoji(total, num_voters, question, scores \\\\ scores())","anchor":"get_average_emoji/4"},{"id":"get_score/2","deprecated":false,"title":"get_score(value, scores \\\\ scores())","anchor":"get_score/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"register_vote_choice/4","deprecated":false,"title":"register_vote_choice(voter, question, choice, opts \\\\ [])","anchor":"register_vote_choice/4"},{"id":"scores/0","deprecated":false,"title":"scores()","anchor":"scores/0"},{"id":"send_vote_activity/4","deprecated":false,"title":"send_vote_activity(voter, question, registered_votes, opts)","anchor":"send_vote_activity/4"},{"id":"vote/4","deprecated":false,"title":"vote(voter, question, choices, opts \\\\ [])","anchor":"vote/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Posts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Posts","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, post)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/4","deprecated":false,"title":"ap_receive_activity(creator, activity, object, circles \\\\ [])","anchor":"ap_receive_activity/4"},{"id":"changeset/4","deprecated":false,"title":"changeset(action, attrs, creator \\\\ nil, preset \\\\ nil)","anchor":"changeset/4"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"delete/2","deprecated":false,"title":"delete(object, opts \\\\ [])","anchor":"delete/2"},{"id":"draft/2","deprecated":false,"title":"draft(creator, attrs)","anchor":"draft/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/2","deprecated":false,"title":"indexing_object_format(post, opts \\\\ [])","anchor":"indexing_object_format/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"prepare_post_attrs/1","deprecated":false,"title":"prepare_post_attrs(attrs)","anchor":"prepare_post_attrs/1"},{"id":"publish/1","deprecated":false,"title":"publish(opts)","anchor":"publish/1"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ nil)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_paginated/2","deprecated":false,"title":"query_paginated(filters, opts \\\\ [])","anchor":"query_paginated/2"},{"id":"read/2","deprecated":false,"title":"read(post_id, opts \\\\ [])","anchor":"read/2"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(type, options \\\\ [], on \\\\ :post)","anchor":"run_epic/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"search_query/2","deprecated":false,"title":"search_query(search, opts \\\\ [])","anchor":"search_query/2"}],"key":"functions"}]},{"id":"Bonfire.Posts.Acts.Posts.Publish","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Acts.Posts.Publish","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Acts.Posts.Publish"},{"id":"Bonfire.Posts.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_comment!/4","deprecated":false,"title":"fake_comment!(user, reply_to, boundary \\\\ nil, attrs \\\\ nil)","anchor":"fake_comment!/4"},{"id":"fake_post!/4","deprecated":false,"title":"fake_post!(user, boundary \\\\ nil, attrs \\\\ nil, opts \\\\ [])","anchor":"fake_post!/4"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Posts.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Posts.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Posts.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"post_changeset/2","deprecated":false,"title":"post_changeset(attrs \\\\ %{}, creator)","anchor":"post_changeset/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"write_feedback/2","deprecated":false,"title":"write_feedback(text, socket)","anchor":"write_feedback/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Quantify"},{"id":"Bonfire.Quantify.GraphQL.Hydration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.GraphQL.Hydration","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.GraphQL.Hydration","nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measure","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measure","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measure","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"copy/1","deprecated":false,"title":"copy(measure)","anchor":"copy/1"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, unit, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(measure, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/2","deprecated":false,"title":"validate_changeset(measure \\\\ %__MODULE__{}, attrs)","anchor":"validate_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measures","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measures","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measures","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, unit, attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(measure, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measures.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measures.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measures.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"inc_quantity/2","deprecated":false,"title":"inc_quantity(id, amount)","anchor":"inc_quantity/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_measure!/3","deprecated":false,"title":"fake_measure!(user, unit \\\\ nil, overrides \\\\ %{})","anchor":"fake_measure!/3"},{"id":"fake_unit!/3","deprecated":false,"title":"fake_unit!(user, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_unit!/3"},{"id":"measure/1","deprecated":false,"title":"measure(overrides \\\\ %{})","anchor":"measure/1"},{"id":"measure_input/2","deprecated":false,"title":"measure_input(unit \\\\ nil, overrides \\\\ %{})","anchor":"measure_input/2"},{"id":"unit/1","deprecated":false,"title":"unit(base \\\\ %{})","anchor":"unit/1"},{"id":"unit_input/1","deprecated":false,"title":"unit_input(base \\\\ %{})","anchor":"unit_input/1"},{"id":"unit_name/0","deprecated":false,"title":"unit_name()","anchor":"unit_name/0"},{"id":"unit_symbol/0","deprecated":false,"title":"unit_symbol()","anchor":"unit_symbol/0"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Unit","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Unit","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Unit","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, context, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(unit, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Units","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Units","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Units","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, context, attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get_or_create/2","deprecated":false,"title":"get_or_create(unit, user \\\\ nil)","anchor":"get_or_create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(unit)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(unit, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Units.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Units.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Units.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Search","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search","sections":[{"id":"Development & Deployment Documentation","anchor":"module-development-deployment-documentation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Search","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter/0","deprecated":false,"title":"adapter()","anchor":"adapter/0"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"default_types/1","deprecated":false,"title":"default_types(opts)","anchor":"default_types/1"},{"id":"run_search_db/3","deprecated":false,"title":"run_search_db(search, types, opts)","anchor":"run_search_db/3"},{"id":"search/2","deprecated":false,"title":"search(string, opts_or_index \\\\ nil)","anchor":"search/2"},{"id":"search/4","deprecated":false,"title":"search(string, opts \\\\ %{}, calculate_facets, filter_facets)","anchor":"search/4"},{"id":"search_by_type/3","deprecated":false,"title":"search_by_type(tag_search, facets \\\\ nil, opts \\\\ [])","anchor":"search_by_type/3"}],"key":"functions"}]},{"id":"Bonfire.Search.Acts.Queue","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Acts.Queue","sections":[],"nested_context":"Bonfire","nested_title":".Search.Acts.Queue","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_indexable_object/2","deprecated":false,"title":"maybe_indexable_object(object, current_user)","anchor":"maybe_indexable_object/2"},{"id":"maybe_unindex/1","deprecated":false,"title":"maybe_unindex(object)","anchor":"maybe_unindex/1"},{"id":"prepare_object/1","deprecated":false,"title":"prepare_object(thing)","anchor":"prepare_object/1"}],"key":"functions"}]},{"id":"Bonfire.Search.Fuzzy","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Fuzzy","sections":[],"nested_context":"Bonfire","nested_title":".Search.Fuzzy","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_search/4","deprecated":false,"title":"do_search(q, opts, calculate_facets, facet_filters)","anchor":"do_search/4"},{"id":"search/4","deprecated":false,"title":"search(q, opts \\\\ %{limit: 20}, calculate_facets \\\\ [\"index_type\"], facet_filters \\\\ nil)","anchor":"search/4"},{"id":"search_filtered/2","deprecated":false,"title":"search_filtered(q, facet_filters)","anchor":"search_filtered/2"}],"key":"functions"}]},{"id":"Bonfire.Search.HTTP","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.HTTP","sections":[],"nested_context":"Bonfire","nested_title":".Search.HTTP","nodeGroups":[{"name":"Functions","nodes":[{"id":"http_adapter/0","deprecated":false,"title":"http_adapter()","anchor":"http_adapter/0"},{"id":"http_error/5","deprecated":false,"title":"http_error(arg1, http_method, message, object, url)","anchor":"http_error/5"},{"id":"http_request/4","deprecated":false,"title":"http_request(http_method, url, headers, object \\\\ nil)","anchor":"http_request/4"}],"key":"functions"}]},{"id":"Bonfire.Search.Indexer","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Indexer","sections":[],"nested_context":"Bonfire","nested_title":".Search.Indexer","nodeGroups":[{"name":"Functions","nodes":[{"id":"host/1","deprecated":false,"title":"host(url)","anchor":"host/1"},{"id":"index_public_object/1","deprecated":false,"title":"index_public_object(object)","anchor":"index_public_object/1"},{"id":"init_index/3","deprecated":false,"title":"init_index(index_name \\\\ \"public\", fail_silently \\\\ false, adapter \\\\ adapter())","anchor":"init_index/3"},{"id":"maybe_delete_object/2","deprecated":false,"title":"maybe_delete_object(object, index_name \\\\ \"public\")","anchor":"maybe_delete_object/2"},{"id":"maybe_index_object/1","deprecated":false,"title":"maybe_index_object(object)","anchor":"maybe_index_object/1"},{"id":"maybe_indexable_and_discoverable/2","deprecated":false,"title":"maybe_indexable_and_discoverable(creator, object)","anchor":"maybe_indexable_and_discoverable/2"},{"id":"maybe_indexable_object/1","deprecated":false,"title":"maybe_indexable_object(object)","anchor":"maybe_indexable_object/1"}],"key":"functions"}]},{"id":"Bonfire.Search.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Search.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"content_live_search/6","deprecated":false,"title":"content_live_search(q, search_limit, facet_filters, extra_results, socket, opts)","anchor":"content_live_search/6"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"live_search/4","deprecated":false,"title":"live_search(q, search_limit \\\\ 20, facet_filters \\\\ nil, socket)","anchor":"live_search/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Search.Meili","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Meili","sections":[],"nested_context":"Bonfire","nested_title":".Search.Meili","nodeGroups":[{"name":"Functions","nodes":[{"id":"api/4","deprecated":false,"title":"api(http_method, object, index_path, fail_silently \\\\ false)","anchor":"api/4"},{"id":"create_index/2","deprecated":false,"title":"create_index(index_name, fail_silently \\\\ false)","anchor":"create_index/2"},{"id":"delete/3","deprecated":false,"title":"delete(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"delete/3"},{"id":"facet_from_map/1","deprecated":false,"title":"facet_from_map(arg)","anchor":"facet_from_map/1"},{"id":"get/1","deprecated":false,"title":"get(object)","anchor":"get/1"},{"id":"get/3","deprecated":false,"title":"get(object, index_path, fail_silently \\\\ false)","anchor":"get/3"},{"id":"index_exists/1","deprecated":false,"title":"index_exists(index_name)","anchor":"index_exists/1"},{"id":"list_facets/1","deprecated":false,"title":"list_facets(index_name \\\\ \"public\")","anchor":"list_facets/1"},{"id":"patch/3","deprecated":false,"title":"patch(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"patch/3"},{"id":"post/3","deprecated":false,"title":"post(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"post/3"},{"id":"public_index/0","deprecated":false,"title":"public_index()","anchor":"public_index/0"},{"id":"put/3","deprecated":false,"title":"put(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"put/3"},{"id":"search/2","deprecated":false,"title":"search(string, index)","anchor":"search/2"},{"id":"search/4","deprecated":false,"title":"search(string, opts, calculate_facets, filter_facets)","anchor":"search/4"},{"id":"search_by_type/2","deprecated":false,"title":"search_by_type(tag_search, facets \\\\ nil)","anchor":"search_by_type/2"},{"id":"search_execute/2","deprecated":false,"title":"search_execute(params, index)","anchor":"search_execute/2"},{"id":"set_facets/2","deprecated":false,"title":"set_facets(index_name, facets)","anchor":"set_facets/2"},{"id":"set_searchable_fields/2","deprecated":false,"title":"set_searchable_fields(index_name, fields)","anchor":"set_searchable_fields/2"},{"id":"settings/2","deprecated":false,"title":"settings(object, index)","anchor":"settings/2"}],"key":"functions"}]},{"id":"Bonfire.Search.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Search.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Search.Stopwords","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Stopwords","sections":[],"nested_context":"Bonfire","nested_title":".Search.Stopwords","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(text, language \\\\ nil)","anchor":"filter/2"},{"id":"split_sentences/1","deprecated":false,"title":"split_sentences(text)","anchor":"split_sentences/1"},{"id":"split_words/1","deprecated":false,"title":"split_words(text)","anchor":"split_words/1"},{"id":"stop_words/1","deprecated":false,"title":"stop_words(language \\\\ \"english\")","anchor":"stop_words/1"}],"key":"functions"}]},{"id":"Bonfire.Search.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Search.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Seeder","deprecated":false,"group":"Feature extensions","title":"Bonfire.Seeder","sections":[],"nested_context":"Bonfire","nested_title":".Seeder"},{"id":"Bonfire.Social","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Social","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"federate_outgoing?/1","deprecated":false,"title":"federate_outgoing?(subject \\\\ nil)","anchor":"federate_outgoing?/1"},{"id":"federating?/1","deprecated":false,"title":"federating?(subject \\\\ nil)","anchor":"federating?/1"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"many/3","deprecated":false,"title":"many(query, paginate?, opts \\\\ [])","anchor":"many/3"},{"id":"maybe_federate/5","deprecated":false,"title":"maybe_federate(subject, verb, object, activity \\\\ nil, opts \\\\ [])","anchor":"maybe_federate/5"},{"id":"maybe_federate_and_gift_wrap_activity/3","deprecated":false,"title":"maybe_federate_and_gift_wrap_activity(subject, object, opts \\\\ [])","anchor":"maybe_federate_and_gift_wrap_activity/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Social.APActivities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.APActivities","sections":[],"nested_context":"Bonfire","nested_title":".Social.APActivities","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/4","deprecated":false,"title":"create(character, activity, object, public \\\\ nil)","anchor":"create/4"}],"key":"functions"}]},{"id":"Bonfire.Social.Activities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Activities","sections":[],"nested_context":"Bonfire","nested_title":".Social.Activities","nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_preloads/2","deprecated":false,"title":"activity_preloads(query_or_object_or_objects, opts)","anchor":"activity_preloads/2"},{"id":"activity_preloads/3","deprecated":false,"title":"activity_preloads(query_or_object_or_objects, preloads, opts)","anchor":"activity_preloads/3"},{"id":"activity_under_object/1","deprecated":false,"title":"activity_under_object(top_object)","anchor":"activity_under_object/1"},{"id":"activity_under_object/2","deprecated":false,"title":"activity_under_object(activity, object)","anchor":"activity_under_object/2"},{"id":"activity_with_object_from_assigns/1","deprecated":false,"title":"activity_with_object_from_assigns(assigns)","anchor":"activity_with_object_from_assigns/1"},{"id":"all_verb_names/0","deprecated":false,"title":"all_verb_names()","anchor":"all_verb_names/0"},{"id":"all_verb_names_extra/0","deprecated":false,"title":"all_verb_names_extra()","anchor":"all_verb_names_extra/0"},{"id":"as_permitted_for/3","deprecated":false,"title":"as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"as_permitted_for/3"},{"id":"build_assoc/3","deprecated":false,"title":"build_assoc(thing, verb, subject)","anchor":"build_assoc/3"},{"id":"build_assoc/4","deprecated":false,"title":"build_assoc(thing, verb, subject, object)","anchor":"build_assoc/4"},{"id":"by_subject_verb_object_q/3","deprecated":false,"title":"by_subject_verb_object_q(subject, verb, object)","anchor":"by_subject_verb_object_q/3"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, verb, creator, opts)","anchor":"cast/4"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"create/4","deprecated":false,"title":"create(subject, verb, object, activity_id \\\\ nil)","anchor":"create/4"},{"id":"delete/1","deprecated":false,"title":"delete(id)","anchor":"delete/1"},{"id":"delete_by_object/1","deprecated":false,"title":"delete_by_object(id)","anchor":"delete_by_object/1"},{"id":"delete_by_subject_verb_object/3","deprecated":false,"title":"delete_by_subject_verb_object(subject, verb, object)","anchor":"delete_by_subject_verb_object/3"},{"id":"fetch_cursor_value_fun/2","deprecated":false,"title":"fetch_cursor_value_fun(replied, list)","anchor":"fetch_cursor_value_fun/2"},{"id":"get/2","deprecated":false,"title":"get(id, opts)","anchor":"get/2"},{"id":"load_object/2","deprecated":false,"title":"load_object(id_or_pointer, opts \\\\ [])","anchor":"load_object/2"},{"id":"maybe_join_creator/2","deprecated":false,"title":"maybe_join_creator(query, exclude_user_ids)","anchor":"maybe_join_creator/2"},{"id":"maybe_join_subject/2","deprecated":false,"title":"maybe_join_subject(query, exclude_user_ids)","anchor":"maybe_join_subject/2"},{"id":"maybe_remove_for_deleters_feeds/1","deprecated":false,"title":"maybe_remove_for_deleters_feeds(id)","anchor":"maybe_remove_for_deleters_feeds/1"},{"id":"maybe_with_labelled/0","deprecated":false,"title":"maybe_with_labelled()","anchor":"maybe_with_labelled/0"},{"id":"object_from_activity/1","deprecated":false,"title":"object_from_activity(activity)","anchor":"object_from_activity/1"},{"id":"object_preload_activity/2","deprecated":false,"title":"object_preload_activity(object, verb \\\\ :create)","anchor":"object_preload_activity/2"},{"id":"object_preload_create_activity/1","deprecated":false,"title":"object_preload_create_activity(object)","anchor":"object_preload_create_activity/1"},{"id":"object_under_activity/2","deprecated":false,"title":"object_under_activity(activity, object)","anchor":"object_under_activity/2"},{"id":"order_cursor_fields/2","deprecated":false,"title":"order_cursor_fields(arg1, sort_order)","anchor":"order_cursor_fields/2"},{"id":"order_pagination_opts/2","deprecated":false,"title":"order_pagination_opts(sort_by, sort_order)","anchor":"order_pagination_opts/2"},{"id":"put_assoc/3","deprecated":false,"title":"put_assoc(changeset, verb, subject)","anchor":"put_assoc/3"},{"id":"put_assoc/4","deprecated":false,"title":"put_assoc(changeset, verb, subject, object)","anchor":"put_assoc/4"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts_or_current_user \\\\ [])","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_object_preload_activity/4","deprecated":false,"title":"query_object_preload_activity(q, verb \\\\ :create, object_id_field \\\\ :id, opts \\\\ [])","anchor":"query_object_preload_activity/4"},{"id":"query_object_preload_create_activity/2","deprecated":false,"title":"query_object_preload_create_activity(q, opts \\\\ [])","anchor":"query_object_preload_create_activity/2"},{"id":"query_order/4","deprecated":false,"title":"query_order(query, sort_by, sort_order, with_pins? \\\\ false)","anchor":"query_order/4"},{"id":"read/2","deprecated":false,"title":"read(query, opts \\\\ [])","anchor":"read/2"},{"id":"read_query/2","deprecated":false,"title":"read_query(query, opts \\\\ [])","anchor":"read_query/2"},{"id":"reply_to_as_permitted_for/3","deprecated":false,"title":"reply_to_as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"reply_to_as_permitted_for/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"verb_congugate/1","deprecated":false,"title":"verb_congugate(verb)","anchor":"verb_congugate/1"},{"id":"verb_display/1","deprecated":false,"title":"verb_display(verb)","anchor":"verb_display/1"},{"id":"verb_id/1","deprecated":false,"title":"verb_id(verb)","anchor":"verb_id/1"},{"id":"verb_maybe_modify/2","deprecated":false,"title":"verb_maybe_modify(verb, activity \\\\ nil)","anchor":"verb_maybe_modify/2"},{"id":"verb_name/1","deprecated":false,"title":"verb_name(slug)","anchor":"verb_name/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Activity","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Activity","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Activity","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Activity.UnderObject","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Activity.UnderObject","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Activity.UnderObject","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.AntiSpam","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.AntiSpam","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.AntiSpam","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_text_content/2","deprecated":false,"title":"all_text_content(attrs, changeset)","anchor":"all_text_content/2"},{"id":"check!/3","deprecated":false,"title":"check!(changeset, attrs, context)","anchor":"check!/3"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"},{"id":"spam?/3","deprecated":false,"title":"spam?(changeset, attrs, context)","anchor":"spam?/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Federate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Federate","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Federate","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Feeds","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Feeds","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Feeds","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"},{"id":"thread_id/1","deprecated":false,"title":"thread_id(epic)","anchor":"thread_id/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.LivePush","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.LivePush","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.LivePush","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Objects.Delete","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Objects.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Objects.Delete"},{"id":"Bonfire.Social.Acts.PostContents","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.PostContents","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.PostContents","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Sensitivity","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Sensitivity","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Sensitivity","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Threaded","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Threaded","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Threaded","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Answers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Answers","sections":[],"nested_context":"Bonfire","nested_title":".Social.Answers"},{"id":"Bonfire.Social.Bookmarks","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Bookmarks","sections":[],"nested_context":"Bonfire","nested_title":".Social.Bookmarks","nodeGroups":[{"name":"Functions","nodes":[{"id":"bookmark/3","deprecated":false,"title":"bookmark(bookmarker, bookmarked, opts \\\\ [])","anchor":"bookmark/3"},{"id":"bookmarked?/2","deprecated":false,"title":"bookmarked?(user, object)","anchor":"bookmarked?/2"},{"id":"by_bookmarked/2","deprecated":false,"title":"by_bookmarked(object, opts \\\\ [])","anchor":"by_bookmarked/2"},{"id":"by_bookmarker/2","deprecated":false,"title":"by_bookmarker(subject, opts \\\\ [])","anchor":"by_bookmarker/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unbookmark/3","deprecated":false,"title":"unbookmark(bookmarker, object, opts \\\\ [])","anchor":"unbookmark/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Bookmarks.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Bookmarks.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Bookmarks.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"bookmarker_count/1","deprecated":false,"title":"bookmarker_count(arg1)","anchor":"bookmarker_count/1"},{"id":"do_bookmark/3","deprecated":false,"title":"do_bookmark(object, params, socket)","anchor":"do_bookmark/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Boosts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Boosts","sections":[],"nested_context":"Bonfire","nested_title":".Social.Boosts","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, boost)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"boost/3","deprecated":false,"title":"boost(booster, boosted, opts \\\\ [])","anchor":"boost/3"},{"id":"boosted?/2","deprecated":false,"title":"boosted?(user, object)","anchor":"boosted?/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"date_last_boosted/2","deprecated":false,"title":"date_last_boosted(user, object)","anchor":"date_last_boosted/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(id, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"maybe_boost/3","deprecated":false,"title":"maybe_boost(booster, boosted, opts \\\\ [])","anchor":"maybe_boost/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unboost/3","deprecated":false,"title":"unboost(booster, boosted, opts \\\\ [])","anchor":"unboost/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Boosts.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Boosts.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Boosts.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_boost/3","deprecated":false,"title":"do_boost(object, params, socket)","anchor":"do_boost/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Edges","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Edges","sections":[],"nested_context":"Bonfire","nested_title":".Social.Edges","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/5","deprecated":false,"title":"changeset(schema, subject, verb, object, options)","anchor":"changeset/5"},{"id":"changeset_base/4","deprecated":false,"title":"changeset_base(schema, subject, object, options)","anchor":"changeset_base/4"},{"id":"changeset_base_with_creator/4","deprecated":false,"title":"changeset_base_with_creator(schema, subject, object, options)","anchor":"changeset_base_with_creator/4"},{"id":"changeset_extra/5","deprecated":false,"title":"changeset_extra(schema, subject, verb, object, options)","anchor":"changeset_extra/5"},{"id":"changeset_without_caretaker/5","deprecated":false,"title":"changeset_without_caretaker(schema, subject, verb, object, options)","anchor":"changeset_without_caretaker/5"},{"id":"count/3","deprecated":false,"title":"count(type, filters_or_object, opts \\\\ [])","anchor":"count/3"},{"id":"count_for_subject/4","deprecated":false,"title":"count_for_subject(type, subject, object, opts)","anchor":"count_for_subject/4"},{"id":"delete_by_both/3","deprecated":false,"title":"delete_by_both(me, schema, object)","anchor":"delete_by_both/3"},{"id":"delete_by_object/1","deprecated":false,"title":"delete_by_object(user)","anchor":"delete_by_object/1"},{"id":"delete_by_subject/1","deprecated":false,"title":"delete_by_subject(user)","anchor":"delete_by_subject/1"},{"id":"edge_module_query/2","deprecated":false,"title":"edge_module_query(schema_or_context, args)","anchor":"edge_module_query/2"},{"id":"exists?/4","deprecated":false,"title":"exists?(schema_or_context, subject, object, opts)","anchor":"exists?/4"},{"id":"filters_from_opts/1","deprecated":false,"title":"filters_from_opts(assigns)","anchor":"filters_from_opts/1"},{"id":"get/4","deprecated":false,"title":"get(schema_or_context, subject, object, opts \\\\ [])","anchor":"get/4"},{"id":"get!/4","deprecated":false,"title":"get!(schema_or_context, subject, objects, opts \\\\ [])","anchor":"get!/4"},{"id":"insert/3","deprecated":false,"title":"insert(changeset, subject \\\\ nil, object \\\\ nil)","anchor":"insert/3"},{"id":"insert/5","deprecated":false,"title":"insert(schema, subject, verb, object, options)","anchor":"insert/5"},{"id":"last/4","deprecated":false,"title":"last(schema_or_context, subject, object, opts)","anchor":"last/4"},{"id":"last_date/4","deprecated":false,"title":"last_date(type, subject, object, opts)","anchor":"last_date/4"},{"id":"put_edge_assoc/3","deprecated":false,"title":"put_edge_assoc(changeset, subject, object)","anchor":"put_edge_assoc/3"},{"id":"put_edge_assoc/4","deprecated":false,"title":"put_edge_assoc(changeset, type_of_edge_schema, subject, object)","anchor":"put_edge_assoc/4"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_parent/3","deprecated":false,"title":"query_parent(query_schema, filters, opts)","anchor":"query_parent/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Social.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Social.FeedActivities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.FeedActivities","sections":[],"nested_context":"Bonfire","nested_title":".Social.FeedActivities","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(changeset, feed_ids)","anchor":"cast/2"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, creator, opts)","anchor":"cast/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"count_subjects/2","deprecated":false,"title":"count_subjects(filters \\\\ [], opts \\\\ [])","anchor":"count_subjects/2"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"delete/1","deprecated":false,"title":"delete(filters)","anchor":"delete/1"},{"id":"delete/2","deprecated":false,"title":"delete(objects, by_field)","anchor":"delete/2"},{"id":"exclude_object_types/1","deprecated":false,"title":"exclude_object_types(extras \\\\ [])","anchor":"exclude_object_types/1"},{"id":"feed/2","deprecated":false,"title":"feed(feed, opts \\\\ [])","anchor":"feed/2"},{"id":"feed_contains?/3","deprecated":false,"title":"feed_contains?(feed_name, object, opts \\\\ [])","anchor":"feed_contains?/3"},{"id":"feed_contains_single?/3","deprecated":false,"title":"feed_contains_single?(feed_name, filters, opts)","anchor":"feed_contains_single?/3"},{"id":"feed_ids_and_opts/2","deprecated":false,"title":"feed_ids_and_opts(feed_name, opts)","anchor":"feed_ids_and_opts/2"},{"id":"feed_many_paginated/2","deprecated":false,"title":"feed_many_paginated(query, opts)","anchor":"feed_many_paginated/2"},{"id":"feed_name/2","deprecated":false,"title":"feed_name(name, current_user_or_socket)","anchor":"feed_name/2"},{"id":"feed_paginated/2","deprecated":false,"title":"feed_paginated(filters \\\\ [], opts \\\\ [])","anchor":"feed_paginated/2"},{"id":"feed_with_object/3","deprecated":false,"title":"feed_with_object(feed_name, object, opts \\\\ [])","anchor":"feed_with_object/3"},{"id":"feeds_for_activity/1","deprecated":false,"title":"feeds_for_activity(id)","anchor":"feeds_for_activity/1"},{"id":"filters_from_opts/1","deprecated":false,"title":"filters_from_opts(opts)","anchor":"filters_from_opts/1"},{"id":"get_feed_ids/1","deprecated":false,"title":"get_feed_ids(options)","anchor":"get_feed_ids/1"},{"id":"get_feed_publishes/1","deprecated":false,"title":"get_feed_publishes(options)","anchor":"get_feed_publishes/1"},{"id":"mark_all_seen/2","deprecated":false,"title":"mark_all_seen(feed_id, opts)","anchor":"mark_all_seen/2"},{"id":"maybe_feed_publish/5","deprecated":false,"title":"maybe_feed_publish(subject, verb_or_activity, object, feeds, opts)","anchor":"maybe_feed_publish/5"},{"id":"my_feed/2","deprecated":false,"title":"my_feed(opts, home_feed_ids \\\\ nil)","anchor":"my_feed/2"},{"id":"publish/4","deprecated":false,"title":"publish(subject, verb_or_activity, object, opts \\\\ [])","anchor":"publish/4"},{"id":"put_feed_publishes/2","deprecated":false,"title":"put_feed_publishes(changeset, options)","anchor":"put_feed_publishes/2"},{"id":"query/3","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ [], query \\\\ default_query())","anchor":"query/3"},{"id":"query_extras_boundarised/2","deprecated":false,"title":"query_extras_boundarised(query \\\\ nil, opts)","anchor":"query_extras_boundarised/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_object_extras_boundarised/2","deprecated":false,"title":"query_object_extras_boundarised(query \\\\ nil, opts)","anchor":"query_object_extras_boundarised/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"skip_verbs_default/0","deprecated":false,"title":"skip_verbs_default()","anchor":"skip_verbs_default/0"},{"id":"the_object/1","deprecated":false,"title":"the_object(object)","anchor":"the_object/1"},{"id":"to_feed_options/1","deprecated":false,"title":"to_feed_options(opts)","anchor":"to_feed_options/1"},{"id":"unseen_count/2","deprecated":false,"title":"unseen_count(feed_id, opts)","anchor":"unseen_count/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Feeds","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Feeds","sections":[],"nested_context":"Bonfire","nested_title":".Social.Feeds","nodeGroups":[{"name":"Types","nodes":[{"id":"feed_name/0","deprecated":false,"title":"feed_name()","anchor":"t:feed_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"admin_notifications/1","deprecated":false,"title":"admin_notifications(admin)","anchor":"admin_notifications/1"},{"id":"admins_notifications/0","deprecated":false,"title":"admins_notifications()","anchor":"admins_notifications/0"},{"id":"admins_notifications/1","deprecated":false,"title":"admins_notifications(admins)","anchor":"admins_notifications/1"},{"id":"feed_id/2","deprecated":false,"title":"feed_id(type, object)","anchor":"feed_id/2"},{"id":"feed_id!/2","deprecated":false,"title":"feed_id!(feed_name, for_subject)","anchor":"feed_id!/2"},{"id":"feed_ids/2","deprecated":false,"title":"feed_ids(feed_name, for_subjects)","anchor":"feed_ids/2"},{"id":"feed_ids_to_publish/4","deprecated":false,"title":"feed_ids_to_publish(me, boundary, assigns, reply_and_or_mentions_notifications_feeds \\\\ nil)","anchor":"feed_ids_to_publish/4"},{"id":"inbox_of_obj_creator/1","deprecated":false,"title":"inbox_of_obj_creator(object)","anchor":"inbox_of_obj_creator/1"},{"id":"maybe_create_feed/2","deprecated":false,"title":"maybe_create_feed(type, for_subject)","anchor":"maybe_create_feed/2"},{"id":"maybe_creator_notification/3","deprecated":false,"title":"maybe_creator_notification(subject, object_creator, opts \\\\ [])","anchor":"maybe_creator_notification/3"},{"id":"maybe_custom_feeds/1","deprecated":false,"title":"maybe_custom_feeds(preset_and_custom_boundary)","anchor":"maybe_custom_feeds/1"},{"id":"maybe_my_outbox_feed_id/2","deprecated":false,"title":"maybe_my_outbox_feed_id(me, boundary)","anchor":"maybe_my_outbox_feed_id/2"},{"id":"my_feed_id/2","deprecated":false,"title":"my_feed_id(type, other)","anchor":"my_feed_id/2"},{"id":"my_home_feed_ids/2","deprecated":false,"title":"my_home_feed_ids(socket_or_opts, extra_feeds \\\\ [])","anchor":"my_home_feed_ids/2"},{"id":"named_feed_id/2","deprecated":false,"title":"named_feed_id(name, opts \\\\ [])","anchor":"named_feed_id/2"},{"id":"reply_and_or_mentions_notifications_feeds/5","deprecated":false,"title":"reply_and_or_mentions_notifications_feeds(me, boundary, mentions, reply_to_creator, to_circles \\\\ [])","anchor":"reply_and_or_mentions_notifications_feeds/5"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"target_feeds/3","deprecated":false,"title":"target_feeds(changeset, creator, opts)","anchor":"target_feeds/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Feeds.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Feeds.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Feeds.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"actions_update_many/2","deprecated":false,"title":"actions_update_many(assigns_sockets, opts)","anchor":"actions_update_many/2"},{"id":"activity_update_many/2","deprecated":false,"title":"activity_update_many(assigns_sockets, opts)","anchor":"activity_update_many/2"},{"id":"assign_feed/3","deprecated":false,"title":"assign_feed(socket, assigns, opts \\\\ [])","anchor":"assign_feed/3"},{"id":"feed_assigns_maybe_async/4","deprecated":false,"title":"feed_assigns_maybe_async(other, socket, show_loader \\\\ true, reset_stream \\\\ false)","anchor":"feed_assigns_maybe_async/4"},{"id":"feed_assigns_non_live/3","deprecated":false,"title":"feed_assigns_non_live(feed_id, assigns, opts)","anchor":"feed_assigns_non_live/3"},{"id":"feed_default_assigns/2","deprecated":false,"title":"feed_default_assigns(feed_name, socket)","anchor":"feed_default_assigns/2"},{"id":"feed_extra_preloads_list/2","deprecated":false,"title":"feed_extra_preloads_list(showing_within, thread_mode \\\\ nil)","anchor":"feed_extra_preloads_list/2"},{"id":"feed_live_update_many_preloads?/0","deprecated":false,"title":"feed_live_update_many_preloads?()","anchor":"feed_live_update_many_preloads?/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, 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(attrs, _, socket)","anchor":"handle_params/3"},{"id":"insert_feed/3","deprecated":false,"title":"insert_feed(socket, feed_edges, opts \\\\ [])","anchor":"insert_feed/3"},{"id":"load_user_feed_assigns/3","deprecated":false,"title":"load_user_feed_assigns(selected_tab_and_user_id, params, socket)","anchor":"load_user_feed_assigns/3"},{"id":"load_user_feed_assigns/4","deprecated":false,"title":"load_user_feed_assigns(tab, feed_id, attrs, socket)","anchor":"load_user_feed_assigns/4"},{"id":"object_preloads/0","deprecated":false,"title":"object_preloads()","anchor":"object_preloads/0"},{"id":"paginate_feed/4","deprecated":false,"title":"paginate_feed(feed_id, attrs, socket, opts \\\\ [])","anchor":"paginate_feed/4"},{"id":"paginate_fetch_assign_default/2","deprecated":false,"title":"paginate_fetch_assign_default(opts, socket)","anchor":"paginate_fetch_assign_default/2"},{"id":"paginate_opts/3","deprecated":false,"title":"paginate_opts(attrs, socket, opts)","anchor":"paginate_opts/3"},{"id":"preload_activity_and_object_assocs/3","deprecated":false,"title":"preload_activity_and_object_assocs(feed, under, opts)","anchor":"preload_activity_and_object_assocs/3"},{"id":"remove_activity/1","deprecated":false,"title":"remove_activity(activity)","anchor":"remove_activity/1"},{"id":"reply_to_activity/2","deprecated":false,"title":"reply_to_activity(js \\\\ %JS{}, target)","anchor":"reply_to_activity/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"user_feed_assign_or_load_async/4","deprecated":false,"title":"user_feed_assign_or_load_async(tab, user_or_feed, params, socket)","anchor":"user_feed_assign_or_load_async/4"}],"key":"functions"}]},{"id":"Bonfire.Social.Flags","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Flags","sections":[],"nested_context":"Bonfire","nested_title":".Social.Flags","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, flag)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, objects)","anchor":"ap_receive_activity/3"},{"id":"by_flagged/1","deprecated":false,"title":"by_flagged(object)","anchor":"by_flagged/1"},{"id":"by_flagger/1","deprecated":false,"title":"by_flagger(subject)","anchor":"by_flagger/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"flag/3","deprecated":false,"title":"flag(flagger, flagged, opts \\\\ [])","anchor":"flag/3"},{"id":"flagged?/2","deprecated":false,"title":"flagged?(user, object)","anchor":"flagged?/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"instance_moderators/0","deprecated":false,"title":"instance_moderators()","anchor":"instance_moderators/0"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts)","anchor":"list_paginated/2"},{"id":"list_preloaded/1","deprecated":false,"title":"list_preloaded(opts)","anchor":"list_preloaded/1"},{"id":"moderators/1","deprecated":false,"title":"moderators(object)","anchor":"moderators/1"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unflag/2","deprecated":false,"title":"unflag(flagger, flagged)","anchor":"unflag/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Flags.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Flags.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Flags.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Social.Graph","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"graph_add/3","deprecated":false,"title":"graph_add(subject, object, type)","anchor":"graph_add/3"},{"id":"graph_clear/0","deprecated":false,"title":"graph_clear()","anchor":"graph_clear/0"},{"id":"graph_conn/0","deprecated":false,"title":"graph_conn()","anchor":"graph_conn/0"},{"id":"graph_distance/2","deprecated":false,"title":"graph_distance(subject, object)","anchor":"graph_distance/2"},{"id":"graph_distances/1","deprecated":false,"title":"graph_distances(subject)","anchor":"graph_distances/1"},{"id":"graph_query/2","deprecated":false,"title":"graph_query(graph_conn \\\\ graph_conn(), query)","anchor":"graph_query/2"},{"id":"graph_remove/3","deprecated":false,"title":"graph_remove(subject, object, type)","anchor":"graph_remove/3"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"},{"id":"init_and_load/0","deprecated":false,"title":"init_and_load()","anchor":"init_and_load/0"},{"id":"load_from_db/0","deprecated":false,"title":"load_from_db()","anchor":"load_from_db/0"},{"id":"maybe_applications/0","deprecated":false,"title":"maybe_applications()","anchor":"maybe_applications/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Aliases","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Aliases","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Aliases","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/3","deprecated":false,"title":"add(user, target, opts \\\\ [])","anchor":"add/3"},{"id":"all_by_object/2","deprecated":false,"title":"all_by_object(object, opts \\\\ [])","anchor":"all_by_object/2"},{"id":"all_by_subject/2","deprecated":false,"title":"all_by_subject(user, opts \\\\ [])","anchor":"all_by_subject/2"},{"id":"all_objects_by_subject/2","deprecated":false,"title":"all_objects_by_subject(user, opts \\\\ [])","anchor":"all_objects_by_subject/2"},{"id":"all_subjects_by_object/2","deprecated":false,"title":"all_subjects_by_object(object, opts \\\\ [])","anchor":"all_subjects_by_object/2"},{"id":"also_known_as?/2","deprecated":false,"title":"also_known_as?(local_ap_id, target)","anchor":"also_known_as?/2"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, target)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(subject, activity, origin_object)","anchor":"ap_receive_activity/3"},{"id":"exists?/2","deprecated":false,"title":"exists?(subject, target)","anchor":"exists?/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_aliased/2","deprecated":false,"title":"list_aliased(user, opts \\\\ [])","anchor":"list_aliased/2"},{"id":"list_aliases/2","deprecated":false,"title":"list_aliases(user, opts \\\\ [])","anchor":"list_aliases/2"},{"id":"list_my_aliased/2","deprecated":false,"title":"list_my_aliased(current_user, opts \\\\ [])","anchor":"list_my_aliased/2"},{"id":"list_my_aliases/2","deprecated":false,"title":"list_my_aliases(current_user, opts \\\\ [])","anchor":"list_my_aliases/2"},{"id":"move/2","deprecated":false,"title":"move(subject, target)","anchor":"move/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"remove/2","deprecated":false,"title":"remove(user, target)","anchor":"remove/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Aliases.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Aliases.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Aliases.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_follow!/0","deprecated":false,"title":"fake_follow!()","anchor":"fake_follow!/0"},{"id":"fake_incoming_follow!/0","deprecated":false,"title":"fake_incoming_follow!()","anchor":"fake_incoming_follow!/0"},{"id":"fake_outgoing_follow!/0","deprecated":false,"title":"fake_outgoing_follow!()","anchor":"fake_outgoing_follow!/0"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Follows","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Follows","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Follows","nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/2","deprecated":false,"title":"accept(request, opts)","anchor":"accept/2"},{"id":"accept_from/2","deprecated":false,"title":"accept_from(subject, opts)","anchor":"accept_from/2"},{"id":"all_by_object/2","deprecated":false,"title":"all_by_object(user, opts \\\\ [])","anchor":"all_by_object/2"},{"id":"all_by_subject/2","deprecated":false,"title":"all_by_subject(user, opts \\\\ [])","anchor":"all_by_subject/2"},{"id":"all_followed_outboxes/2","deprecated":false,"title":"all_followed_outboxes(user, opts \\\\ [])","anchor":"all_followed_outboxes/2"},{"id":"all_objects_by_subject/2","deprecated":false,"title":"all_objects_by_subject(user, opts \\\\ [])","anchor":"all_objects_by_subject/2"},{"id":"all_subjects_by_object/2","deprecated":false,"title":"all_subjects_by_object(user, opts \\\\ [])","anchor":"all_subjects_by_object/2"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, object)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(follower, activity, object)","anchor":"ap_receive_activity/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"follow/3","deprecated":false,"title":"follow(user, object, opts \\\\ [])","anchor":"follow/3"},{"id":"following?/2","deprecated":false,"title":"following?(subject, object)","anchor":"following?/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"ignore/2","deprecated":false,"title":"ignore(request, opts)","anchor":"ignore/2"},{"id":"list_followed/2","deprecated":false,"title":"list_followed(user, opts \\\\ [])","anchor":"list_followed/2"},{"id":"list_followers/2","deprecated":false,"title":"list_followers(user, opts \\\\ [])","anchor":"list_followers/2"},{"id":"list_my_followed/2","deprecated":false,"title":"list_my_followed(current_user, opts \\\\ [])","anchor":"list_my_followed/2"},{"id":"list_my_followers/2","deprecated":false,"title":"list_my_followers(current_user, opts \\\\ [])","anchor":"list_my_followers/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"requested?/2","deprecated":false,"title":"requested?(subject, object)","anchor":"requested?/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unfollow/3","deprecated":false,"title":"unfollow(user, object, opts \\\\ [])","anchor":"unfollow/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Follows.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Follows.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Follows.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Import","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Import","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Import","nodeGroups":[{"name":"Functions","nodes":[{"id":"import_from_csv_file/3","deprecated":false,"title":"import_from_csv_file(arg1, user, path)","anchor":"import_from_csv_file/3"},{"id":"perform/1","deprecated":false,"title":"perform(map)","anchor":"perform/1"},{"id":"perform/3","deprecated":false,"title":"perform(op, user, identifier)","anchor":"perform/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Likes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Likes","sections":[],"nested_context":"Bonfire","nested_title":".Social.Likes","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, like)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(liker, activity, object)","anchor":"ap_receive_activity/3"},{"id":"by_liked/2","deprecated":false,"title":"by_liked(object, opts \\\\ [])","anchor":"by_liked/2"},{"id":"by_liker/2","deprecated":false,"title":"by_liker(subject, opts \\\\ [])","anchor":"by_liker/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"do_like/3","deprecated":false,"title":"do_like(liker, liked, opts \\\\ [])","anchor":"do_like/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"get_or_create_emoji/2","deprecated":false,"title":"get_or_create_emoji(emoji, meta)","anchor":"get_or_create_emoji/2"},{"id":"like/3","deprecated":false,"title":"like(liker, object, opts \\\\ [])","anchor":"like/3"},{"id":"liked?/2","deprecated":false,"title":"liked?(user, object)","anchor":"liked?/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts)","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unlike/3","deprecated":false,"title":"unlike(liker, object, opts \\\\ [])","anchor":"unlike/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Likes.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Likes.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Likes.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_like/3","deprecated":false,"title":"do_like(object, params, socket)","anchor":"do_like/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"liker_count/1","deprecated":false,"title":"liker_count(arg1)","anchor":"liker_count/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Objects","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Objects","sections":[],"nested_context":"Bonfire","nested_title":".Social.Objects","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_maybe_delete/2","deprecated":false,"title":"ap_maybe_delete(creator, object)","anchor":"ap_maybe_delete/2"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"as_permitted_for/3","deprecated":false,"title":"as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"as_permitted_for/3"},{"id":"care_closures/1","deprecated":false,"title":"care_closures(ids)","anchor":"care_closures/1"},{"id":"care_taken/1","deprecated":false,"title":"care_taken(ids)","anchor":"care_taken/1"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, creator, opts)","anchor":"cast/4"},{"id":"cast_acl/3","deprecated":false,"title":"cast_acl(changeset, creator, opts)","anchor":"cast_acl/3"},{"id":"cast_basic/4","deprecated":false,"title":"cast_basic(changeset, attrs, creator, opts)","anchor":"cast_basic/4"},{"id":"cast_caretaker/2","deprecated":false,"title":"cast_caretaker(changeset, caretaker)","anchor":"cast_caretaker/2"},{"id":"cast_creator/2","deprecated":false,"title":"cast_creator(changeset, creator)","anchor":"cast_creator/2"},{"id":"cast_creator_caretaker/2","deprecated":false,"title":"cast_creator_caretaker(changeset, user)","anchor":"cast_creator_caretaker/2"},{"id":"cast_mini/4","deprecated":false,"title":"cast_mini(changeset, attrs, creator, opts)","anchor":"cast_mini/4"},{"id":"cast_publish/4","deprecated":false,"title":"cast_publish(changeset, attrs, creator, opts)","anchor":"cast_publish/4"},{"id":"cast_sensitivity/2","deprecated":false,"title":"cast_sensitivity(changeset, sensitive?)","anchor":"cast_sensitivity/2"},{"id":"changeset_named/2","deprecated":false,"title":"changeset_named(object \\\\ %{}, attrs)","anchor":"changeset_named/2"},{"id":"delete/2","deprecated":false,"title":"delete(object, opts)","anchor":"delete/2"},{"id":"delete_apply_error/2","deprecated":false,"title":"delete_apply_error(error, args)","anchor":"delete_apply_error/2"},{"id":"delete_caretaken/1","deprecated":false,"title":"delete_caretaken(main)","anchor":"delete_caretaken/1"},{"id":"do_delete/2","deprecated":false,"title":"do_delete(objects, opts \\\\ [])","anchor":"do_delete/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"filter/3","deprecated":false,"title":"filter(atom, user, query)","anchor":"filter/3"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"list_query/2","deprecated":false,"title":"list_query(type_or_query \\\\ nil, opts)","anchor":"list_query/2"},{"id":"maybe_generic_delete/3","deprecated":false,"title":"maybe_generic_delete(type, object, options \\\\ [])","anchor":"maybe_generic_delete/3"},{"id":"maybe_preload_activity_object/2","deprecated":false,"title":"maybe_preload_activity_object(pointer, opts)","anchor":"maybe_preload_activity_object/2"},{"id":"object_creator/1","deprecated":false,"title":"object_creator(object)","anchor":"object_creator/1"},{"id":"permalink/1","deprecated":false,"title":"permalink(object)","anchor":"permalink/1"},{"id":"preload_creator/1","deprecated":false,"title":"preload_creator(object)","anchor":"preload_creator/1"},{"id":"preload_reply_creator/1","deprecated":false,"title":"preload_reply_creator(object)","anchor":"preload_reply_creator/1"},{"id":"publish/5","deprecated":false,"title":"publish(creator, verb, thing, opts_or_attrs \\\\ nil, for_module \\\\ __MODULE__)","anchor":"publish/5"},{"id":"query_base/1","deprecated":false,"title":"query_base(type \\\\ nil)","anchor":"query_base/1"},{"id":"read/2","deprecated":false,"title":"read(object_id, opts)","anchor":"read/2"},{"id":"reset_preset_boundary/5","deprecated":false,"title":"reset_preset_boundary(creator, thing, previous_preset, opts_or_attrs \\\\ [], for_module \\\\ nil)","anchor":"reset_preset_boundary/5"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(type, options \\\\ [], on \\\\ :object)","anchor":"run_epic/3"},{"id":"set_boundaries/4","deprecated":false,"title":"set_boundaries(creator, thing, opts_or_attrs \\\\ [], for_module \\\\ __MODULE__)","anchor":"set_boundaries/4"},{"id":"set_name/3","deprecated":false,"title":"set_name(id, name, opts)","anchor":"set_name/3"},{"id":"set_sensitivity/2","deprecated":false,"title":"set_sensitivity(pointer, arg2)","anchor":"set_sensitivity/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Objects.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Objects.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Objects.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"load_object_assigns/1","deprecated":false,"title":"load_object_assigns(socket)","anchor":"load_object_assigns/1"},{"id":"load_object_assigns/2","deprecated":false,"title":"load_object_assigns(assigns, socket)","anchor":"load_object_assigns/2"},{"id":"not_found_fallback/3","deprecated":false,"title":"not_found_fallback(id, params, socket)","anchor":"not_found_fallback/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Pins","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Pins","sections":[],"nested_context":"Bonfire","nested_title":".Social.Pins","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, pin)","anchor":"ap_publish_activity/3"},{"id":"by_pinned/2","deprecated":false,"title":"by_pinned(object, opts \\\\ [])","anchor":"by_pinned/2"},{"id":"by_pinner/2","deprecated":false,"title":"by_pinner(subject, opts \\\\ [])","anchor":"by_pinner/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_instance_pins/1","deprecated":false,"title":"list_instance_pins(opts)","anchor":"list_instance_pins/1"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"pin/4","deprecated":false,"title":"pin(pinner, object, scope \\\\ nil, opts \\\\ [])","anchor":"pin/4"},{"id":"pinned?/2","deprecated":false,"title":"pinned?(scope, object)","anchor":"pinned?/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"rank_pin/3","deprecated":false,"title":"rank_pin(pin, scope, position)","anchor":"rank_pin/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unpin/3","deprecated":false,"title":"unpin(user, object, scope \\\\ nil)","anchor":"unpin/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Pins.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Pins.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Pins.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_pin/3","deprecated":false,"title":"do_pin(object, params, socket)","anchor":"do_pin/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.PostContents","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.PostContents","sections":[],"nested_context":"Bonfire","nested_title":".Social.PostContents","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_text_content/1","deprecated":false,"title":"all_text_content(attrs)","anchor":"all_text_content/1"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity_data, object)","anchor":"ap_receive_activity/3"},{"id":"ap_receive_attrs_prepare/4","deprecated":false,"title":"ap_receive_attrs_prepare(creator, activity_data, post_data, direct_recipients \\\\ [])","anchor":"ap_receive_attrs_prepare/4"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"cast/5","deprecated":false,"title":"cast(changeset, attrs, creator, boundary, opts)","anchor":"cast/5"},{"id":"changeset/2","deprecated":false,"title":"changeset(cs \\\\ %PostContent{}, attrs)","anchor":"changeset/2"},{"id":"diff/2","deprecated":false,"title":"diff(previous_version, current_version)","anchor":"diff/2"},{"id":"edit/3","deprecated":false,"title":"edit(current_user, id, attrs)","anchor":"edit/3"},{"id":"editor_output_content_type/1","deprecated":false,"title":"editor_output_content_type(user)","anchor":"editor_output_content_type/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_versions/1","deprecated":false,"title":"get_versions(post_content)","anchor":"get_versions/1"},{"id":"get_versions_diffed/1","deprecated":false,"title":"get_versions_diffed(post_content)","anchor":"get_versions_diffed/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"maybe_detect_languages/2","deprecated":false,"title":"maybe_detect_languages(attrs, fields \\\\ [:name, :summary, :html_body])","anchor":"maybe_detect_languages/2"},{"id":"maybe_prepare_contents/4","deprecated":false,"title":"maybe_prepare_contents(attrs, creator, boundary, opts)","anchor":"maybe_prepare_contents/4"},{"id":"merge_with_body_or_nil/2","deprecated":false,"title":"merge_with_body_or_nil(attrs, map)","anchor":"merge_with_body_or_nil/2"},{"id":"no_known_output/2","deprecated":false,"title":"no_known_output(error, args)","anchor":"no_known_output/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"prepare_text/3","deprecated":false,"title":"prepare_text(text, creator, opts)","anchor":"prepare_text/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"query_base/0","deprecated":false,"title":"query_base()","anchor":"query_base/0"},{"id":"search_query/2","deprecated":false,"title":"search_query(text, opts)","anchor":"search_query/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Requests","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Requests","sections":[],"nested_context":"Bonfire","nested_title":".Social.Requests","nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/2","deprecated":false,"title":"accept(request, opts)","anchor":"accept/2"},{"id":"all_by_object/3","deprecated":false,"title":"all_by_object(user, type, opts \\\\ [])","anchor":"all_by_object/3"},{"id":"all_by_subject/3","deprecated":false,"title":"all_by_subject(user, type, opts \\\\ [])","anchor":"all_by_subject/3"},{"id":"all_objects_by_subject/3","deprecated":false,"title":"all_objects_by_subject(user, type, opts \\\\ [])","anchor":"all_objects_by_subject/3"},{"id":"all_requested_outboxes/3","deprecated":false,"title":"all_requested_outboxes(user, type, opts \\\\ [])","anchor":"all_requested_outboxes/3"},{"id":"all_subjects_by_object/3","deprecated":false,"title":"all_subjects_by_object(user, type, opts \\\\ [])","anchor":"all_subjects_by_object/3"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, action)","anchor":"ap_publish_activity/3"},{"id":"exists?/4","deprecated":false,"title":"exists?(subject, type, object, opts \\\\ [])","anchor":"exists?/4"},{"id":"get/2","deprecated":false,"title":"get(filters, opts \\\\ [])","anchor":"get/2"},{"id":"get/4","deprecated":false,"title":"get(subject, type, object, opts \\\\ [])","anchor":"get/4"},{"id":"get!/4","deprecated":false,"title":"get!(subject, type, object, opts \\\\ [])","anchor":"get!/4"},{"id":"ignore/2","deprecated":false,"title":"ignore(request, opts)","anchor":"ignore/2"},{"id":"list_my_requested/1","deprecated":false,"title":"list_my_requested(opts)","anchor":"list_my_requested/1"},{"id":"list_my_requesters/1","deprecated":false,"title":"list_my_requesters(opts)","anchor":"list_my_requesters/1"},{"id":"list_requested/2","deprecated":false,"title":"list_requested(user, opts \\\\ [])","anchor":"list_requested/2"},{"id":"list_requesters/2","deprecated":false,"title":"list_requesters(user, opts \\\\ [])","anchor":"list_requesters/2"},{"id":"many/2","deprecated":false,"title":"many(query, opts)","anchor":"many/2"},{"id":"query/3","deprecated":false,"title":"query(filters, type \\\\ nil, opts)","anchor":"query/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"request/4","deprecated":false,"title":"request(user, type, object, opts \\\\ [])","anchor":"request/4"},{"id":"requested/2","deprecated":false,"title":"requested(request, opts \\\\ [])","anchor":"requested/2"},{"id":"requested?/3","deprecated":false,"title":"requested?(subject, type, object)","anchor":"requested?/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unrequest/3","deprecated":false,"title":"unrequest(requester, type, object)","anchor":"unrequest/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Seen","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Seen","sections":[],"nested_context":"Bonfire","nested_title":".Social.Seen","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"mark_seen/2","deprecated":false,"title":"mark_seen(subject, object)","anchor":"mark_seen/2"},{"id":"mark_unseen/2","deprecated":false,"title":"mark_unseen(subject, object)","anchor":"mark_unseen/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"seen?/2","deprecated":false,"title":"seen?(user, object)","anchor":"seen?/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Tags","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Tags","sections":[],"nested_context":"Bonfire","nested_title":".Social.Tags","nodeGroups":[{"name":"Functions","nodes":[{"id":"auto_boost/2","deprecated":false,"title":"auto_boost(categories_auto_boost, object)","anchor":"auto_boost/2"},{"id":"indexing_format_tags/1","deprecated":false,"title":"indexing_format_tags(tags)","anchor":"indexing_format_tags/1"},{"id":"maybe_auto_boost/3","deprecated":false,"title":"maybe_auto_boost(creator, category_or_categories, object)","anchor":"maybe_auto_boost/3"},{"id":"maybe_boostable_categories/2","deprecated":false,"title":"maybe_boostable_categories(creator, categories)","anchor":"maybe_boostable_categories/2"},{"id":"maybe_cast/4","deprecated":false,"title":"maybe_cast(changeset, attrs, creator, opts)","anchor":"maybe_cast/4"},{"id":"maybe_process/3","deprecated":false,"title":"maybe_process(creator, text, opts)","anchor":"maybe_process/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Threads","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Threads","sections":[],"nested_context":"Bonfire","nested_title":".Social.Threads","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_prepare/2","deprecated":false,"title":"ap_prepare(object_or_thread_or_reply_to_id, key \\\\ :thread_id)","anchor":"ap_prepare/2"},{"id":"arrange_replies/2","deprecated":false,"title":"arrange_replies(replies, opts \\\\ [])","anchor":"arrange_replies/2"},{"id":"arrange_replies_tree/2","deprecated":false,"title":"arrange_replies_tree(replies, opts \\\\ [])","anchor":"arrange_replies_tree/2"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, user, preset_or_custom_boundary)","anchor":"cast/4"},{"id":"changeset/2","deprecated":false,"title":"changeset(replied \\\\ %Replied{}, attrs)","anchor":"changeset/2"},{"id":"count_participants/2","deprecated":false,"title":"count_participants(thread_id, opts \\\\ [])","anchor":"count_participants/2"},{"id":"create_parent_replied/3","deprecated":false,"title":"create_parent_replied(changeset, replied, replied_attrs)","anchor":"create_parent_replied/3"},{"id":"filter/3","deprecated":false,"title":"filter(arg1, thread_id, query)","anchor":"filter/3"},{"id":"find_reply_to/2","deprecated":false,"title":"find_reply_to(attrs, user)","anchor":"find_reply_to/2"},{"id":"find_thread/2","deprecated":false,"title":"find_thread(attrs, user)","anchor":"find_thread/2"},{"id":"init_parent_replied/1","deprecated":false,"title":"init_parent_replied(replied_attrs)","anchor":"init_parent_replied/1"},{"id":"list_participants/3","deprecated":false,"title":"list_participants(activity_or_object, thread_or_object_id \\\\ nil, opts \\\\ [])","anchor":"list_participants/3"},{"id":"list_replies/2","deprecated":false,"title":"list_replies(thread, opts \\\\ [])","anchor":"list_replies/2"},{"id":"mark_all_seen/2","deprecated":false,"title":"mark_all_seen(filters, opts)","anchor":"mark_all_seen/2"},{"id":"maybe_re_order_result/2","deprecated":false,"title":"maybe_re_order_result(result, opts)","anchor":"maybe_re_order_result/2"},{"id":"maybe_with_pins/3","deprecated":false,"title":"maybe_with_pins(query, thread_id, opts)","anchor":"maybe_with_pins/3"},{"id":"query/2","deprecated":false,"title":"query(filter, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"re_order_using_subquery/2","deprecated":false,"title":"re_order_using_subquery(query, opts)","anchor":"re_order_using_subquery/2"},{"id":"read/2","deprecated":false,"title":"read(object_id, opts)","anchor":"read/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unseen_count/2","deprecated":false,"title":"unseen_count(filters, opts)","anchor":"unseen_count/2"},{"id":"unseen_query/2","deprecated":false,"title":"unseen_query(filters, opts)","anchor":"unseen_query/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Threads.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Threads.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Threads.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, 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(attrs, uri, socket)","anchor":"handle_params/3"},{"id":"insert_comments/3","deprecated":false,"title":"insert_comments(socket, replies, opts \\\\ [])","anchor":"insert_comments/3"},{"id":"live_more/3","deprecated":false,"title":"live_more(thread_id, paginate, socket)","anchor":"live_more/3"},{"id":"load_thread/1","deprecated":false,"title":"load_thread(socket)","anchor":"load_thread/1"},{"id":"load_thread_assigns/2","deprecated":false,"title":"load_thread_assigns(socket, thread_id \\\\ nil)","anchor":"load_thread_assigns/2"},{"id":"load_thread_maybe_async/3","deprecated":false,"title":"load_thread_maybe_async(socket_or_opts, show_loader \\\\ true, reset_stream \\\\ false)","anchor":"load_thread_maybe_async/3"},{"id":"max_depth/1","deprecated":false,"title":"max_depth(ui_compact \\\\ nil)","anchor":"max_depth/1"},{"id":"maybe_subscribe/2","deprecated":false,"title":"maybe_subscribe(socket, thread_id)","anchor":"maybe_subscribe/2"},{"id":"reply/3","deprecated":false,"title":"reply(reply_to, activity, socket)","anchor":"reply/3"},{"id":"send_thread_updates/4","deprecated":false,"title":"send_thread_updates(pid \\\\ self(), thread_id, assigns, component \\\\ Bonfire.UI.Social.ThreadLive)","anchor":"send_thread_updates/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"thread_init/1","deprecated":false,"title":"thread_init(socket)","anchor":"thread_init/1"}],"key":"functions"}]},{"id":"Bonfire.Tag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Tag","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, creator, opts)","anchor":"cast/4"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"find/2","deprecated":false,"title":"find(id, types \\\\ nil)","anchor":"find/2"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_hashtag/1","deprecated":false,"title":"get_hashtag(name)","anchor":"get_hashtag/1"},{"id":"get_or_create_hashtag/1","deprecated":false,"title":"get_or_create_hashtag(name)","anchor":"get_or_create_hashtag/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(object)","anchor":"indexing_object_format/1"},{"id":"indexing_object_format_name/1","deprecated":false,"title":"indexing_object_format_name(object)","anchor":"indexing_object_format_name/1"},{"id":"list_trending/2","deprecated":false,"title":"list_trending(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending/2"},{"id":"list_trending_reset/2","deprecated":false,"title":"list_trending_reset(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending_reset/2"},{"id":"list_trending_without_cache/2","deprecated":false,"title":"list_trending_without_cache(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending_without_cache/2"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"maybe_find_tag/3","deprecated":false,"title":"maybe_find_tag(current_user, id_or_username_or_url, types \\\\ nil)","anchor":"maybe_find_tag/3"},{"id":"maybe_find_tags/3","deprecated":false,"title":"maybe_find_tags(current_user, id_or_username_or_url, types \\\\ nil)","anchor":"maybe_find_tags/3"},{"id":"maybe_lookup_tag/2","deprecated":false,"title":"maybe_lookup_tag(id_or_username_or_url, prefix \\\\ \"@\")","anchor":"maybe_lookup_tag/2"},{"id":"maybe_put_tree_parent/3","deprecated":false,"title":"maybe_put_tree_parent(changeset, category, creator)","anchor":"maybe_put_tree_parent/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(user, thing, tags \\\\ nil, boost_category_mentions? \\\\ true)","anchor":"maybe_tag/4"},{"id":"maybe_taxonomy_tag/2","deprecated":false,"title":"maybe_taxonomy_tag(user, id)","anchor":"maybe_taxonomy_tag/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"search_hashtag/2","deprecated":false,"title":"search_hashtag(text, opts \\\\ [])","anchor":"search_hashtag/2"},{"id":"search_hashtag_query/2","deprecated":false,"title":"search_hashtag_query(text, opts)","anchor":"search_hashtag_query/2"},{"id":"tag_ids/1","deprecated":false,"title":"tag_ids(tags)","anchor":"tag_ids/1"},{"id":"tag_something/4","deprecated":false,"title":"tag_something(user, thing, tags, boost_or_label_category_tags? \\\\ true)","anchor":"tag_something/4"},{"id":"tag_things_changeset/2","deprecated":false,"title":"tag_things_changeset(tag, things)","anchor":"tag_things_changeset/2"},{"id":"thing_tags_changeset/2","deprecated":false,"title":"thing_tags_changeset(thing, tags)","anchor":"thing_tags_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Acts.Tag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Acts.Tag","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Acts.Tag","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Autocomplete","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Autocomplete","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Autocomplete","nodeGroups":[{"name":"Functions","nodes":[{"id":"api_tag_lookup/3","deprecated":false,"title":"api_tag_lookup(tag_search, prefix, consumer)","anchor":"api_tag_lookup/3"},{"id":"api_tag_lookup_public/4","deprecated":false,"title":"api_tag_lookup_public(tag_search, prefix, consumer, index_type)","anchor":"api_tag_lookup_public/4"},{"id":"filter_results/1","deprecated":false,"title":"filter_results(res)","anchor":"filter_results/1"},{"id":"find_all_tags/1","deprecated":false,"title":"find_all_tags(content)","anchor":"find_all_tags/1"},{"id":"maybe_find_tags/2","deprecated":false,"title":"maybe_find_tags(tag_search, index_type)","anchor":"maybe_find_tags/2"},{"id":"maybe_search/4","deprecated":false,"title":"maybe_search(tag_search, facets \\\\ nil, prefix \\\\ nil, consumer \\\\ nil)","anchor":"maybe_search/4"},{"id":"prefix_index/1","deprecated":false,"title":"prefix_index(prefix)","anchor":"prefix_index/1"},{"id":"search_or_lookup/3","deprecated":false,"title":"search_or_lookup(tag_search, index, facets \\\\ nil)","anchor":"search_or_lookup/3"},{"id":"search_prefix/2","deprecated":false,"title":"search_prefix(tag_search, prefix)","anchor":"search_prefix/2"},{"id":"search_type/2","deprecated":false,"title":"search_type(tag_search, type)","anchor":"search_type/2"},{"id":"tag_add_field/4","deprecated":false,"title":"tag_add_field(hit, consumer, prefix, username)","anchor":"tag_add_field/4"},{"id":"tag_hit_prepare/4","deprecated":false,"title":"tag_hit_prepare(hit, tag_search, prefix, consumer)","anchor":"tag_hit_prepare/4"},{"id":"tag_lookup_public/4","deprecated":false,"title":"tag_lookup_public(tag_search, index_type, prefix \\\\ nil, consumer \\\\ nil)","anchor":"tag_lookup_public/4"},{"id":"tag_search/2","deprecated":false,"title":"tag_search(tag_search, tag_prefix)","anchor":"tag_search/2"},{"id":"tag_search_from_tags/1","deprecated":false,"title":"tag_search_from_tags(text)","anchor":"tag_search_from_tags/1"},{"id":"tag_search_from_text/2","deprecated":false,"title":"tag_search_from_text(text, prefix)","anchor":"tag_search_from_text/2"},{"id":"tags_split/1","deprecated":false,"title":"tags_split(text)","anchor":"tags_split/1"},{"id":"try_all_prefixes/1","deprecated":false,"title":"try_all_prefixes(content)","anchor":"try_all_prefixes/1"},{"id":"try_prefixes/1","deprecated":false,"title":"try_prefixes(content)","anchor":"try_prefixes/1"},{"id":"try_tag_search/1","deprecated":false,"title":"try_tag_search(content)","anchor":"try_tag_search/1"},{"id":"try_tag_search/2","deprecated":false,"title":"try_tag_search(tag_prefix, words)","anchor":"try_tag_search/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.GraphQL.TagResolver","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.GraphQL.TagResolver","sections":[],"nested_context":"Bonfire","nested_title":".Tag.GraphQL.TagResolver","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_tag/2","deprecated":false,"title":"fetch_tag(info, id)","anchor":"fetch_tag/2"},{"id":"name/3","deprecated":false,"title":"name(arg1, _, arg3)","anchor":"name/3"},{"id":"summary/3","deprecated":false,"title":"summary(arg1, _, arg3)","anchor":"summary/3"},{"id":"tag/2","deprecated":false,"title":"tag(map, info)","anchor":"tag/2"},{"id":"tag_prepare/3","deprecated":false,"title":"tag_prepare(tag, page_opts, info)","anchor":"tag_prepare/3"},{"id":"tag_something/2","deprecated":false,"title":"tag_something(map, info)","anchor":"tag_something/2"},{"id":"tagged_things_edges/3","deprecated":false,"title":"tagged_things_edges(tag, page_opts, info)","anchor":"tagged_things_edges/3"},{"id":"tags_edges/3","deprecated":false,"title":"tags_edges(thing, page_opts, info)","anchor":"tags_edges/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.Hashtag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Hashtag","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Hashtag","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(hashtag \\\\ %Hashtag{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"normalize_name/1","deprecated":false,"title":"normalize_name(name)","anchor":"normalize_name/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Tag.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(creator, object, tags, mentions_are_private? \\\\ false)","anchor":"maybe_tag/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, table_or_tables, jq \\\\ :left)","anchor":"join_to/3"},{"id":"list_trending/2","deprecated":false,"title":"list_trending(since_date, opts \\\\ [])","anchor":"list_trending/2"},{"id":"queries/4","deprecated":false,"title":"queries(query, base_filters, data_filters, count_filters)","anchor":"queries/4"},{"id":"query/1","deprecated":false,"title":"query(pointable)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Simulate"},{"id":"Bonfire.Tag.Tagged","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Tagged","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Tagged","nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"},{"id":"changeset/2","deprecated":false,"title":"changeset(struct, params \\\\ %{})","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"latest/1","deprecated":false,"title":"latest(thing_id)","anchor":"latest/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"q_with_tag/1","deprecated":false,"title":"q_with_tag(tag_id)","anchor":"q_with_tag/1"},{"id":"q_with_thing/1","deprecated":false,"title":"q_with_thing(thing_id)","anchor":"q_with_thing/1"},{"id":"q_with_type/1","deprecated":false,"title":"q_with_type(types)","anchor":"q_with_type/1"},{"id":"search_query/2","deprecated":false,"title":"search_query(text, opts)","anchor":"search_query/2"},{"id":"thing_tags_insert/2","deprecated":false,"title":"thing_tags_insert(thing, tags)","anchor":"thing_tags_insert/2"},{"id":"with_tag/1","deprecated":false,"title":"with_tag(tag_id)","anchor":"with_tag/1"},{"id":"with_thing/1","deprecated":false,"title":"with_thing(thing_id)","anchor":"with_thing/1"},{"id":"with_type/1","deprecated":false,"title":"with_type(types)","anchor":"with_type/1"}],"key":"functions"}]},{"id":"Bonfire.Tag.TextContent.Formatter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.TextContent.Formatter","sections":[],"nested_context":"Bonfire","nested_title":".Tag.TextContent.Formatter","nodeGroups":[{"name":"Functions","nodes":[{"id":"escape_mention_handler/4","deprecated":false,"title":"escape_mention_handler(mention, buffer, _, _)","anchor":"escape_mention_handler/4"},{"id":"linkify/2","deprecated":false,"title":"linkify(text, options \\\\ [])","anchor":"linkify/2"},{"id":"nothing_handler/3","deprecated":false,"title":"nothing_handler(text, opts, acc)","anchor":"nothing_handler/3"},{"id":"tag_handler/4","deprecated":false,"title":"tag_handler(tag_text, buffer, opts, acc)","anchor":"tag_handler/4"},{"id":"url_handler/3","deprecated":false,"title":"url_handler(url, opts, acc)","anchor":"url_handler/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.TextContent.Process","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.TextContent.Process","sections":[],"nested_context":"Bonfire","nested_title":".Tag.TextContent.Process","nodeGroups":[{"name":"Functions","nodes":[{"id":"html_escape/2","deprecated":false,"title":"html_escape(text, type)","anchor":"html_escape/2"},{"id":"process/3","deprecated":false,"title":"process(user \\\\ nil, text, content_type \\\\ nil)","anchor":"process/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Tags.Acts.AutoBoost","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tags.Acts.AutoBoost","sections":[],"nested_context":"Bonfire","nested_title":".Tags.Acts.AutoBoost","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Telemetry","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measure, meta, _)","anchor":"handle_event/4"},{"id":"setup/2","deprecated":false,"title":"setup(env, repo_module)","anchor":"setup/2"},{"id":"setup_oban/0","deprecated":false,"title":"setup_oban()","anchor":"setup_oban/0"},{"id":"setup_opentelemetry/2","deprecated":false,"title":"setup_opentelemetry(env, repo_module)","anchor":"setup_opentelemetry/2"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.Metrics","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.Metrics","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.Metrics","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","deprecated":false,"title":"metrics()","anchor":"metrics/0"},{"id":"oban_worker_memory/0","deprecated":false,"title":"oban_worker_memory()","anchor":"oban_worker_memory/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.Storage","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.Storage","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.Storage","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"handle_event/4","deprecated":false,"title":"handle_event(event_name, data, metadata, metric)","anchor":"handle_event/4"},{"id":"metrics_history/1","deprecated":false,"title":"metrics_history(metric)","anchor":"metrics_history/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(args)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.SystemMonitor","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.SystemMonitor","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.SystemMonitor","nodeGroups":[{"name":"Functions","nodes":[{"id":"format_percent/1","deprecated":false,"title":"format_percent(percent)","anchor":"format_percent/1"},{"id":"handle_alarm/2","deprecated":false,"title":"handle_alarm(alarm_name, alarm_description)","anchor":"handle_alarm/2"},{"id":"handle_event/2","deprecated":false,"title":"handle_event(arg, state)","anchor":"handle_event/2"},{"id":"init/1","deprecated":false,"title":"init(arg)","anchor":"init/1"}],"key":"functions"}]},{"id":"Bonfire.Testing","deprecated":false,"group":"Feature extensions","title":"Bonfire.Testing","sections":[],"nested_context":"Bonfire","nested_title":".Testing","nodeGroups":[{"name":"Functions","nodes":[{"id":"configure_start_test/1","deprecated":false,"title":"configure_start_test(opts \\\\ [migrate: false])","anchor":"configure_start_test/1"}],"key":"functions"}]},{"id":"Bonfire.Testing.InsecurePW","deprecated":false,"group":"Feature extensions","title":"Bonfire.Testing.InsecurePW","sections":[],"nested_context":"Bonfire","nested_title":".Testing.InsecurePW","nodeGroups":[{"name":"Functions","nodes":[{"id":"no_user_verify/0","deprecated":false,"title":"no_user_verify()","anchor":"no_user_verify/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle","sections":[{"id":"Set up","anchor":"module-set-up"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Upcycle","nodeGroups":[{"name":"Functions","nodes":[{"id":"format_date/1","deprecated":false,"title":"format_date(date)","anchor":"format_date/1"},{"id":"involved?/2","deprecated":false,"title":"involved?(resource, context)","anchor":"involved?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"units/0","deprecated":false,"title":"units()","anchor":"units/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.IntentLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.IntentLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.IntentLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.MapLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.MapLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.MapLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.ResourceLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.ResourceLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.ResourceLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.HomeLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.InventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.TransfersLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"ActivityPub","deprecated":false,"group":"Federation","title":"ActivityPub","sections":[{"id":"Installation","anchor":"module-installation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/1","deprecated":false,"title":"accept(params)","anchor":"accept/1"},{"id":"accept_activity/1","deprecated":false,"title":"accept_activity(params)","anchor":"accept_activity/1"},{"id":"announce/1","deprecated":false,"title":"announce(params)","anchor":"announce/1"},{"id":"block/1","deprecated":false,"title":"block(params)","anchor":"block/1"},{"id":"create/1","deprecated":false,"title":"create(params)","anchor":"create/1"},{"id":"delete/3","deprecated":false,"title":"delete(object, is_local?, opts \\\\ [])","anchor":"delete/3"},{"id":"flag/1","deprecated":false,"title":"flag(params)","anchor":"flag/1"},{"id":"follow/1","deprecated":false,"title":"follow(params)","anchor":"follow/1"},{"id":"like/1","deprecated":false,"title":"like(params)","anchor":"like/1"},{"id":"move/4","deprecated":false,"title":"move(origin, target, local \\\\ true, recursing \\\\ false)","anchor":"move/4"},{"id":"reject/1","deprecated":false,"title":"reject(params)","anchor":"reject/1"},{"id":"unannounce/1","deprecated":false,"title":"unannounce(params)","anchor":"unannounce/1"},{"id":"unblock/1","deprecated":false,"title":"unblock(params)","anchor":"unblock/1"},{"id":"unfollow/1","deprecated":false,"title":"unfollow(params)","anchor":"unfollow/1"},{"id":"unlike/1","deprecated":false,"title":"unlike(params)","anchor":"unlike/1"},{"id":"update/1","deprecated":false,"title":"update(params)","anchor":"update/1"}],"key":"functions"}]},{"id":"ActivityPub.Actor","deprecated":false,"group":"Federation","title":"ActivityPub.Actor","sections":[],"nested_context":"ActivityPub","nested_title":".Actor","nodeGroups":[{"name":"Types","nodes":[{"id":"ap_id/0","deprecated":false,"title":"ap_id()","anchor":"t:ap_id/0"},{"id":"id/0","deprecated":false,"title":"id()","anchor":"t:id/0"},{"id":"pointer/0","deprecated":false,"title":"pointer()","anchor":"t:pointer/0"},{"id":"pointer_id/0","deprecated":false,"title":"pointer_id()","anchor":"t:pointer_id/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"},{"id":"username/0","deprecated":false,"title":"username()","anchor":"t:username/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"actor?/1","deprecated":false,"title":"actor?(arg1)","anchor":"actor?/1"},{"id":"actor_url/1","deprecated":false,"title":"actor_url(username)","anchor":"actor_url/1"},{"id":"also_known_as?/2","deprecated":false,"title":"also_known_as?(ap_id, actor)","anchor":"also_known_as?/2"},{"id":"check_actor_is_active/1","deprecated":false,"title":"check_actor_is_active(actor)","anchor":"check_actor_is_active/1"},{"id":"deactivate/1","deprecated":false,"title":"deactivate(actor)","anchor":"deactivate/1"},{"id":"delete/2","deprecated":false,"title":"delete(actor, is_local?)","anchor":"delete/2"},{"id":"fetch_by_username/2","deprecated":false,"title":"fetch_by_username(username, opts \\\\ [])","anchor":"fetch_by_username/2"},{"id":"format_remote_actor/1","deprecated":false,"title":"format_remote_actor(object)","anchor":"format_remote_actor/1"},{"id":"format_username/1","deprecated":false,"title":"format_username(ap_id)","anchor":"format_username/1"},{"id":"format_username/2","deprecated":false,"title":"format_username(ap_id, nick)","anchor":"format_username/2"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(id)","anchor":"get_cached/1"},{"id":"get_cached!/1","deprecated":false,"title":"get_cached!(opts)","anchor":"get_cached!/1"},{"id":"get_cached_or_fetch/1","deprecated":false,"title":"get_cached_or_fetch(username_or_uri)","anchor":"get_cached_or_fetch/1"},{"id":"get_external_followers/1","deprecated":false,"title":"get_external_followers(actor)","anchor":"get_external_followers/1"},{"id":"get_followers/1","deprecated":false,"title":"get_followers(actor)","anchor":"get_followers/1"},{"id":"get_followings/1","deprecated":false,"title":"get_followings(actor)","anchor":"get_followings/1"},{"id":"get_non_cached/1","deprecated":false,"title":"get_non_cached(opts)","anchor":"get_non_cached/1"},{"id":"invalidate_cache/1","deprecated":false,"title":"invalidate_cache(actor)","anchor":"invalidate_cache/1"},{"id":"maybe_create_actor_from_object/1","deprecated":false,"title":"maybe_create_actor_from_object(actor)","anchor":"maybe_create_actor_from_object/1"},{"id":"reactivate/1","deprecated":false,"title":"reactivate(actor)","anchor":"reactivate/1"},{"id":"save_actor_tombstone/2","deprecated":false,"title":"save_actor_tombstone(actor, tombstone)","anchor":"save_actor_tombstone/2"},{"id":"set_cache/1","deprecated":false,"title":"set_cache(actor)","anchor":"set_cache/1"},{"id":"swap_or_create_actor_tombstone/1","deprecated":false,"title":"swap_or_create_actor_tombstone(actor)","anchor":"swap_or_create_actor_tombstone/1"},{"id":"update_actor/1","deprecated":false,"title":"update_actor(actor_id)","anchor":"update_actor/1"},{"id":"update_actor/2","deprecated":false,"title":"update_actor(actor_id, data)","anchor":"update_actor/2"}],"key":"functions"}]},{"id":"ActivityPub.Config","deprecated":false,"group":"Federation","title":"ActivityPub.Config","sections":[],"nested_context":"ActivityPub","nested_title":".Config","nodeGroups":[{"name":"Functions","nodes":[{"id":"actors_and_collections/0","deprecated":false,"title":"actors_and_collections()","anchor":"actors_and_collections/0"},{"id":"collection_types/0","deprecated":false,"title":"collection_types()","anchor":"collection_types/0"},{"id":"delete/1","deprecated":false,"title":"delete(key)","anchor":"delete/1"},{"id":"env/0","deprecated":false,"title":"env()","anchor":"env/0"},{"id":"federating?/0","deprecated":false,"title":"federating?()","anchor":"federating?/0"},{"id":"get/1","deprecated":false,"title":"get(key)","anchor":"get/1"},{"id":"get/2","deprecated":false,"title":"get(key, default)","anchor":"get/2"},{"id":"get!/1","deprecated":false,"title":"get!(key)","anchor":"get!/1"},{"id":"is_in/2","deprecated":false,"title":"is_in(type, fun)","anchor":"is_in/2"},{"id":"public_uri/0","deprecated":false,"title":"public_uri()","anchor":"public_uri/0"},{"id":"public_uris/0","deprecated":false,"title":"public_uris()","anchor":"public_uris/0"},{"id":"put/2","deprecated":false,"title":"put(key, value)","anchor":"put/2"},{"id":"supported_activity_types/0","deprecated":false,"title":"supported_activity_types()","anchor":"supported_activity_types/0"},{"id":"supported_actor_types/0","deprecated":false,"title":"supported_actor_types()","anchor":"supported_actor_types/0"}],"key":"functions"}]},{"id":"ActivityPub.Config.Error","deprecated":false,"group":"Federation","title":"ActivityPub.Config.Error","sections":[],"nested_context":"ActivityPub","nested_title":".Config.Error"},{"id":"ActivityPub.Federator","deprecated":false,"group":"Federation","title":"ActivityPub.Federator","sections":[],"nested_context":"ActivityPub","nested_title":".Federator","nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/3","deprecated":false,"title":"perform(task, activity_or_module, params_or_opts \\\\ [])","anchor":"perform/3"},{"id":"publish/2","deprecated":false,"title":"publish(activity, opts \\\\ [])","anchor":"publish/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.APPublisher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.APPublisher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.APPublisher","nodeGroups":[{"name":"Functions","nodes":[{"id":"determine_inbox/4","deprecated":false,"title":"determine_inbox(user, is_public, type, num_recipients)","anchor":"determine_inbox/4"},{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(actor)","anchor":"gather_webfinger_links/1"},{"id":"is_representable?/1","deprecated":false,"title":"is_representable?(activity)","anchor":"is_representable?/1"},{"id":"maybe_federate_to_search_index/2","deprecated":false,"title":"maybe_federate_to_search_index(recipients, activity)","anchor":"maybe_federate_to_search_index/2"},{"id":"publish/3","deprecated":false,"title":"publish(actor, activity, opts \\\\ [])","anchor":"publish/3"},{"id":"publish_one/1","deprecated":false,"title":"publish_one(params)","anchor":"publish_one/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Adapter","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Adapter","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Adapter","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"c:base_url/0"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(t, t)","anchor":"c:external_followers_for_activity/2"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(ap_id)","anchor":"c:get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"c:get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"c:get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(t)","anchor":"c:get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(t)","anchor":"c:get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"c:get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"c:get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(arg1)","anchor":"c:get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(t)","anchor":"c:handle_activity/1"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(t)","anchor":"c:maybe_create_remote_actor/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(t, t)","anchor":"c:maybe_publish_object/2"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(t, t)","anchor":"c:update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(t)","anchor":"c:update_remote_actor/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"adapter/0","deprecated":false,"title":"adapter()","anchor":"adapter/0"},{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"call_or/3","deprecated":false,"title":"call_or(fun, args \\\\ [], fallback \\\\ nil)","anchor":"call_or/3"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(actor, activity)","anchor":"external_followers_for_activity/2"},{"id":"federate_actor?/3","deprecated":false,"title":"federate_actor?(actor, direction \\\\ nil, by_actor \\\\ nil)","anchor":"federate_actor?/3"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(id)","anchor":"get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(actor)","anchor":"get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(actor)","anchor":"get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(id_or_username_or_object)","anchor":"get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(activity)","anchor":"handle_activity/1"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(actor)","anchor":"maybe_create_remote_actor/1"},{"id":"maybe_handle_activity/1","deprecated":false,"title":"maybe_handle_activity(activity)","anchor":"maybe_handle_activity/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(object, manually_fetching? \\\\ false)","anchor":"maybe_publish_object/2"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(actor, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(actor)","anchor":"update_remote_actor/1"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(actor, data)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Fetcher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Fetcher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Fetcher","nodeGroups":[{"name":"Functions","nodes":[{"id":"allowed_recursion?/2","deprecated":false,"title":"allowed_recursion?(distance, max_recursion \\\\ nil)","anchor":"allowed_recursion?/2"},{"id":"cache_fetch_error/1","deprecated":false,"title":"cache_fetch_error(id)","anchor":"cache_fetch_error/1"},{"id":"enqueue_fetch/2","deprecated":false,"title":"enqueue_fetch(id, worker_attrs \\\\ %{})","anchor":"enqueue_fetch/2"},{"id":"fetch_collection/2","deprecated":false,"title":"fetch_collection(ap_id, opts \\\\ [])","anchor":"fetch_collection/2"},{"id":"fetch_fresh_object_from_id/2","deprecated":false,"title":"fetch_fresh_object_from_id(id, opts \\\\ [])","anchor":"fetch_fresh_object_from_id/2"},{"id":"fetch_object_from_id/2","deprecated":false,"title":"fetch_object_from_id(id, opts \\\\ [])","anchor":"fetch_object_from_id/2"},{"id":"fetch_objects_from_id/2","deprecated":false,"title":"fetch_objects_from_id(ids, opts \\\\ [])","anchor":"fetch_objects_from_id/2"},{"id":"fetch_outbox/2","deprecated":false,"title":"fetch_outbox(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_outbox/2"},{"id":"fetch_remote_object_from_id/2","deprecated":false,"title":"fetch_remote_object_from_id(id, options \\\\ [])","anchor":"fetch_remote_object_from_id/2"},{"id":"fetch_replies/2","deprecated":false,"title":"fetch_replies(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_replies/2"},{"id":"fetch_thread/2","deprecated":false,"title":"fetch_thread(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_thread/2"},{"id":"get_cached_object_or_fetch_ap_id/2","deprecated":false,"title":"get_cached_object_or_fetch_ap_id(id, opts \\\\ [])","anchor":"get_cached_object_or_fetch_ap_id/2"},{"id":"get_cached_object_or_fetch_pointer_id/2","deprecated":false,"title":"get_cached_object_or_fetch_pointer_id(pointer, opts \\\\ [])","anchor":"get_cached_object_or_fetch_pointer_id/2"},{"id":"maybe_fetch/2","deprecated":false,"title":"maybe_fetch(entries, opts \\\\ [])","anchor":"maybe_fetch/2"},{"id":"maybe_parse_header_url/2","deprecated":false,"title":"maybe_parse_header_url(str, type)","anchor":"maybe_parse_header_url/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/4","deprecated":false,"title":"delete(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"delete/4"},{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"http_request/5","deprecated":false,"title":"http_request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"http_request/5"},{"id":"post/4","deprecated":false,"title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"put/4","deprecated":false,"title":"put(url, body, headers \\\\ [], options \\\\ [])","anchor":"put/4"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.Connection","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.Connection","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.Connection","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter_options/2","deprecated":false,"title":"adapter_options(adapter \\\\ Tesla.Adapter.Hackney, opts)","anchor":"adapter_options/2"},{"id":"new/1","deprecated":false,"title":"new(opts \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.RateLimit","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RateLimit","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RateLimit"},{"id":"ActivityPub.Federator.HTTP.RequestBuilder","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RequestBuilder","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RequestBuilder","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_param/4","deprecated":false,"title":"add_param(request, atom1, atom2, values)","anchor":"add_param/4"},{"id":"headers/2","deprecated":false,"title":"headers(request, header_list)","anchor":"headers/2"},{"id":"method/2","deprecated":false,"title":"method(request, m)","anchor":"method/2"},{"id":"opts/2","deprecated":false,"title":"opts(request, options)","anchor":"opts/2"},{"id":"url/2","deprecated":false,"title":"url(request, u)","anchor":"url/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.RetryAfter","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RetryAfter","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RetryAfter"},{"id":"ActivityPub.Federator.HTTP.Tesla","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.Tesla","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.Tesla","nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","deprecated":false,"title":"delete(client, url, opts)","anchor":"delete/3"},{"id":"delete!/3","deprecated":false,"title":"delete!(client, url, opts)","anchor":"delete!/3"},{"id":"get/3","deprecated":false,"title":"get(client, url, opts)","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(client, url, opts)","anchor":"get!/3"},{"id":"head/3","deprecated":false,"title":"head(client, url, opts)","anchor":"head/3"},{"id":"head!/3","deprecated":false,"title":"head!(client, url, opts)","anchor":"head!/3"},{"id":"options/3","deprecated":false,"title":"options(client, url, opts)","anchor":"options/3"},{"id":"options!/3","deprecated":false,"title":"options!(client, url, opts)","anchor":"options!/3"},{"id":"patch/4","deprecated":false,"title":"patch(client, url, body, opts)","anchor":"patch/4"},{"id":"patch!/4","deprecated":false,"title":"patch!(client, url, body, opts)","anchor":"patch!/4"},{"id":"post/4","deprecated":false,"title":"post(client, url, body, opts)","anchor":"post/4"},{"id":"post!/4","deprecated":false,"title":"post!(client, url, body, opts)","anchor":"post!/4"},{"id":"put/4","deprecated":false,"title":"put(client, url, body, opts)","anchor":"put/4"},{"id":"put!/4","deprecated":false,"title":"put!(client, url, body, opts)","anchor":"put!/4"},{"id":"request/2","deprecated":false,"title":"request(client \\\\ %Tesla.Client{}, options)","anchor":"request/2"},{"id":"request!/2","deprecated":false,"title":"request!(client \\\\ %Tesla.Client{}, options)","anchor":"request!/2"},{"id":"trace/3","deprecated":false,"title":"trace(client, url, opts)","anchor":"trace/3"},{"id":"trace!/3","deprecated":false,"title":"trace!(client, url, opts)","anchor":"trace!/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Publisher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Publisher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Publisher","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(t)","anchor":"c:gather_webfinger_links/1"},{"id":"is_representable?/1","deprecated":false,"title":"is_representable?(t)","anchor":"c:is_representable?/1"},{"id":"publish/2","deprecated":false,"title":"publish(t, t)","anchor":"c:publish/2"},{"id":"publish_one/1","deprecated":false,"title":"publish_one(t)","anchor":"c:publish_one/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"enqueue_one/2","deprecated":false,"title":"enqueue_one(module, params)","anchor":"enqueue_one/2"},{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(user)","anchor":"gather_webfinger_links/1"},{"id":"publish/2","deprecated":false,"title":"publish(user, activity)","anchor":"publish/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Transformer","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Transformer","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Transformer","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_emoji_tags/1","deprecated":false,"title":"add_emoji_tags(object)","anchor":"add_emoji_tags/1"},{"id":"fix_actor/1","deprecated":false,"title":"fix_actor(data)","anchor":"fix_actor/1"},{"id":"fix_addressing/1","deprecated":false,"title":"fix_addressing(object)","anchor":"fix_addressing/1"},{"id":"fix_attachments/1","deprecated":false,"title":"fix_attachments(object)","anchor":"fix_attachments/1"},{"id":"fix_content_map/1","deprecated":false,"title":"fix_content_map(object)","anchor":"fix_content_map/1"},{"id":"fix_context/2","deprecated":false,"title":"fix_context(object, options)","anchor":"fix_context/2"},{"id":"fix_emoji/1","deprecated":false,"title":"fix_emoji(object)","anchor":"fix_emoji/1"},{"id":"fix_in_reply_to/2","deprecated":false,"title":"fix_in_reply_to(object, options \\\\ [])","anchor":"fix_in_reply_to/2"},{"id":"fix_object/2","deprecated":false,"title":"fix_object(object, options \\\\ [])","anchor":"fix_object/2"},{"id":"fix_quote_url/2","deprecated":false,"title":"fix_quote_url(object, options \\\\ [])","anchor":"fix_quote_url/2"},{"id":"fix_replies/2","deprecated":false,"title":"fix_replies(data, options)","anchor":"fix_replies/2"},{"id":"fix_summary/1","deprecated":false,"title":"fix_summary(object)","anchor":"fix_summary/1"},{"id":"fix_tag/1","deprecated":false,"title":"fix_tag(object)","anchor":"fix_tag/1"},{"id":"fix_url/1","deprecated":false,"title":"fix_url(object)","anchor":"fix_url/1"},{"id":"format_input/3","deprecated":false,"title":"format_input(text, binary, options \\\\ [])","anchor":"format_input/3"},{"id":"handle_incoming/2","deprecated":false,"title":"handle_incoming(data, opts \\\\ [])","anchor":"handle_incoming/2"},{"id":"maybe_handle_other_activity/1","deprecated":false,"title":"maybe_handle_other_activity(data)","anchor":"maybe_handle_other_activity/1"},{"id":"prepare_outgoing/1","deprecated":false,"title":"prepare_outgoing(data)","anchor":"prepare_outgoing/1"},{"id":"preserve_privacy_of_outgoing/2","deprecated":false,"title":"preserve_privacy_of_outgoing(other, target_instance_uri \\\\ nil)","anchor":"preserve_privacy_of_outgoing/2"},{"id":"replies/1","deprecated":false,"title":"replies(arg1)","anchor":"replies/1"},{"id":"set_replies/1","deprecated":false,"title":"set_replies(object)","anchor":"set_replies/1"},{"id":"take_emoji_tags/1","deprecated":false,"title":"take_emoji_tags(arg1)","anchor":"take_emoji_tags/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.WebFinger","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.WebFinger","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.WebFinger","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/1","deprecated":false,"title":"base_url(account)","anchor":"base_url/1"},{"id":"finger/1","deprecated":false,"title":"finger(account)","anchor":"finger/1"},{"id":"output/1","deprecated":false,"title":"output(resource)","anchor":"output/1"},{"id":"represent_user/1","deprecated":false,"title":"represent_user(actor)","anchor":"represent_user/1"},{"id":"webfinger_from_json/1","deprecated":false,"title":"webfinger_from_json(doc)","anchor":"webfinger_from_json/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Worker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Worker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Worker","nodeGroups":[{"name":"Functions","nodes":[{"id":"worker_args/1","deprecated":false,"title":"worker_args(queue)","anchor":"worker_args/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.PublisherWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.PublisherWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.PublisherWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.ReceiverWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.ReceiverWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.ReceiverWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.RemoteFetcherWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.RemoteFetcherWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Fixtures","deprecated":false,"group":"Federation","title":"ActivityPub.Fixtures","sections":[],"nested_context":"ActivityPub","nested_title":".Fixtures","nodeGroups":[{"name":"Functions","nodes":[{"id":"file/1","deprecated":false,"title":"file(path)","anchor":"file/1"},{"id":"fixtures/0","deprecated":false,"title":"fixtures()","anchor":"fixtures/0"},{"id":"fixtures_generic/0","deprecated":false,"title":"fixtures_generic()","anchor":"fixtures_generic/0"},{"id":"fixtures_get/0","deprecated":false,"title":"fixtures_get()","anchor":"fixtures_get/0"},{"id":"get/4","deprecated":false,"title":"get(url, query \\\\ [], body \\\\ [], headers \\\\ [])","anchor":"get/4"},{"id":"head/4","deprecated":false,"title":"head(url, query, body, headers)","anchor":"head/4"},{"id":"insert/1","deprecated":false,"title":"insert(url)","anchor":"insert/1"},{"id":"insert_all/0","deprecated":false,"title":"insert_all()","anchor":"insert_all/0"},{"id":"insert_file/1","deprecated":false,"title":"insert_file(file)","anchor":"insert_file/1"},{"id":"insert_json/1","deprecated":false,"title":"insert_json(data)","anchor":"insert_json/1"},{"id":"maybe_get_local/4","deprecated":false,"title":"maybe_get_local(url, query, body, headers)","anchor":"maybe_get_local/4"},{"id":"mock_global/1","deprecated":false,"title":"mock_global(fun)","anchor":"mock_global/1"},{"id":"none/4","deprecated":false,"title":"none(url, query, body, headers)","anchor":"none/4"},{"id":"post/4","deprecated":false,"title":"post(url, query \\\\ [], body \\\\ [], headers \\\\ [])","anchor":"post/4"},{"id":"request/1","deprecated":false,"title":"request(env)","anchor":"request/1"}],"key":"functions"}]},{"id":"ActivityPub.Instances","deprecated":false,"group":"Federation","title":"ActivityPub.Instances","sections":[],"nested_context":"ActivityPub","nested_title":".Instances","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter_reachable/1","deprecated":false,"title":"filter_reachable(urls_or_hosts)","anchor":"filter_reachable/1"},{"id":"host/1","deprecated":false,"title":"host(url_or_host)","anchor":"host/1"},{"id":"reachability_datetime_threshold/0","deprecated":false,"title":"reachability_datetime_threshold()","anchor":"reachability_datetime_threshold/0"},{"id":"reachable?/1","deprecated":false,"title":"reachable?(url_or_host)","anchor":"reachable?/1"},{"id":"set_consistently_unreachable/1","deprecated":false,"title":"set_consistently_unreachable(url_or_host)","anchor":"set_consistently_unreachable/1"},{"id":"set_reachable/1","deprecated":false,"title":"set_reachable(url_or_host)","anchor":"set_reachable/1"},{"id":"set_unreachable/2","deprecated":false,"title":"set_unreachable(url_or_host, unreachable_since \\\\ nil)","anchor":"set_unreachable/2"}],"key":"functions"}]},{"id":"ActivityPub.Instances.Instance","deprecated":false,"group":"Federation","title":"ActivityPub.Instances.Instance","sections":[],"nested_context":"ActivityPub","nested_title":".Instances.Instance","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(struct, params \\\\ %{})","anchor":"changeset/2"},{"id":"do_set_reachable/1","deprecated":false,"title":"do_set_reachable(host)","anchor":"do_set_reachable/1"},{"id":"filter_reachable/1","deprecated":false,"title":"filter_reachable(urls_or_hosts)","anchor":"filter_reachable/1"},{"id":"host/1","deprecated":false,"title":"host(url_or_host)","anchor":"host/1"},{"id":"reachable?/1","deprecated":false,"title":"reachable?(uri_or_host)","anchor":"reachable?/1"},{"id":"set_reachable/1","deprecated":false,"title":"set_reachable(uri_or_host)","anchor":"set_reachable/1"},{"id":"set_unreachable/2","deprecated":false,"title":"set_unreachable(uri_or_host, unreachable_since \\\\ nil)","anchor":"set_unreachable/2"}],"key":"functions"}]},{"id":"ActivityPub.MRF","deprecated":false,"group":"Federation","title":"ActivityPub.MRF","sections":[{"id":"Writing your own MRF Policy","anchor":"module-writing-your-own-mrf-policy"}],"nested_context":"ActivityPub","nested_title":".MRF","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(t, boolean)","anchor":"c:filter/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(object, is_local?)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(policies, object, is_local?)","anchor":"filter/3"},{"id":"get_policies/0","deprecated":false,"title":"get_policies()","anchor":"get_policies/0"},{"id":"subdomain_match?/2","deprecated":false,"title":"subdomain_match?(domains, host)","anchor":"subdomain_match?/2"},{"id":"subdomains_regex/1","deprecated":false,"title":"subdomains_regex(domains)","anchor":"subdomains_regex/1"}],"key":"functions"}]},{"id":"ActivityPub.MRF.SimplePolicy","deprecated":false,"group":"Federation","title":"ActivityPub.MRF.SimplePolicy","sections":[],"nested_context":"ActivityPub","nested_title":".MRF.SimplePolicy","nodeGroups":[{"name":"Functions","nodes":[{"id":"check_reject/2","deprecated":false,"title":"check_reject(actor_info, object \\\\ nil)","anchor":"check_reject/2"}],"key":"functions"}]},{"id":"ActivityPub.Object","deprecated":false,"group":"Federation","title":"ActivityPub.Object","sections":[],"nested_context":"ActivityPub","nested_title":".Object","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"actor_from_data/1","deprecated":false,"title":"actor_from_data(actor)","anchor":"actor_from_data/1"},{"id":"actor_id_from_data/1","deprecated":false,"title":"actor_id_from_data(id)","anchor":"actor_id_from_data/1"},{"id":"all/1","deprecated":false,"title":"all(filters)","anchor":"all/1"},{"id":"changeset/1","deprecated":false,"title":"changeset(attrs)","anchor":"changeset/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(object, attrs)","anchor":"changeset/2"},{"id":"common_changeset/1","deprecated":false,"title":"common_changeset(object)","anchor":"common_changeset/1"},{"id":"delete/1","deprecated":false,"title":"delete(object)","anchor":"delete/1"},{"id":"do_insert/1","deprecated":false,"title":"do_insert(attrs)","anchor":"do_insert/1"},{"id":"do_update_existing/2","deprecated":false,"title":"do_update_existing(object, attrs)","anchor":"do_update_existing/2"},{"id":"fetch_latest_block/2","deprecated":false,"title":"fetch_latest_block(map1, map2)","anchor":"fetch_latest_block/2"},{"id":"fetch_latest_follow/2","deprecated":false,"title":"fetch_latest_follow(follower_id, followed_id)","anchor":"fetch_latest_follow/2"},{"id":"get_activity_for_object_ap_id/2","deprecated":false,"title":"get_activity_for_object_ap_id(ap_id, verb \\\\ \"Create\")","anchor":"get_activity_for_object_ap_id/2"},{"id":"get_ap_id/1","deprecated":false,"title":"get_ap_id(_)","anchor":"get_ap_id/1"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(id)","anchor":"get_cached/1"},{"id":"get_cached!/1","deprecated":false,"title":"get_cached!(opts)","anchor":"get_cached!/1"},{"id":"get_existing_announce/2","deprecated":false,"title":"get_existing_announce(actor, map)","anchor":"get_existing_announce/2"},{"id":"get_existing_like/2","deprecated":false,"title":"get_existing_like(actor, object_id)","anchor":"get_existing_like/2"},{"id":"get_follow_activity/2","deprecated":false,"title":"get_follow_activity(follow_object, followed)","anchor":"get_follow_activity/2"},{"id":"get_inbox/2","deprecated":false,"title":"get_inbox(all_or_instance_or_actor_url, page \\\\ 1)","anchor":"get_inbox/2"},{"id":"get_outbox_for_actor/2","deprecated":false,"title":"get_outbox_for_actor(ap_id, page \\\\ 1)","anchor":"get_outbox_for_actor/2"},{"id":"get_outbox_for_instance/1","deprecated":false,"title":"get_outbox_for_instance(page \\\\ 1)","anchor":"get_outbox_for_instance/1"},{"id":"get_uncached/1","deprecated":false,"title":"get_uncached(opts)","anchor":"get_uncached/1"},{"id":"hard_delete/1","deprecated":false,"title":"hard_delete(object)","anchor":"hard_delete/1"},{"id":"hashtags/1","deprecated":false,"title":"hashtags(arg1)","anchor":"hashtags/1"},{"id":"invalidate_cache/1","deprecated":false,"title":"invalidate_cache(object)","anchor":"invalidate_cache/1"},{"id":"is_deleted?/1","deprecated":false,"title":"is_deleted?(data)","anchor":"is_deleted?/1"},{"id":"make_tombstone/2","deprecated":false,"title":"make_tombstone(map, deleted \\\\ DateTime.utc_now())","anchor":"make_tombstone/2"},{"id":"maybe_fetch/2","deprecated":false,"title":"maybe_fetch(ap_id, arg2)","anchor":"maybe_fetch/2"},{"id":"maybe_upsert/3","deprecated":false,"title":"maybe_upsert(arg1, existing_object, attrs)","anchor":"maybe_upsert/3"},{"id":"normalise_tos/1","deprecated":false,"title":"normalise_tos(object)","anchor":"normalise_tos/1"},{"id":"normalize/3","deprecated":false,"title":"normalize(object, fetch_remote? \\\\ true, pointer \\\\ nil)","anchor":"normalize/3"},{"id":"normalize_actors/1","deprecated":false,"title":"normalize_actors(params)","anchor":"normalize_actors/1"},{"id":"normalize_params/3","deprecated":false,"title":"normalize_params(params, activity_id \\\\ nil, pointer \\\\ nil)","anchor":"normalize_params/3"},{"id":"object_url/1","deprecated":false,"title":"object_url(id)","anchor":"object_url/1"},{"id":"prepare_data/4","deprecated":false,"title":"prepare_data(data, local \\\\ false, pointer \\\\ nil, associated_activity \\\\ nil)","anchor":"prepare_data/4"},{"id":"query/1","deprecated":false,"title":"query(list)","anchor":"query/1"},{"id":"self_replies_ids/2","deprecated":false,"title":"self_replies_ids(object, limit)","anchor":"self_replies_ids/2"},{"id":"set_cache/1","deprecated":false,"title":"set_cache(object)","anchor":"set_cache/1"},{"id":"swap_object_with_tombstone/1","deprecated":false,"title":"swap_object_with_tombstone(object)","anchor":"swap_object_with_tombstone/1"},{"id":"update_and_set_cache/1","deprecated":false,"title":"update_and_set_cache(changeset)","anchor":"update_and_set_cache/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(object, attrs)","anchor":"update_changeset/2"},{"id":"update_existing/2","deprecated":false,"title":"update_existing(object_id, attrs)","anchor":"update_existing/2"},{"id":"update_state/3","deprecated":false,"title":"update_state(activity, type, state)","anchor":"update_state/3"}],"key":"functions"}]},{"id":"ActivityPub.Pruner","deprecated":false,"group":"Federation","title":"ActivityPub.Pruner","sections":[],"nested_context":"ActivityPub","nested_title":".Pruner","nodeGroups":[{"name":"Functions","nodes":[{"id":"prune_all/1","deprecated":false,"title":"prune_all(cutoff_days \\\\ nil)","anchor":"prune_all/1"},{"id":"prune_deletes/1","deprecated":false,"title":"prune_deletes(cutoff_days)","anchor":"prune_deletes/1"},{"id":"prune_objects/1","deprecated":false,"title":"prune_objects(options \\\\ [prune_orphaned_activities: true, keep_threads: false, keep_non_public: false])","anchor":"prune_objects/1"},{"id":"prune_orphaned_activities/0","deprecated":false,"title":"prune_orphaned_activities()","anchor":"prune_orphaned_activities/0"},{"id":"prune_removes/1","deprecated":false,"title":"prune_removes(cutoff_days)","anchor":"prune_removes/1"},{"id":"prune_stale_follow_requests/1","deprecated":false,"title":"prune_stale_follow_requests(cutoff_days)","anchor":"prune_stale_follow_requests/1"},{"id":"prune_tombstones/1","deprecated":false,"title":"prune_tombstones(cutoff_days)","anchor":"prune_tombstones/1"},{"id":"prune_undos/1","deprecated":false,"title":"prune_undos(cutoff_days)","anchor":"prune_undos/1"},{"id":"remove_embedded_objects/0","deprecated":false,"title":"remove_embedded_objects()","anchor":"remove_embedded_objects/0"}],"key":"functions"}]},{"id":"ActivityPub.Pruner.PruneDatabaseWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Pruner.PruneDatabaseWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Pruner.PruneDatabaseWorker"},{"id":"ActivityPub.Queries","deprecated":false,"group":"Federation","title":"ActivityPub.Queries","sections":[],"nested_context":"ActivityPub","nested_title":".Queries","nodeGroups":[{"name":"Types","nodes":[{"id":"query/0","deprecated":false,"title":"query()","anchor":"t:query/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"activity_by_object_ap_id/2","deprecated":false,"title":"activity_by_object_ap_id(ap_id, verb \\\\ \"Create\")","anchor":"activity_by_object_ap_id/2"},{"id":"by_actor/2","deprecated":false,"title":"by_actor(query \\\\ Object, ap_id)","anchor":"by_actor/2"},{"id":"by_ap_id/2","deprecated":false,"title":"by_ap_id(query \\\\ Object, ap_id)","anchor":"by_ap_id/2"},{"id":"by_id/2","deprecated":false,"title":"by_id(query \\\\ Object, id)","anchor":"by_id/2"},{"id":"by_object_id/2","deprecated":false,"title":"by_object_id(query \\\\ Object, object_id)","anchor":"by_object_id/2"},{"id":"by_object_in_reply_to_id/3","deprecated":false,"title":"by_object_in_reply_to_id(query, in_reply_to_id, opts \\\\ [])","anchor":"by_object_in_reply_to_id/3"},{"id":"by_type/2","deprecated":false,"title":"by_type(query \\\\ Object, activity_type)","anchor":"by_type/2"},{"id":"exclude_type/2","deprecated":false,"title":"exclude_type(query \\\\ Object, type)","anchor":"exclude_type/2"},{"id":"find_by_object_ap_id/2","deprecated":false,"title":"find_by_object_ap_id(activities, object_ap_id)","anchor":"find_by_object_ap_id/2"},{"id":"last_follow/2","deprecated":false,"title":"last_follow(query, followed_id)","anchor":"last_follow/2"},{"id":"ordered/1","deprecated":false,"title":"ordered(query)","anchor":"ordered/1"},{"id":"replies/2","deprecated":false,"title":"replies(object, opts \\\\ [])","anchor":"replies/2"},{"id":"self_replies/1","deprecated":false,"title":"self_replies(object)","anchor":"self_replies/1"},{"id":"with_joined_activity/3","deprecated":false,"title":"with_joined_activity(query, activity_type \\\\ \"Create\", join_type \\\\ :left)","anchor":"with_joined_activity/3"},{"id":"with_joined_object/2","deprecated":false,"title":"with_joined_object(query, join_type \\\\ :inner)","anchor":"with_joined_object/2"},{"id":"with_preloaded_object/2","deprecated":false,"title":"with_preloaded_object(query, join_type \\\\ :left)","anchor":"with_preloaded_object/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Containment","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Containment","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Containment","nodeGroups":[{"name":"Functions","nodes":[{"id":"contain_child/1","deprecated":false,"title":"contain_child(arg1)","anchor":"contain_child/1"},{"id":"contain_origin/2","deprecated":false,"title":"contain_origin(id, params)","anchor":"contain_origin/2"},{"id":"contain_origin_from_id/2","deprecated":false,"title":"contain_origin_from_id(id, params)","anchor":"contain_origin_from_id/2"},{"id":"contain_uri/2","deprecated":false,"title":"contain_uri(id, data)","anchor":"contain_uri/2"},{"id":"get_object/1","deprecated":false,"title":"get_object(arg1)","anchor":"get_object/1"},{"id":"restrict_unauthenticated_access?/1","deprecated":false,"title":"restrict_unauthenticated_access?(object)","anchor":"restrict_unauthenticated_access?/1"},{"id":"restrict_unauthenticated_access?/2","deprecated":false,"title":"restrict_unauthenticated_access?(resource, kind)","anchor":"restrict_unauthenticated_access?/2"},{"id":"visible_for_user?/2","deprecated":false,"title":"visible_for_user?(object, actor)","anchor":"visible_for_user?/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Keys","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Keys","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Keys","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_public_key/2","deprecated":false,"title":"add_public_key(actor, generate_if_missing \\\\ true)","anchor":"add_public_key/2"},{"id":"cast_uri/1","deprecated":false,"title":"cast_uri(object)","anchor":"cast_uri/1"},{"id":"ensure_keys_present/1","deprecated":false,"title":"ensure_keys_present(actor)","anchor":"ensure_keys_present/1"},{"id":"fetch_public_key_for_ap_id/1","deprecated":false,"title":"fetch_public_key_for_ap_id(ap_id)","anchor":"fetch_public_key_for_ap_id/1"},{"id":"generate_rsa_pem/0","deprecated":false,"title":"generate_rsa_pem()","anchor":"generate_rsa_pem/0"},{"id":"get_public_key_for_ap_id/1","deprecated":false,"title":"get_public_key_for_ap_id(ap_id)","anchor":"get_public_key_for_ap_id/1"},{"id":"http_host/1","deprecated":false,"title":"http_host(map)","anchor":"http_host/1"},{"id":"key_id_to_actor_id/1","deprecated":false,"title":"key_id_to_actor_id(key_id)","anchor":"key_id_to_actor_id/1"},{"id":"keypair_from_pem/1","deprecated":false,"title":"keypair_from_pem(pem)","anchor":"keypair_from_pem/1"},{"id":"maybe_add_fetch_signature_headers/3","deprecated":false,"title":"maybe_add_fetch_signature_headers(headers, id, date \\\\ nil)","anchor":"maybe_add_fetch_signature_headers/3"},{"id":"public_key_decode/1","deprecated":false,"title":"public_key_decode(public_key_pem)","anchor":"public_key_decode/1"},{"id":"public_key_from_data/1","deprecated":false,"title":"public_key_from_data(actor)","anchor":"public_key_from_data/1"},{"id":"sign/2","deprecated":false,"title":"sign(actor, headers)","anchor":"sign/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Signatures","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Signatures","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Signatures","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_fresh_public_key/1","deprecated":false,"title":"fetch_fresh_public_key(conn)","anchor":"fetch_fresh_public_key/1"},{"id":"fetch_public_key/1","deprecated":false,"title":"fetch_public_key(conn)","anchor":"fetch_public_key/1"},{"id":"get_public_key/1","deprecated":false,"title":"get_public_key(conn)","anchor":"get_public_key/1"}],"key":"functions"}]},{"id":"ActivityPub.Utils","deprecated":false,"group":"Federation","title":"ActivityPub.Utils","sections":[],"nested_context":"ActivityPub","nested_title":".Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"activitypub_object_headers/0","deprecated":false,"title":"activitypub_object_headers()","anchor":"activitypub_object_headers/0"},{"id":"adapter_fallback/0","deprecated":false,"title":"adapter_fallback()","anchor":"adapter_fallback/0"},{"id":"ap_base_url/0","deprecated":false,"title":"ap_base_url()","anchor":"ap_base_url/0"},{"id":"ap_id/1","deprecated":false,"title":"ap_id(map)","anchor":"ap_id/1"},{"id":"as_local_public/0","deprecated":false,"title":"as_local_public()","anchor":"as_local_public/0"},{"id":"cache_clear/0","deprecated":false,"title":"cache_clear()","anchor":"cache_clear/0"},{"id":"cachex_fetch/4","deprecated":false,"title":"cachex_fetch(cache, key, fallback, options \\\\ [])","anchor":"cachex_fetch/4"},{"id":"error_json/3","deprecated":false,"title":"error_json(conn, error, status \\\\ 500)","anchor":"error_json/3"},{"id":"format_date/1","deprecated":false,"title":"format_date(date \\\\ NaiveDateTime.utc_now(Calendar.ISO))","anchor":"format_date/1"},{"id":"generate_id/1","deprecated":false,"title":"generate_id(type)","anchor":"generate_id/1"},{"id":"generate_object_id/0","deprecated":false,"title":"generate_object_id()","anchor":"generate_object_id/0"},{"id":"get_with_cache/4","deprecated":false,"title":"get_with_cache(get_fun, cache_bucket, key, identifier)","anchor":"get_with_cache/4"},{"id":"has_as_public?/1","deprecated":false,"title":"has_as_public?(tos)","anchor":"has_as_public?/1"},{"id":"is_uid?/1","deprecated":false,"title":"is_uid?(input)","anchor":"is_uid?/1"},{"id":"is_ulid?/1","deprecated":false,"title":"is_ulid?(str)","anchor":"is_ulid?/1"},{"id":"is_uuid?/1","deprecated":false,"title":"is_uuid?(str)","anchor":"is_uuid?/1"},{"id":"json_with_cache/6","deprecated":false,"title":"json_with_cache(conn \\\\ nil, get_fun, cache_bucket, id, ret_fn \\\\ &return_json/4, opts \\\\ [])","anchor":"json_with_cache/6"},{"id":"label_in_collection?/2","deprecated":false,"title":"label_in_collection?(label, collection)","anchor":"label_in_collection?/2"},{"id":"make_date/0","deprecated":false,"title":"make_date()","anchor":"make_date/0"},{"id":"make_json_ld_header/1","deprecated":false,"title":"make_json_ld_header(type \\\\ :object)","anchor":"make_json_ld_header/1"},{"id":"maybe_put/3","deprecated":false,"title":"maybe_put(map, key, value)","anchor":"maybe_put/3"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"},{"id":"maybe_to_string/1","deprecated":false,"title":"maybe_to_string(atom)","anchor":"maybe_to_string/1"},{"id":"ok_unwrap/2","deprecated":false,"title":"ok_unwrap(val, fallback \\\\ nil)","anchor":"ok_unwrap/2"},{"id":"public?/1","deprecated":false,"title":"public?(params)","anchor":"public?/1"},{"id":"public?/2","deprecated":false,"title":"public?(activity_data, object_data)","anchor":"public?/2"},{"id":"put_if_present/4","deprecated":false,"title":"put_if_present(map, key, value, value_function \\\\ &{:ok, &1})","anchor":"put_if_present/4"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"request_ip/1","deprecated":false,"title":"request_ip(remote_ip)","anchor":"request_ip/1"},{"id":"return_json/4","deprecated":false,"title":"return_json(conn, meta, json, opts \\\\ [])","anchor":"return_json/4"},{"id":"safe_put_in/3","deprecated":false,"title":"safe_put_in(data, keys, value)","anchor":"safe_put_in/3"},{"id":"service_actor/0","deprecated":false,"title":"service_actor()","anchor":"service_actor/0"},{"id":"service_actor!/0","deprecated":false,"title":"service_actor!()","anchor":"service_actor!/0"},{"id":"set_repo/1","deprecated":false,"title":"set_repo(repo)","anchor":"set_repo/1"},{"id":"single_ap_id/1","deprecated":false,"title":"single_ap_id(ap_id)","anchor":"single_ap_id/1"},{"id":"single_ap_id_or_object/1","deprecated":false,"title":"single_ap_id_or_object(ap_id)","anchor":"single_ap_id_or_object/1"},{"id":"stringify_keys/2","deprecated":false,"title":"stringify_keys(map, recursive \\\\ false)","anchor":"stringify_keys/2"},{"id":"uid/1","deprecated":false,"title":"uid(input)","anchor":"uid/1"}],"key":"functions"}]},{"id":"ActivityPub.Web","deprecated":false,"group":"Federation","title":"ActivityPub.Web","sections":[],"nested_context":"ActivityPub","nested_title":".Web","nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","deprecated":false,"title":"__using__(which)","anchor":"__using__/1"},{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"channel/0","deprecated":false,"title":"channel()","anchor":"channel/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"rate_limit_reached/2","deprecated":false,"title":"rate_limit_reached(conn, opts)","anchor":"rate_limit_reached/2"},{"id":"router/0","deprecated":false,"title":"router()","anchor":"router/0"},{"id":"view/0","deprecated":false,"title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"ActivityPub.Web.ActivityPubController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ActivityPubController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ActivityPubController","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor/2","deprecated":false,"title":"actor(conn, map)","anchor":"actor/2"},{"id":"ap_route_helper/1","deprecated":false,"title":"ap_route_helper(uuid)","anchor":"ap_route_helper/1"},{"id":"followers/2","deprecated":false,"title":"followers(conn, params)","anchor":"followers/2"},{"id":"following/2","deprecated":false,"title":"following(conn, params)","anchor":"following/2"},{"id":"json_object_with_cache/3","deprecated":false,"title":"json_object_with_cache(conn \\\\ nil, id, opts \\\\ [])","anchor":"json_object_with_cache/3"},{"id":"maybe_inbox/2","deprecated":false,"title":"maybe_inbox(conn, params)","anchor":"maybe_inbox/2"},{"id":"object/2","deprecated":false,"title":"object(conn, map)","anchor":"object/2"},{"id":"outbox/2","deprecated":false,"title":"outbox(conn, params)","anchor":"outbox/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ActorView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ActorView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ActorView","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_json/1","deprecated":false,"title":"actor_json(username)","anchor":"actor_json/1"},{"id":"collection/4","deprecated":false,"title":"collection(collection, iri, page, total \\\\ nil)","anchor":"collection/4"},{"id":"render/2","deprecated":false,"title":"render(binary, map)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Endpoint","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Endpoint","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Endpoint","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":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"ActivityPub.Web.ErrorHelpers","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ErrorHelpers","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ErrorHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(form, field)","anchor":"error_tag/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ErrorView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ErrorView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ErrorView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/2","deprecated":false,"title":"render(binary, 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":"ActivityPub.Web.IncomingActivityPubController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.IncomingActivityPubController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".IncomingActivityPubController","nodeGroups":[{"name":"Functions","nodes":[{"id":"inbox/2","deprecated":false,"title":"inbox(conn, params)","anchor":"inbox/2"},{"id":"outbox_info/2","deprecated":false,"title":"outbox_info(conn, params)","anchor":"outbox_info/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.LayoutView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.LayoutView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".LayoutView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/2","deprecated":false,"title":"render(binary, assigns)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ObjectView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ObjectView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ObjectView","nodeGroups":[{"name":"Functions","nodes":[{"id":"collection/4","deprecated":false,"title":"collection(collection, iri, page, total \\\\ nil)","anchor":"collection/4"},{"id":"render/2","deprecated":false,"title":"render(binary, params)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.DigestPlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.DigestPlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.DigestPlug","nodeGroups":[{"name":"Functions","nodes":[{"id":"read_body/2","deprecated":false,"title":"read_body(conn, opts)","anchor":"read_body/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.EnsureHTTPSignaturePlug","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, _)","anchor":"call/2"},{"id":"ignore/1","deprecated":false,"title":"ignore(conn)","anchor":"ignore/1"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"},{"id":"maybe_reject!/2","deprecated":false,"title":"maybe_reject!(conn, arg2)","anchor":"maybe_reject!/2"},{"id":"unauthorized/1","deprecated":false,"title":"unauthorized(conn)","anchor":"unauthorized/1"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.FetchHTTPSignaturePlug","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":"ActivityPub.Web.Plugs.HTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.HTTPSignaturePlug","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":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.MappedSignatureToIdentityPlug","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":"ActivityPub.Web.RedirectController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.RedirectController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".RedirectController","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor/2","deprecated":false,"title":"actor(conn, map)","anchor":"actor/2"},{"id":"object/2","deprecated":false,"title":"object(conn, map)","anchor":"object/2"},{"id":"remote_interaction/2","deprecated":false,"title":"remote_interaction(conn, params)","anchor":"remote_interaction/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Router","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Router","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Router"},{"id":"ActivityPub.Web.Telemetry","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Telemetry","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Telemetry","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","deprecated":false,"title":"metrics()","anchor":"metrics/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"ActivityPub.Web.UserSocket","deprecated":false,"group":"Federation","title":"ActivityPub.Web.UserSocket","sections":[],"nested_context":"ActivityPub.Web","nested_title":".UserSocket"},{"id":"ActivityPub.Web.WebFingerController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.WebFingerController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".WebFingerController","nodeGroups":[{"name":"Functions","nodes":[{"id":"webfinger/2","deprecated":false,"title":"webfinger(conn, map)","anchor":"webfinger/2"}],"key":"functions"}]},{"id":"Iconify","deprecated":false,"group":"Icons","title":"Iconify","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_icon_to_css/2","deprecated":false,"title":"add_icon_to_css(icon_css_name, svg_code)","anchor":"add_icon_to_css/2"},{"id":"dev_env?/0","deprecated":false,"title":"dev_env?()","anchor":"dev_env?/0"},{"id":"emoji?/1","deprecated":false,"title":"emoji?(icon)","anchor":"emoji?/1"},{"id":"fallback_icon/0","deprecated":false,"title":"fallback_icon()","anchor":"fallback_icon/0"},{"id":"generate_css_from_components/0","deprecated":false,"title":"generate_css_from_components()","anchor":"generate_css_from_components/0"},{"id":"generate_css_from_static_files/0","deprecated":false,"title":"generate_css_from_static_files()","anchor":"generate_css_from_static_files/0"},{"id":"generate_sets_from_components/0","deprecated":false,"title":"generate_sets_from_components()","anchor":"generate_sets_from_components/0"},{"id":"iconify/1","deprecated":false,"title":"iconify(assigns)","anchor":"iconify/1"},{"id":"list_all_existing/0","deprecated":false,"title":"list_all_existing()","anchor":"list_all_existing/0"},{"id":"list_components/0","deprecated":false,"title":"list_components()","anchor":"list_components/0"},{"id":"list_icons_in_css/0","deprecated":false,"title":"list_icons_in_css()","anchor":"list_icons_in_css/0"},{"id":"manual/2","deprecated":false,"title":"manual(icon, opts \\\\ nil)","anchor":"manual/2"},{"id":"maybe_phx_live_set_dynamic/3","deprecated":false,"title":"maybe_phx_live_set_dynamic(socket, icon, type \\\\ \"svg\")","anchor":"maybe_phx_live_set_dynamic/3"},{"id":"maybe_set_favicon/2","deprecated":false,"title":"maybe_set_favicon(socket, icon)","anchor":"maybe_set_favicon/2"},{"id":"path/0","deprecated":false,"title":"path()","anchor":"path/0"},{"id":"prepare/2","deprecated":false,"title":"prepare(assigns, opts \\\\ [])","anchor":"prepare/2"},{"id":"prepare_entire_icon_family/2","deprecated":false,"title":"prepare_entire_icon_family(family_name, mode \\\\ nil)","anchor":"prepare_entire_icon_family/2"},{"id":"static_path/0","deprecated":false,"title":"static_path()","anchor":"static_path/0"},{"id":"static_url/0","deprecated":false,"title":"static_url()","anchor":"static_url/0"},{"id":"using_svg_inject?/0","deprecated":false,"title":"using_svg_inject?()","anchor":"using_svg_inject?/0"}],"key":"functions"}]},{"id":"Iconify.Icon","deprecated":false,"group":"Icons","title":"Iconify.Icon","sections":[{"id":"Specifying what icon to use","anchor":"module-specifying-what-icon-to-use"},{"id":"Extra Properties","anchor":"module-extra-properties"},{"id":"Examples","anchor":"module-examples"},{"id":"Properties","anchor":"module-properties"}],"nested_context":"Iconify","nested_title":".Icon","nodeGroups":[{"name":"Functions","nodes":[{"id":"class_to_string/1","deprecated":false,"title":"class_to_string(class)","anchor":"class_to_string/1"},{"id":"expand/3","deprecated":false,"title":"expand(attributes, content, meta)","anchor":"expand/3"},{"id":"icon_name/1","deprecated":false,"title":"icon_name(icon)","anchor":"icon_name/1"}],"key":"functions"}]},{"id":"Iconify.MaterialSymbols.CalendarMonth","deprecated":false,"group":"Icons","title":"Iconify.MaterialSymbols.CalendarMonth","sections":[],"nested_context":"Iconify","nested_title":".MaterialSymbols.CalendarMonth","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"AbsintheClient","deprecated":false,"group":"Utilities","title":"AbsintheClient","sections":[{"id":"Example","anchor":"module-example"},{"id":"Differences with the GraphQL Specification","anchor":"module-differences-with-the-graphql-specification"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"absinthe_pipeline/2","deprecated":false,"title":"absinthe_pipeline(schema, t)","anchor":"c:absinthe_pipeline/2"},{"id":"cast_param/3","deprecated":false,"title":"cast_param(value, target_type, schema)","anchor":"c:cast_param/3"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"default_pipeline/2","deprecated":false,"title":"default_pipeline(schema, options)","anchor":"default_pipeline/2"},{"id":"variables/1","deprecated":false,"title":"variables(conn_or_socket)","anchor":"variables/1"}],"key":"functions"}]},{"id":"AbsintheClient.Helpers","deprecated":false,"group":"Utilities","title":"AbsintheClient.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assign/3","deprecated":false,"title":"assign(conn, key, val)","anchor":"assign/3"},{"id":"error/2","deprecated":false,"title":"error(conn, error)","anchor":"error/2"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"}],"key":"functions"}]},{"id":"ConsoleHelpers","deprecated":false,"group":"Utilities","title":"ConsoleHelpers","sections":[]},{"id":"DaisyTheme","deprecated":false,"group":"Utilities","title":"DaisyTheme","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"adjust/5","deprecated":false,"title":"adjust(theme, name, variable, field, percent \\\\ 0.8)","anchor":"adjust/5"},{"id":"clamp/3","deprecated":false,"title":"clamp(value, min, max)","anchor":"clamp/3"},{"id":"darken/2","deprecated":false,"title":"darken(hex, amount)","anchor":"darken/2"},{"id":"darker/5","deprecated":false,"title":"darker(theme, name, variable, field, percent \\\\ 0.2)","anchor":"darker/5"},{"id":"default_theme/0","deprecated":false,"title":"default_theme()","anchor":"default_theme/0"},{"id":"generate/1","deprecated":false,"title":"generate(config \\\\ %{})","anchor":"generate/1"},{"id":"is_dark?/1","deprecated":false,"title":"is_dark?(value)","anchor":"is_dark?/1"},{"id":"keys/0","deprecated":false,"title":"keys()","anchor":"keys/0"},{"id":"lighten/2","deprecated":false,"title":"lighten(hex, amount)","anchor":"lighten/2"},{"id":"style_attr/1","deprecated":false,"title":"style_attr(config \\\\ %{})","anchor":"style_attr/1"},{"id":"theme/1","deprecated":false,"title":"theme(config)","anchor":"theme/1"}],"key":"functions"}]},{"id":"DummyAdapter","deprecated":false,"group":"Utilities","title":"DummyAdapter","sections":[]},{"id":"Entrepot","deprecated":false,"group":"Utilities","title":"Entrepot","sections":[{"id":"Concepts","anchor":"module-concepts"},{"id":"Built-in Integrations","anchor":"module-built-in-integrations"},{"id":"Storages","anchor":"module-storages"},{"id":"uploads","anchor":"module-uploads"},{"id":"EntrepôtEcto","anchor":"module-entrep%C3%B4tecto"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_metadata/2","deprecated":false,"title":"add_metadata(locator, data)","anchor":"add_metadata/2"},{"id":"add_metadata/3","deprecated":false,"title":"add_metadata(locator, key, val)","anchor":"add_metadata/3"},{"id":"copy/3","deprecated":false,"title":"copy(locator, dest_storage, opts \\\\ [])","anchor":"copy/3"},{"id":"storage!/1","deprecated":false,"title":"storage!(locator)","anchor":"storage!/1"}],"key":"functions"}]},{"id":"Entrepot.Ecto","deprecated":false,"group":"Utilities","title":"Entrepot.Ecto","sections":[{"id":"Entrepot.Ecto.Type","anchor":"module-entrepot-ecto-type"},{"id":"Entrepot.Ecto.upload","anchor":"module-entrepot-ecto-upload"},{"id":"Upload cleanup","anchor":"module-upload-cleanup"},{"id":"Testing","anchor":"module-testing"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"upload/4","deprecated":false,"title":"upload(changeset, params, permitted, fun)","anchor":"upload/4"},{"id":"upload/5","deprecated":false,"title":"upload(changeset, params, permitted, module, func_name)","anchor":"upload/5"}],"key":"functions"}]},{"id":"Entrepot.Ecto.Type","deprecated":false,"group":"Utilities","title":"Entrepot.Ecto.Type","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(value)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(locator)","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(serialized_data)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Entrepot.Errors.InvalidLocator","deprecated":false,"group":"Utilities","title":"Entrepot.Errors.InvalidLocator","sections":[]},{"id":"Entrepot.Errors.InvalidStorage","deprecated":false,"group":"Utilities","title":"Entrepot.Errors.InvalidStorage","sections":[]},{"id":"Entrepot.Locator","deprecated":false,"group":"Utilities","title":"Entrepot.Locator","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"},{"id":"new!/1","deprecated":false,"title":"new!(attrs)","anchor":"new!/1"}],"key":"functions"}]},{"id":"Entrepot.Storage","deprecated":false,"group":"Utilities","title":"Entrepot.Storage","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"locator_id/0","deprecated":false,"title":"locator_id()","anchor":"t:locator_id/0"},{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"delete/1","deprecated":false,"title":"delete(locator_id)","anchor":"c:delete/1"},{"id":"delete/2","deprecated":false,"title":"delete(locator_id, list)","anchor":"c:delete/2"},{"id":"path/1","deprecated":false,"title":"path(locator_id)","anchor":"c:path/1"},{"id":"path/2","deprecated":false,"title":"path(locator_id, list)","anchor":"c:path/2"},{"id":"put/1","deprecated":false,"title":"put(t)","anchor":"c:put/1"},{"id":"put/2","deprecated":false,"title":"put(t, list)","anchor":"c:put/2"},{"id":"read/1","deprecated":false,"title":"read(locator_id)","anchor":"c:read/1"},{"id":"read/2","deprecated":false,"title":"read(locator_id, list)","anchor":"c:read/2"},{"id":"stream/1","deprecated":false,"title":"stream(locator_id)","anchor":"c:stream/1"},{"id":"stream/2","deprecated":false,"title":"stream(locator_id, list)","anchor":"c:stream/2"},{"id":"url/1","deprecated":false,"title":"url(locator_id)","anchor":"c:url/1"},{"id":"url/2","deprecated":false,"title":"url(locator_id, list)","anchor":"c:url/2"}],"key":"callbacks"}]},{"id":"Entrepot.Storages.Disk","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.Disk","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Storages.RAM","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.RAM","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Storages.S3","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(source_id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Upload","deprecated":false,"group":"Utilities","title":"Entrepot.Upload","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"contents/1","deprecated":false,"title":"contents(upload)","anchor":"contents/1"},{"id":"name/1","deprecated":false,"title":"name(upload)","anchor":"name/1"},{"id":"path/1","deprecated":false,"title":"path(upload)","anchor":"path/1"}],"key":"functions"}]},{"id":"Entrepot.Uploader","deprecated":false,"group":"Utilities","title":"Entrepot.Uploader","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"},{"id":"storage/0","deprecated":false,"title":"storage()","anchor":"t:storage/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"build_metadata/3","deprecated":false,"title":"build_metadata(t, storage, list)","anchor":"c:build_metadata/3"},{"id":"build_options/3","deprecated":false,"title":"build_options(any, storage, list)","anchor":"c:build_options/3"},{"id":"store/3","deprecated":false,"title":"store(any, storage, list)","anchor":"c:store/3"}],"key":"callbacks"}]},{"id":"Import2Alias","deprecated":false,"group":"Utilities","title":"Import2Alias","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import2alias/2","deprecated":false,"title":"import2alias(alias, entries)","anchor":"import2alias/2"}],"key":"functions"}]},{"id":"Import2Alias.CallerTracer","deprecated":false,"group":"Utilities","title":"Import2Alias.CallerTracer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"trace/2","deprecated":false,"title":"trace(arg1, env)","anchor":"trace/2"}],"key":"functions"}]},{"id":"Import2Alias.Server","deprecated":false,"group":"Utilities","title":"Import2Alias.Server","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"entries/0","deprecated":false,"title":"entries()","anchor":"entries/0"},{"id":"record/6","deprecated":false,"title":"record(file, line, column, module, name, arity)","anchor":"record/6"},{"id":"start_link/1","deprecated":false,"title":"start_link(module)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Nebulex.DiskAdapter","deprecated":false,"group":"Utilities","title":"Nebulex.DiskAdapter","sections":[]},{"id":"Nebulex.DiskAdapter.DiskCacheHelper","deprecated":false,"group":"Utilities","title":"Nebulex.DiskAdapter.DiskCacheHelper","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cache_path/3","deprecated":false,"title":"cache_path(key, adapter_meta, opts)","anchor":"cache_path/3"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"disk_clear/2","deprecated":false,"title":"disk_clear(cache_module \\\\ nil, opts \\\\ [])","anchor":"disk_clear/2"},{"id":"disk_delete/3","deprecated":false,"title":"disk_delete(adapter_meta, key, opts)","anchor":"disk_delete/3"},{"id":"disk_get/4","deprecated":false,"title":"disk_get(adapter_meta, key, fun, opts)","anchor":"disk_get/4"},{"id":"disk_list/2","deprecated":false,"title":"disk_list(cache_module \\\\ nil, opts \\\\ [])","anchor":"disk_list/2"},{"id":"disk_put/4","deprecated":false,"title":"disk_put(adapter_meta, key, data, opts)","anchor":"disk_put/4"},{"id":"start_link/1","deprecated":false,"title":"start_link(options \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Paginator","deprecated":false,"group":"Utilities","title":"Paginator","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Options","anchor":"module-options"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"paginate/3","deprecated":false,"title":"paginate(queryable, opts, repo_opts)","anchor":"c:paginate/3"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"cursor_for_record/3","deprecated":false,"title":"cursor_for_record(record, cursor_fields, fetch_cursor_value_fun \\\\ &Paginator.default_fetch_cursor_value/2)","anchor":"cursor_for_record/3"},{"id":"default_fetch_cursor_value/2","deprecated":false,"title":"default_fetch_cursor_value(schema, field)","anchor":"default_fetch_cursor_value/2"},{"id":"paginated_query/2","deprecated":false,"title":"paginated_query(queryable, opts)","anchor":"paginated_query/2"}],"key":"functions"}]},{"id":"Paginator.Page","deprecated":false,"group":"Utilities","title":"Paginator.Page","sections":[{"id":"Fields","anchor":"module-fields"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Paginator.PageInfo","deprecated":false,"group":"Utilities","title":"Paginator.PageInfo","sections":[{"id":"Fields","anchor":"module-fields"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"opaque_cursor/0","deprecated":false,"title":"opaque_cursor()","anchor":"t:opaque_cursor/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"PaperTrail","deprecated":false,"group":"Utilities","title":"PaperTrail","sections":[{"id":"Example","anchor":"module-example"},{"id":"Installation","anchor":"module-installation"},{"id":"Working with multi tenancy","anchor":"module-working-with-multi-tenancy"},{"id":"Version timestamps","anchor":"module-version-timestamps"},{"id":"Suggestions","anchor":"module-suggestions"},{"id":"Contributing","anchor":"module-contributing"},{"id":"License","anchor":"module-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_prefix/2","deprecated":false,"title":"add_prefix(schema, prefix)","anchor":"add_prefix/2"},{"id":"delete/2","deprecated":false,"title":"delete(model_or_changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(model_or_changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"delete!/2"},{"id":"get_current_model/1","deprecated":false,"title":"get_current_model(version)","anchor":"get_current_model/1"},{"id":"get_item_type/1","deprecated":false,"title":"get_item_type(data)","anchor":"get_item_type/1"},{"id":"get_model_id/1","deprecated":false,"title":"get_model_id(model)","anchor":"get_model_id/1"},{"id":"get_sequence_id/1","deprecated":false,"title":"get_sequence_id(table_name)","anchor":"get_sequence_id/1"},{"id":"get_version/1","deprecated":false,"title":"get_version(record)","anchor":"get_version/1"},{"id":"get_version/2","deprecated":false,"title":"get_version(model_or_record, id_or_options)","anchor":"get_version/2"},{"id":"get_version/3","deprecated":false,"title":"get_version(model, id, options)","anchor":"get_version/3"},{"id":"get_versions/1","deprecated":false,"title":"get_versions(record)","anchor":"get_versions/1"},{"id":"get_versions/2","deprecated":false,"title":"get_versions(model_or_record, id_or_options)","anchor":"get_versions/2"},{"id":"get_versions/3","deprecated":false,"title":"get_versions(model, id, options)","anchor":"get_versions/3"},{"id":"has_version?/1","deprecated":false,"title":"has_version?(record)","anchor":"has_version?/1"},{"id":"has_version?/2","deprecated":false,"title":"has_version?(model_or_record, id_or_options)","anchor":"has_version?/2"},{"id":"has_version?/3","deprecated":false,"title":"has_version?(model, id, options)","anchor":"has_version?/3"},{"id":"initialise/2","deprecated":false,"title":"initialise(model, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, version_key: :version])","anchor":"initialise/2"},{"id":"insert/2","deprecated":false,"title":"insert(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"insert!/2"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"insert_or_update!/2"},{"id":"make_version_struct/3","deprecated":false,"title":"make_version_struct(version, model, options)","anchor":"make_version_struct/3"},{"id":"serialize/1","deprecated":false,"title":"serialize(data)","anchor":"serialize/1"},{"id":"update/2","deprecated":false,"title":"update(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, ecto_options: []])","anchor":"update!/2"}],"key":"functions"}]},{"id":"PaperTrail.Multi","deprecated":false,"group":"Utilities","title":"PaperTrail.Multi","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_prefix/2","deprecated":false,"title":"add_prefix(schema, prefix)","anchor":"add_prefix/2"},{"id":"append/2","deprecated":false,"title":"append(lhs, rhs)","anchor":"append/2"},{"id":"commit/1","deprecated":false,"title":"commit(multi)","anchor":"commit/1"},{"id":"delete/3","deprecated":false,"title":"delete(multi, struct, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])","anchor":"delete/3"},{"id":"error/3","deprecated":false,"title":"error(multi, name, value)","anchor":"error/3"},{"id":"get_item_type/1","deprecated":false,"title":"get_item_type(data)","anchor":"get_item_type/1"},{"id":"get_model_id/1","deprecated":false,"title":"get_model_id(model)","anchor":"get_model_id/1"},{"id":"get_sequence_id/1","deprecated":false,"title":"get_sequence_id(table_name)","anchor":"get_sequence_id/1"},{"id":"insert/3","deprecated":false,"title":"insert(multi, changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])","anchor":"insert/3"},{"id":"insert_or_update/3","deprecated":false,"title":"insert_or_update(multi, changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])","anchor":"insert_or_update/3"},{"id":"make_version_struct/3","deprecated":false,"title":"make_version_struct(version, model, options)","anchor":"make_version_struct/3"},{"id":"merge/2","deprecated":false,"title":"merge(multi, merge)","anchor":"merge/2"},{"id":"merge/4","deprecated":false,"title":"merge(multi, mod, fun, args)","anchor":"merge/4"},{"id":"new/0","deprecated":false,"title":"new()","anchor":"new/0"},{"id":"prepend/2","deprecated":false,"title":"prepend(lhs, rhs)","anchor":"prepend/2"},{"id":"run/3","deprecated":false,"title":"run(multi, name, run)","anchor":"run/3"},{"id":"run/5","deprecated":false,"title":"run(multi, name, mod, fun, args)","anchor":"run/5"},{"id":"serialize/1","deprecated":false,"title":"serialize(data)","anchor":"serialize/1"},{"id":"to_list/1","deprecated":false,"title":"to_list(multi)","anchor":"to_list/1"},{"id":"update/3","deprecated":false,"title":"update(multi, changeset, options \\\\ [origin: nil, meta: nil, originator: nil, prefix: nil, model_key: :model, version_key: :version, initial_version_key: :initial_version, ecto_options: []])","anchor":"update/3"}],"key":"functions"}]},{"id":"PaperTrail.RepoClient","deprecated":false,"group":"Utilities","title":"PaperTrail.RepoClient","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"item_type/0","deprecated":false,"title":"item_type()","anchor":"item_type/0"},{"id":"origin_read_after_writes/0","deprecated":false,"title":"origin_read_after_writes()","anchor":"origin_read_after_writes/0"},{"id":"originator/0","deprecated":false,"title":"originator()","anchor":"originator/0"},{"id":"originator_relationship_opts/0","deprecated":false,"title":"originator_relationship_opts()","anchor":"originator_relationship_opts/0"},{"id":"originator_type/0","deprecated":false,"title":"originator_type()","anchor":"originator_type/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"strict_mode/0","deprecated":false,"title":"strict_mode()","anchor":"strict_mode/0"},{"id":"timestamps_type/0","deprecated":false,"title":"timestamps_type()","anchor":"timestamps_type/0"}],"key":"functions"}]},{"id":"PaperTrail.Serializer","deprecated":false,"group":"Utilities","title":"PaperTrail.Serializer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"model/0","deprecated":false,"title":"model()","anchor":"t:model/0"},{"id":"options/0","deprecated":false,"title":"options()","anchor":"t:options/0"},{"id":"primary_key/0","deprecated":false,"title":"primary_key()","anchor":"t:primary_key/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"add_prefix/2","deprecated":false,"title":"add_prefix(schema, prefix)","anchor":"add_prefix/2"},{"id":"get_item_type/1","deprecated":false,"title":"get_item_type(arg1)","anchor":"get_item_type/1"},{"id":"get_model_id/1","deprecated":false,"title":"get_model_id(model)","anchor":"get_model_id/1"},{"id":"get_sequence_id/1","deprecated":false,"title":"get_sequence_id(table_name)","anchor":"get_sequence_id/1"},{"id":"make_version_struct/3","deprecated":false,"title":"make_version_struct(map, model, options)","anchor":"make_version_struct/3"},{"id":"serialize/1","deprecated":false,"title":"serialize(model)","anchor":"serialize/1"},{"id":"serialize_changes/1","deprecated":false,"title":"serialize_changes(changeset)","anchor":"serialize_changes/1"}],"key":"functions"}]},{"id":"PaperTrail.Version","deprecated":false,"group":"Utilities","title":"PaperTrail.Version","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, params \\\\ %{})","anchor":"changeset/2"},{"id":"count/0","deprecated":false,"title":"count()","anchor":"count/0"},{"id":"count/1","deprecated":false,"title":"count(options)","anchor":"count/1"},{"id":"first/0","deprecated":false,"title":"first()","anchor":"first/0"},{"id":"first/1","deprecated":false,"title":"first(options)","anchor":"first/1"},{"id":"last/0","deprecated":false,"title":"last()","anchor":"last/0"},{"id":"last/1","deprecated":false,"title":"last(options)","anchor":"last/1"}],"key":"functions"}]},{"id":"PaperTrail.VersionQueries","deprecated":false,"group":"Utilities","title":"PaperTrail.VersionQueries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_current_model/1","deprecated":false,"title":"get_current_model(version)","anchor":"get_current_model/1"},{"id":"get_version/1","deprecated":false,"title":"get_version(record)","anchor":"get_version/1"},{"id":"get_version/2","deprecated":false,"title":"get_version(model, id)","anchor":"get_version/2"},{"id":"get_version/3","deprecated":false,"title":"get_version(model, id, options)","anchor":"get_version/3"},{"id":"get_versions/1","deprecated":false,"title":"get_versions(record)","anchor":"get_versions/1"},{"id":"get_versions/2","deprecated":false,"title":"get_versions(model, id)","anchor":"get_versions/2"},{"id":"get_versions/3","deprecated":false,"title":"get_versions(model, id, options)","anchor":"get_versions/3"},{"id":"has_version?/1","deprecated":false,"title":"has_version?(record)","anchor":"has_version?/1"},{"id":"has_version?/2","deprecated":false,"title":"has_version?(model, id)","anchor":"has_version?/2"},{"id":"has_version?/3","deprecated":false,"title":"has_version?(model, id, options)","anchor":"has_version?/3"}],"key":"functions"}]},{"id":"UserAuthLiveMount","deprecated":false,"group":"Utilities","title":"UserAuthLiveMount","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","deprecated":false,"title":"on_mount(type, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"GraphQL Introduction","anchor":"graphql-introduction"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Bonfire Networks","headers":[{"id":"Main features","anchor":"main-features"},{"id":"How to get the most out of the documentation","anchor":"how-to-get-the-most-out-of-the-documentation"},{"id":"Prerequisite knowledge","anchor":"prerequisite-knowledge"},{"id":"Join our community","anchor":"join-our-community"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"hacking","group":"Getting Started","title":"Development setup","headers":[{"id":"Status: beta - have fun and provide feedback 🙏","anchor":"status-beta-have-fun-and-provide-feedback"},{"id":"System Requirements","anchor":"system-requirements"},{"id":"Download","anchor":"download"},{"id":"Configure","anchor":"configure"},{"id":"Light a fire!","anchor":"light-a-fire"},{"id":"Onboarding","anchor":"onboarding"},{"id":"The Bonfire environment","anchor":"the-bonfire-environment"},{"id":"Documentation","anchor":"documentation"},{"id":"Additional information","anchor":"additional-information"},{"id":"Troubleshooting","anchor":"troubleshooting"}]},{"id":"deploy","group":"Getting Started","title":"Hosting guide","headers":[{"id":"Security Warning","anchor":"security-warning"},{"id":"Step 1 - Decide how you want to deploy and manage the app","anchor":"step-1-decide-how-you-want-to-deploy-and-manage-the-app"},{"id":"Preparing the config (in .env)","anchor":"preparing-the-config-in-env"},{"id":"Running the app","anchor":"running-the-app"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Admin tools","anchor":"admin-tools"},{"id":"Troubleshooting","anchor":"troubleshooting"}]},{"id":"changelog","group":"Getting Started","title":"Bonfire Changelog","headers":[{"id":"[0.3.5-beta (2022-09-23)]","anchor":"0-3-5-beta-2022-09-23"},{"id":"[0.3.4-beta.8 (2022-08-26)]","anchor":"0-3-4-beta-8-2022-08-26"},{"id":"[0.3.4-beta.6 (2022-08-19)]","anchor":"0-3-4-beta-6-2022-08-19"},{"id":"[0.3.4 (2022-08-09)]","anchor":"0-3-4-2022-08-09"},{"id":"[0.3.3 (2022-08-02)]","anchor":"0-3-3-2022-08-02"},{"id":"[0.3.2 (2022-07-30)]","anchor":"0-3-2-2022-07-30"},{"id":"0.3.1-beta.9 (2022-07-22)","anchor":"0-3-1-beta-9-2022-07-22"},{"id":"0.3.1-beta (2022-07-19)","anchor":"0-3-1-beta-2022-07-19"}]},{"id":"add-a-new-widget","group":"Building on Bonfire","title":"Add a new widget","headers":[{"id":"Let’s code!","anchor":"let-s-code"},{"id":"Adding Settings","anchor":"adding-settings"},{"id":"Next Steps","anchor":"next-steps"}]},{"id":"add-a-page-to-the-sidebar","group":"Building on Bonfire","title":"Bonfire Navigation Sidebar","headers":[{"id":"Overview","anchor":"overview"},{"id":"Key Concepts","anchor":"key-concepts"},{"id":"Creating a New Navigation Menu","anchor":"creating-a-new-navigation-menu"},{"id":"Using the Default Navigation Menu","anchor":"using-the-default-navigation-menu"},{"id":"Overriding Default Navigation with a Custom Menu","anchor":"overriding-default-navigation-with-a-custom-menu"}]},{"id":"add-an-extension-settings","group":"Building on Bonfire","title":"Add a new extension settings","headers":[]},{"id":"create-a-new-extension","group":"Building on Bonfire","title":"Create a new extension","headers":[{"id":"Create your Bonfire extension","anchor":"create-your-bonfire-extension"}]},{"id":"create-a-new-page","group":"Building on Bonfire","title":"Create a new page","headers":[]},{"id":"edit-an-existing-extension","group":"Building on Bonfire","title":"Make changes to an extension","headers":[{"id":"Fork the extension","anchor":"fork-the-extension"},{"id":"Enable the extension","anchor":"enable-the-extension"},{"id":"Make and test your changes","anchor":"make-and-test-your-changes"},{"id":"Push changes","anchor":"push-changes"},{"id":"Great works 🎉🎉🎉","anchor":"great-works"}]},{"id":"extensions-overview","group":"Building on Bonfire","title":"What is a Bonfire extension","headers":[{"id":"Using extensions","anchor":"using-extensions"},{"id":"Extension helpers","anchor":"extension-helpers"}]},{"id":"project-structure","group":"Building on Bonfire","title":"Project structure","headers":[]},{"id":"routing","group":"Building on Bonfire","title":"Routing","headers":[{"id":"Add a new route","anchor":"add-a-new-route"}]},{"id":"what-is-flavour","group":"Building on Bonfire","title":"What is a Bonfire flavour?","headers":[]},{"id":"working-with-flavour","group":"Building on Bonfire","title":"Working with flavour","headers":[]},{"id":"architecture","group":"Concepts","title":"Bonfire Architecture","headers":[{"id":"Hacking","anchor":"hacking"},{"id":"Design Decisions","anchor":"design-decisions"},{"id":"Stack","anchor":"stack"},{"id":"The Bonfire Environment","anchor":"the-bonfire-environment"},{"id":"Code Structure","anchor":"code-structure"},{"id":"Naming","anchor":"naming"},{"id":"Federation libraries","anchor":"federation-libraries"}]},{"id":"bonfire-flavoured-elixir","group":"Concepts","title":"Bonfire-flavoured Elixir","headers":[{"id":"Arrows","anchor":"arrows"},{"id":"Untangle","anchor":"untangle"},{"id":"Error handling","anchor":"error-handling"}]},{"id":"design","group":"Concepts","title":"Design Guidelines","headers":[]},{"id":"just","group":"Concepts","title":"Just commands","headers":[{"id":"General Setup Related Commands","anchor":"general-setup-related-commands"}]},{"id":"Needle","group":"Concepts","title":"Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","headers":[{"id":"Intro","anchor":"intro"},{"id":"What is Needle?","anchor":"what-is-needle"},{"id":"Identifying objects - the UID type","anchor":"identifying-objects-the-uid-type"},{"id":"It's just a table","anchor":"it-s-just-a-table"},{"id":"Installation","anchor":"installation"},{"id":"Declaring Object Types","anchor":"declaring-object-types"},{"id":"Adding re-usable fields","anchor":"adding-re-usable-fields"},{"id":"Writing Migrations","anchor":"writing-migrations"},{"id":"Configuration and overrides","anchor":"configuration-and-overrides"},{"id":"Referencing Pointables","anchor":"referencing-pointables"},{"id":"Dereferencing Pointables","anchor":"dereferencing-pointables"},{"id":"Inserting data","anchor":"inserting-data"},{"id":"Querying Needle","anchor":"querying-needle"},{"id":"Tradeoffs","anchor":"tradeoffs"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Mailer","group":"Concepts","title":"Email Delivery in Bonfire","headers":[{"id":"Before You Begin","anchor":"before-you-begin"},{"id":"Choosing an Email Delivery Method","anchor":"choosing-an-email-delivery-method"},{"id":"1. Default Behaviour: Direct SMTP Delivery","anchor":"1-default-behaviour-direct-smtp-delivery"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Boundaries","group":"Concepts","title":"Boundaries for Access Control","headers":[{"id":"Glossary","anchor":"glossary"},{"id":"Users and Circles","anchor":"users-and-circles"},{"id":"Verbs","anchor":"verbs"},{"id":"Permissions","anchor":"permissions"},{"id":"ACLs","anchor":"acls"},{"id":"Controlled - Applying boundaries to an object","anchor":"controlled-applying-boundaries-to-an-object"},{"id":"Practical example: Surprise birthday party","anchor":"practical-example-surprise-birthday-party"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.API.Graphql","group":"Concepts","title":"Bonfire.API.GraphQL","headers":[{"id":"GraphQL Introduction","anchor":"graphql-introduction"},{"id":"Absinthe Introduction","anchor":"absinthe-introduction"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"blog","group":"Flavours of Bonfire","title":"Bonfire Community","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"classic","group":"Flavours of Bonfire","title":"Bonfire Classic","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"community","group":"Flavours of Bonfire","title":"Bonfire Community","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"cooperation","group":"Flavours of Bonfire","title":"Bonfire Cooperation","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"coordination","group":"Flavours of Bonfire","title":"Bonfire Coordination","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"open-science","group":"Flavours of Bonfire","title":"Open Science Network","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"reflow","group":"Flavours of Bonfire","title":"Reflow","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"upcycle","group":"Flavours of Bonfire","title":"Upcycle","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"Bonfire.Data.Assort","group":"Data schemas","title":"Bonfire.Data.Assort","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.AccessControl","group":"Data schemas","title":"Bonfire.Data.AccessControl","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.ActivityPub","group":"Data schemas","title":"Bonfire.Data.ActivityPub","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Identity","group":"Data schemas","title":"Bonfire.Data.Identity","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Social","group":"Data schemas","title":"Bonfire.Data.Social","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Edges","group":"Data schemas","title":"Bonfire.Data.Edges","headers":[]},{"id":"Bonfire.Data.SharedUser","group":"Data schemas","title":"Bonfire.Data.SharedUser","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Common","group":"UI extensions","title":"Bonfire.UI.Common","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Me","group":"UI extensions","title":"Bonfire.UI.Me","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Social","group":"UI extensions","title":"Bonfire.UI.Social","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.SocialGraph","group":"UI extensions","title":"Bonfire.UI.Social.Graph","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Posts","group":"UI extensions","title":"Bonfire.UI.Posts","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Messages","group":"UI extensions","title":"Bonfire.UI.Messages","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Reactions","group":"UI extensions","title":"Bonfire.UI.Reactions","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Moderation","group":"UI extensions","title":"Bonfire.UI.Moderation","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Topics","group":"UI extensions","title":"Bonfire.UI.Topics","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Groups","group":"UI extensions","title":"Bonfire UI Groups","headers":[{"id":"Roadmap","anchor":"roadmap"},{"id":"Sponsors","anchor":"sponsors"},{"id":"📖 Documentation","anchor":"documentation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Valueflows","group":"UI extensions","title":"Bonfire.UI.ValueFlows","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Kanban","group":"UI extensions","title":"Bonfire.UI.Kanban","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Coordination","group":"UI extensions","title":"Bonfire.UI.Coordination","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Reflow","group":"UI extensions","title":"Bonfire.UI.Reflow","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Files","group":"Bonfire utilities","title":"Bonfire.Files","headers":[{"id":"Configuration","anchor":"configuration"},{"id":"TODO's","anchor":"todo-s"}]},{"id":"Bonfire.Common","group":"Bonfire utilities","title":"Bonfire.Common","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Epics","group":"Bonfire utilities","title":"Bonfire.Epics","headers":[{"id":"Key components and concepts:","anchor":"key-components-and-concepts"},{"id":"How it works","anchor":"how-it-works"},{"id":"1. How to write an Act","anchor":"1-how-to-write-an-act"},{"id":"2. How to define an Epic","anchor":"2-how-to-define-an-epic"},{"id":"3. How to run an Epic","anchor":"3-how-to-run-an-epic"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Ecto","group":"Bonfire utilities","title":"Bonfire.Ecto","headers":[{"id":"Introduction","anchor":"introduction"}]},{"id":"Bonfire.Classify","group":"Feature extensions","title":"Bonfire.Classify","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Tag","group":"Feature extensions","title":"Bonfire.Tag","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Label","group":"Feature extensions","title":"Bonfire.Label","headers":[{"id":"Features","anchor":"features"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.OpenScience","group":"Feature extensions","title":"Bonfire.OpenScience","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Poll","group":"Feature extensions","title":"Bonfire.Poll","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.OpenId","group":"Feature extensions","title":"Bonfire.OpenID","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Search","group":"Feature extensions","title":"Bonfire.Search","headers":[{"id":"Development & Deployment Documentation","anchor":"development-deployment-documentation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.FederateActivitypub","group":"Feature extensions","title":"Bonfire.Federate.ActivityPub","headers":[{"id":"Testing","anchor":"testing"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Editor.Milkdown","group":"Feature extensions","title":"Bonfire.Editor.Milkdown","headers":[{"id":"ROADMAP","anchor":"roadmap"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Me","group":"Feature extensions","title":"Bonfire.Me","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Social","group":"Feature extensions","title":"Bonfire.Social","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.SocialGraph","group":"Feature extensions","title":"Bonfire.Social.Graph","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Posts","group":"Feature extensions","title":"Bonfire.Posts","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Messages","group":"Feature extensions","title":"Bonfire.Messages","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.InviteLinks","group":"Feature extensions","title":"Bonfire.Invite.Links","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Pages","group":"Feature extensions","title":"Bonfire.Pages","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Quantify","group":"Feature extensions","title":"Bonfire.Quantify","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Geolocate","group":"Feature extensions","title":"Bonfire.Geolocate","headers":[{"id":"Usage","anchor":"usage"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Valueflows","group":"Feature extensions","title":"ValueFlows","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Breadpub","group":"Feature extensions","title":"Bonfire.Breadpub","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.ValueflowsObserve","group":"Feature extensions","title":"Bonfire.ValueFlows.Observe","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Upcycle","group":"Feature extensions","title":"Bonfire:Upcycle","headers":[{"id":"Set up","anchor":"set-up"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire","group":"Other utilities","title":"Bonfire","headers":[]},{"id":"ActivityPub","group":"Other utilities","title":"ActivityPub","headers":[{"id":"Installation","anchor":"installation"}]},{"id":"Needle.Uid","group":"Other utilities","title":"Needle.UID","headers":[{"id":"Installation","anchor":"installation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Needle.Ulid","group":"Other utilities","title":"Needle.ULID","headers":[{"id":"Installation","anchor":"installation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"EctoSparkles","group":"Other utilities","title":"EctoSparkles","headers":[{"id":"proload documentation","anchor":"proload-documentation"},{"id":"Example using proload","anchor":"example-using-proload"},{"id":"Example using join_preload","anchor":"example-using-join_preload"},{"id":"reusable_join documentation","anchor":"reusable_join-documentation"},{"id":"Copyright","anchor":"copyright"}]},{"id":"IconifyEx","group":"Other utilities","title":"Iconify for Phoenix","headers":[{"id":"Installation","anchor":"installation"},{"id":"Usage","anchor":"usage"}]},{"id":"Entrepot","group":"Other utilities","title":"Entrepôt","headers":[{"id":"Concepts","anchor":"concepts"},{"id":"Built-in Integrations","anchor":"built-in-integrations"},{"id":"Storages","anchor":"storages"},{"id":"uploads","anchor":"uploads"},{"id":"EntrepôtEcto","anchor":"entrep%C3%B4tecto"}]},{"id":"EntrepotEcto","group":"Other utilities","title":"EntrepôtEcto","headers":[{"id":"Entrepot.Ecto.Type","anchor":"entrepot-ecto-type"},{"id":"Entrepot.Ecto.upload","anchor":"entrepot-ecto-upload"},{"id":"Upload cleanup","anchor":"upload-cleanup"},{"id":"Testing","anchor":"testing"}]},{"id":"Paginator","group":"Other utilities","title":"Paginator","headers":[{"id":"Why?","anchor":"why"},{"id":"Getting started","anchor":"getting-started"},{"id":"Install","anchor":"install"},{"id":"Usage","anchor":"usage"},{"id":"Security Considerations","anchor":"security-considerations"},{"id":"Indexes","anchor":"indexes"},{"id":"Caveats","anchor":"caveats"},{"id":"Documentation","anchor":"documentation"},{"id":"Contributing","anchor":"contributing"},{"id":"LICENSE","anchor":"license"}]},{"id":"PaperTrail","group":"Other utilities","title":"Paper Trail","headers":[{"id":"Example","anchor":"example"},{"id":"Installation","anchor":"installation"},{"id":"Working with multi tenancy","anchor":"working-with-multi-tenancy"},{"id":"Version timestamps","anchor":"version-timestamps"},{"id":"Suggestions","anchor":"suggestions"},{"id":"Contributing","anchor":"contributing"},{"id":"License","anchor":"license"}]},{"id":"Voodoo","group":"Other utilities","title":"Voodoo","headers":[]},{"id":"Untangle","group":"Other utilities","title":"Untangle","headers":[{"id":"Logging/inspecting","anchor":"logging-inspecting"},{"id":"Timing functions","anchor":"timing-functions"},{"id":"Installation","anchor":"installation"},{"id":"In config/config.exs","anchor":"in-config-config-exs"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Arrows","group":"Other utilities","title":"Arrows","headers":[{"id":"Installation","anchor":"installation"},{"id":"Documentation","anchor":"documentation"}]},{"id":"Exto","group":"Other utilities","title":"Exto","headers":[{"id":"Usage","anchor":"usage"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"AbsintheClient","group":"Other utilities","title":"Absinthe Client","headers":[{"id":"License","anchor":"license"}]},{"id":"Grumble","group":"Other utilities","title":"Grumble","headers":[{"id":"Status: beta","anchor":"status-beta"},{"id":"Usage","anchor":"usage"},{"id":"Guide","anchor":"guide"},{"id":"Contributing","anchor":"contributing"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"deps-classic","group":"Dependencies","title":"Classic","headers":[]},{"id":"deps-cooperation","group":"Dependencies","title":"Cooperation","headers":[]}],"tasks":[{"id":"Mix.Tasks.Bonfire.Account.New","deprecated":false,"group":"Utilities","title":"mix bonfire.account.new","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/4","deprecated":false,"title":"get(prompt, key, opts, must?)","anchor":"get/4"},{"id":"password/1","deprecated":false,"title":"password(prompt)","anchor":"password/1"},{"id":"password/3","deprecated":false,"title":"password(prompt, pid, ref)","anchor":"password/3"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.Compile","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.compile","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"force_compile/2","deprecated":false,"title":"force_compile(dep_or_deps, compile_args \\\\ [])","anchor":"force_compile/2"},{"id":"loaded_by_name/3","deprecated":false,"title":"loaded_by_name(given, all_deps \\\\ nil, opts \\\\ [])","anchor":"loaded_by_name/3"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"},{"id":"touch_manifests/0","deprecated":false,"title":"touch_manifests()","anchor":"touch_manifests/0"},{"id":"try_compile/2","deprecated":false,"title":"try_compile(dep_or_deps, compile_args \\\\ [])","anchor":"try_compile/2"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.CopyMigrations","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.copy_migrations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"copy/3","deprecated":false,"title":"copy(extension_paths, dest_path, opts)","anchor":"copy/3"},{"id":"maybe_copy/2","deprecated":false,"title":"maybe_copy(extensions \\\\ nil, opts)","anchor":"maybe_copy/2"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.New","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.new","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.FullDocs","deprecated":false,"group":"Utilities","title":"mix bonfire.full_docs","sections":[{"id":"Command line options","anchor":"module-command-line-options"}]},{"id":"Mix.Tasks.Bonfire.LoadTesting","deprecated":false,"group":"Utilities","title":"mix bonfire.load_testing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Localise.Extract","deprecated":false,"group":"Utilities","title":"mix bonfire.localise.extract","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Release","deprecated":false,"group":"Utilities","title":"mix bonfire.release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"main/1","deprecated":false,"title":"main(args)","anchor":"main/1"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Secrets","deprecated":false,"group":"Utilities","title":"mix bonfire.secrets","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"main/1","deprecated":false,"title":"main(args)","anchor":"main/1"},{"id":"print/1","deprecated":false,"title":"print(int)","anchor":"print/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.User.Admin.Promote","deprecated":false,"group":"Utilities","title":"mix bonfire.user.admin.promote","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.User.New","deprecated":false,"group":"Utilities","title":"mix bonfire.user.new","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Widget.New","deprecated":false,"group":"Utilities","title":"mix bonfire.widget.new","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ext_path_for_module/4","deprecated":false,"title":"ext_path_for_module(module_name, kind_or_prefix \\\\ \"lib\", file_ext \\\\ nil, path_prefix \\\\ \"extensions\")","anchor":"ext_path_for_module/4"},{"id":"igniter/2","deprecated":false,"title":"igniter(igniter, argv)","anchor":"igniter/2"}],"key":"functions"}]},{"id":"Mix.Tasks.Import2alias","deprecated":false,"group":"Utilities","title":"mix import2alias","sections":[]},{"id":"Mix.Tasks.Papertrail.Install","deprecated":false,"group":"Utilities","title":"mix papertrail.install","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]}]} \ No newline at end of file diff --git a/dist/sidebar_items-7A93CEFA.js b/dist/sidebar_items-7A93CEFA.js new file mode 100644 index 0000000000..99f6ea0c11 --- /dev/null +++ b/dist/sidebar_items-7A93CEFA.js @@ -0,0 +1 @@ +sidebarNodes={"modules":[{"id":"Bonfire.Data.AccessControl.Acl","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Acl","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Acl","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(acl \\\\ %Acl{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Circle","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Circle","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Circle","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(circle \\\\ %Circle{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Controlled","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Controlled","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Controlled","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(controlled \\\\ %Controlled{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Encircle","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Encircle","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Encircle","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(encircle \\\\ %Encircle{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Grant","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Grant","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Grant","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(grant \\\\ %Grant{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.InstanceAdmin","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.InstanceAdmin","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.InstanceAdmin","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(admin \\\\ %InstanceAdmin{}, params, cast \\\\ [:is_instance_admin])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Stereotyped","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Stereotyped","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Stereotyped","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(stereotype \\\\ %Stereotyped{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.AccessControl.Verb","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.AccessControl.Verb","sections":[],"nested_context":"Bonfire.Data","nested_title":".AccessControl.Verb","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(verb \\\\ %Verb{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Actor","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Actor","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Actor","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(actor \\\\ %Actor{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Actor.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Actor.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Actor.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_actor_table/0","deprecated":false,"title":"create_actor_table()","anchor":"create_actor_table/0"},{"id":"create_actor_table/1","deprecated":false,"title":"create_actor_table(list)","anchor":"create_actor_table/1"},{"id":"drop_actor_table/0","deprecated":false,"title":"drop_actor_table()","anchor":"drop_actor_table/0"},{"id":"migrate_actor/0","deprecated":false,"title":"migrate_actor()","anchor":"migrate_actor/0"},{"id":"migrate_actor/1","deprecated":false,"title":"migrate_actor(dir)","anchor":"migrate_actor/1"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Peer","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Peer","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Peer","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(peer \\\\ %Peer{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.ActivityPub.Peered","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.ActivityPub.Peered","sections":[],"nested_context":"Bonfire.Data","nested_title":".ActivityPub.Peered","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(peered \\\\ %Peered{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Assort.Ranked","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Assort.Ranked","sections":[],"nested_context":"Bonfire.Data","nested_title":".Assort.Ranked","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(model \\\\ %Ranked{}, params)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Assort.Ranked.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Assort.Ranked.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".Assort.Ranked.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_ranked_table/0","deprecated":false,"title":"create_ranked_table()","anchor":"create_ranked_table/0"},{"id":"create_ranked_table/1","deprecated":false,"title":"create_ranked_table(list)","anchor":"create_ranked_table/1"},{"id":"create_unique_index/1","deprecated":false,"title":"create_unique_index(opts \\\\ [])","anchor":"create_unique_index/1"},{"id":"drop_ranked_table/0","deprecated":false,"title":"drop_ranked_table()","anchor":"drop_ranked_table/0"},{"id":"drop_unique_index/1","deprecated":false,"title":"drop_unique_index(opts \\\\ [])","anchor":"drop_unique_index/1"},{"id":"migrate_ranked/0","deprecated":false,"title":"migrate_ranked()","anchor":"migrate_ranked/0"},{"id":"migrate_ranked/1","deprecated":false,"title":"migrate_ranked(dir)","anchor":"migrate_ranked/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Edges.Edge","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Edges.Edge","sections":[],"nested_context":"Bonfire.Data","nested_title":".Edges.Edge","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(edge \\\\ %Edge{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Edges.EdgeTotal","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Edges.EdgeTotal","sections":[],"nested_context":"Bonfire.Data","nested_title":".Edges.EdgeTotal","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(me \\\\ %EdgeTotal{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Account","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Account","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Account","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(account \\\\ %Account{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Accounted","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Accounted","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Accounted","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(acc \\\\ %Accounted{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Alias","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Alias","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Alias","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(alias \\\\ %Alias{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.AuthSecondFactor","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.AuthSecondFactor","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.AuthSecondFactor","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(totp, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"valid_totp?/2","deprecated":false,"title":"valid_totp?(totp, code)","anchor":"valid_totp?/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.CareClosure","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.CareClosure","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.CareClosure","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_branch/1","deprecated":false,"title":"by_branch(branch)","anchor":"by_branch/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Caretaker","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Caretaker","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Caretaker","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(ct \\\\ %Caretaker{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Character","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Character","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Character","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(char \\\\ %Character{}, params, extra \\\\ nil)","anchor":"changeset/3"},{"id":"changeset_basic/2","deprecated":false,"title":"changeset_basic(char, params)","anchor":"changeset_basic/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"hash/1","deprecated":false,"title":"hash(name)","anchor":"hash/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"uniform/1","deprecated":false,"title":"uniform(name)","anchor":"uniform/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Credential","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Credential","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Credential","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(cred \\\\ %Credential{}, params)","anchor":"changeset/2"},{"id":"check_password/2","deprecated":false,"title":"check_password(password, hash)","anchor":"check_password/2"},{"id":"confirmation_changeset/2","deprecated":false,"title":"confirmation_changeset(cred \\\\ %Credential{}, params)","anchor":"confirmation_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"dummy_check/0","deprecated":false,"title":"dummy_check()","anchor":"dummy_check/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"hash_password/1","deprecated":false,"title":"hash_password(password)","anchor":"hash_password/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Credential.Migration","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Credential.Migration","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Credential.Migration","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_credential_table/0","deprecated":false,"title":"create_credential_table()","anchor":"create_credential_table/0"},{"id":"create_credential_table/1","deprecated":false,"title":"create_credential_table(list)","anchor":"create_credential_table/1"},{"id":"drop_credential_table/0","deprecated":false,"title":"drop_credential_table()","anchor":"drop_credential_table/0"},{"id":"migrate_credential/0","deprecated":false,"title":"migrate_credential()","anchor":"migrate_credential/0"},{"id":"migrate_credential/1","deprecated":false,"title":"migrate_credential(dir)","anchor":"migrate_credential/1"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Email","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Email","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Email","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(email \\\\ %Email{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"confirm/1","deprecated":false,"title":"confirm(email)","anchor":"confirm/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"may_confirm?/2","deprecated":false,"title":"may_confirm?(email, opts \\\\ [])","anchor":"may_confirm?/2"},{"id":"may_request_confirm_email?/2","deprecated":false,"title":"may_request_confirm_email?(email, opts \\\\ [])","anchor":"may_request_confirm_email?/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"put_token/1","deprecated":false,"title":"put_token(email)","anchor":"put_token/1"},{"id":"should_request_or_refresh?/2","deprecated":false,"title":"should_request_or_refresh?(email, opts \\\\ [])","anchor":"should_request_or_refresh?/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.ExtraInfo","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.ExtraInfo","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.ExtraInfo","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(extra_info \\\\ %ExtraInfo{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Named","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Named","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Named","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(hashtag \\\\ %Named{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"normalize_name/1","deprecated":false,"title":"normalize_name(name)","anchor":"normalize_name/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Self","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Self","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Self","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(self \\\\ %Self{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.Settings","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.Settings","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.Settings","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(settings \\\\ %Settings{}, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.SettingsJSONSerdeData","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.SettingsJSONSerdeData","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.SettingsJSONSerdeData","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_json)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Bonfire.Data.Identity.User","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Identity.User","sections":[],"nested_context":"Bonfire.Data","nested_title":".Identity.User","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user \\\\ %User{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"maybe_redact/1","deprecated":false,"title":"maybe_redact(arg1)","anchor":"maybe_redact/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.SharedUser","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.SharedUser","sections":[],"nested_context":"Bonfire.Data","nested_title":".SharedUser","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user \\\\ %SharedUser{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.APActivity","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.APActivity","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.APActivity","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(activity \\\\ %APActivity{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Activity","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Activity","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Activity","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(activity \\\\ %Activity{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Bookmark","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Bookmark","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Bookmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(bookmark \\\\ %Bookmark{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Boost","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Boost","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Boost","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(boost \\\\ %Boost{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Created","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Created","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Created","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(created \\\\ %Created{}, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Emoji","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Emoji","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Emoji","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(emoji \\\\ %Emoji{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Feed","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Feed","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Feed","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(feed \\\\ %Feed{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.FeedPublish","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.FeedPublish","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.FeedPublish","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(pub \\\\ %FeedPublish{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Flag","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Flag","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Flag","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(flag \\\\ %Flag{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Follow","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Follow","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Follow","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(follow \\\\ %Follow{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Like","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Like","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Like","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(like \\\\ %Like{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Message","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Message","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Message","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(message \\\\ %Message{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Pin","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Pin","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Pin","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(pin \\\\ %Pin{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Post","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Post","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Post","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(post \\\\ %Post{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.PostContent","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.PostContent","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.PostContent","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(content \\\\ %PostContent{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Profile","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Profile","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Profile","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(profile \\\\ %Profile{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Replied","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Replied","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Replied","nodeGroups":[{"name":"Functions","nodes":[{"id":"ancestor_ids/1","deprecated":false,"title":"ancestor_ids(schema)","anchor":"ancestor_ids/1"},{"id":"ancestors/1","deprecated":false,"title":"ancestors(schema)","anchor":"ancestors/1"},{"id":"arrange/2","deprecated":false,"title":"arrange(structs_list, opts \\\\ [])","anchor":"arrange/2"},{"id":"build_child/1","deprecated":false,"title":"build_child(schema)","anchor":"build_child/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(replied \\\\ %Replied{}, attrs)","anchor":"changeset/2"},{"id":"children/1","deprecated":false,"title":"children(schema)","anchor":"children/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"depth/1","deprecated":false,"title":"depth(schema)","anchor":"depth/1"},{"id":"descendants/1","deprecated":false,"title":"descendants(schema)","anchor":"descendants/1"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"make_child_of/2","deprecated":false,"title":"make_child_of(changeset, parent)","anchor":"make_child_of/2"},{"id":"parent/1","deprecated":false,"title":"parent(schema)","anchor":"parent/1"},{"id":"parent_id/1","deprecated":false,"title":"parent_id(schema)","anchor":"parent_id/1"},{"id":"path/1","deprecated":false,"title":"path(schema)","anchor":"path/1"},{"id":"path_ids/1","deprecated":false,"title":"path_ids(schema)","anchor":"path_ids/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"root/1","deprecated":false,"title":"root(schema)","anchor":"root/1"},{"id":"root?/1","deprecated":false,"title":"root?(schema)","anchor":"root?/1"},{"id":"root_id/1","deprecated":false,"title":"root_id(schema)","anchor":"root_id/1"},{"id":"siblings/1","deprecated":false,"title":"siblings(schema)","anchor":"siblings/1"},{"id":"subtree/1","deprecated":false,"title":"subtree(schema)","anchor":"subtree/1"},{"id":"where_depth/2","deprecated":false,"title":"where_depth(query \\\\ __MODULE__, depth_params)","anchor":"where_depth/2"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Request","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Request","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Request","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(request \\\\ %Request{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Seen","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Seen","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Seen","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(seen \\\\ %Seen{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Data.Social.Sensitive","deprecated":false,"group":"Data schemas","title":"Bonfire.Data.Social.Sensitive","sections":[],"nested_context":"Bonfire.Data","nested_title":".Social.Sensitive","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(sensitive \\\\ %Sensitive{}, attrs)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Common","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_error/3","deprecated":false,"title":"assign_error(socket, msg, pid \\\\ self())","anchor":"assign_error/3"},{"id":"assign_flash/5","deprecated":false,"title":"assign_flash(socket_or_conn, type, message, assigns \\\\ %{}, pid \\\\ self())","anchor":"assign_flash/5"},{"id":"assign_generic/2","deprecated":false,"title":"assign_generic(socket_or_conn, assigns)","anchor":"assign_generic/2"},{"id":"assign_generic/3","deprecated":false,"title":"assign_generic(socket, key, value)","anchor":"assign_generic/3"},{"id":"assign_generic_global/2","deprecated":false,"title":"assign_generic_global(socket, assigns)","anchor":"assign_generic_global/2"},{"id":"assign_global/2","deprecated":false,"title":"assign_global(socket, assigns)","anchor":"assign_global/2"},{"id":"assign_global/3","deprecated":false,"title":"assign_global(socket, key, value)","anchor":"assign_global/3"},{"id":"assigns/1","deprecated":false,"title":"assigns(socket)","anchor":"assigns/1"},{"id":"assigns_clean/1","deprecated":false,"title":"assigns_clean(tuple)","anchor":"assigns_clean/1"},{"id":"assigns_merge/2","deprecated":false,"title":"assigns_merge(assigns, new)","anchor":"assigns_merge/2"},{"id":"assigns_merge/3","deprecated":false,"title":"assigns_merge(socket, assigns, new)","anchor":"assigns_merge/3"},{"id":"assigns_minimal/1","deprecated":false,"title":"assigns_minimal(assigns)","anchor":"assigns_minimal/1"},{"id":"assigns_subscribe/2","deprecated":false,"title":"assigns_subscribe(socket, assign_names)","anchor":"assigns_subscribe/2"},{"id":"batch_update_many_async/3","deprecated":false,"title":"batch_update_many_async(assigns_sockets, many_opts, opts)","anchor":"batch_update_many_async/3"},{"id":"batch_update_many_async/4","deprecated":false,"title":"batch_update_many_async(current_user, assigns_sockets, many_opts, opts)","anchor":"batch_update_many_async/4"},{"id":"can?/4","deprecated":false,"title":"can?(subject, verbs, object, opts \\\\ [])","anchor":"can?/4"},{"id":"cast_public/2","deprecated":false,"title":"cast_public(socket, assigns_to_broadcast)","anchor":"cast_public/2"},{"id":"cast_self/2","deprecated":false,"title":"cast_self(socket, assigns_to_broadcast)","anchor":"cast_self/2"},{"id":"component_data/1","deprecated":false,"title":"component_data(module)","anchor":"component_data/1"},{"id":"component_props/1","deprecated":false,"title":"component_props(module)","anchor":"component_props/1"},{"id":"copy_go/1","deprecated":false,"title":"copy_go(arg1)","anchor":"copy_go/1"},{"id":"current_url/3","deprecated":false,"title":"current_url(socket_or_assigns, default \\\\ nil, recursing \\\\ false)","anchor":"current_url/3"},{"id":"current_user_or_remote_interaction/3","deprecated":false,"title":"current_user_or_remote_interaction(socket, verb, object)","anchor":"current_user_or_remote_interaction/3"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"filename_for_module_template/1","deprecated":false,"title":"filename_for_module_template(module)","anchor":"filename_for_module_template/1"},{"id":"go_query/1","deprecated":false,"title":"go_query(url)","anchor":"go_query/1"},{"id":"hero_icons_list/0","deprecated":false,"title":"hero_icons_list()","anchor":"hero_icons_list/0"},{"id":"live_aliases/5","deprecated":false,"title":"live_aliases(aliases, path, live_view, action \\\\ nil, opts \\\\ [])","anchor":"live_aliases/5"},{"id":"live_render_component/2","deprecated":false,"title":"live_render_component(conn, load_live_component)","anchor":"live_render_component/2"},{"id":"live_render_with_conn/2","deprecated":false,"title":"live_render_with_conn(conn, live_view)","anchor":"live_render_with_conn/2"},{"id":"live_upload_files/5","deprecated":false,"title":"live_upload_files(module \\\\ nil, upload_field \\\\ :files, current_user, metadata, socket)","anchor":"live_upload_files/5"},{"id":"markdown/1","deprecated":false,"title":"markdown(content)","anchor":"markdown/1"},{"id":"maybe_apply_or_ret/3","deprecated":false,"title":"maybe_apply_or_ret(assigns, mod, fun)","anchor":"maybe_apply_or_ret/3"},{"id":"maybe_assign/3","deprecated":false,"title":"maybe_assign(socket, key, value)","anchor":"maybe_assign/3"},{"id":"maybe_assign_context/2","deprecated":false,"title":"maybe_assign_context(socket, ret)","anchor":"maybe_assign_context/2"},{"id":"maybe_component/2","deprecated":false,"title":"maybe_component(module, context \\\\ [])","anchor":"maybe_component/2"},{"id":"maybe_consume_uploaded_entries/3","deprecated":false,"title":"maybe_consume_uploaded_entries(socket, key, fun)","anchor":"maybe_consume_uploaded_entries/3"},{"id":"maybe_consume_uploaded_entry/3","deprecated":false,"title":"maybe_consume_uploaded_entry(socket, key, fun)","anchor":"maybe_consume_uploaded_entry/3"},{"id":"maybe_cute_gif/0","deprecated":false,"title":"maybe_cute_gif()","anchor":"maybe_cute_gif/0"},{"id":"maybe_last_sentry_event_id/0","deprecated":false,"title":"maybe_last_sentry_event_id()","anchor":"maybe_last_sentry_event_id/0"},{"id":"maybe_push_event/3","deprecated":false,"title":"maybe_push_event(socket, name, data)","anchor":"maybe_push_event/3"},{"id":"maybe_send_update/4","deprecated":false,"title":"maybe_send_update(component, id, assigns, opts \\\\ [])","anchor":"maybe_send_update/4"},{"id":"maybe_stream_insert/4","deprecated":false,"title":"maybe_stream_insert(socket, name, items, opts)","anchor":"maybe_stream_insert/4"},{"id":"module_default_assigns/1","deprecated":false,"title":"module_default_assigns(module)","anchor":"module_default_assigns/1"},{"id":"opts_for_update_many_async/2","deprecated":false,"title":"opts_for_update_many_async(arg, opts)","anchor":"opts_for_update_many_async/2"},{"id":"patch_to/3","deprecated":false,"title":"patch_to(socket_or_conn, to \\\\ nil, opts \\\\ [])","anchor":"patch_to/3"},{"id":"path_fallback/2","deprecated":false,"title":"path_fallback(socket_or_conn, opts)","anchor":"path_fallback/2"},{"id":"redirect_self/1","deprecated":false,"title":"redirect_self(to)","anchor":"redirect_self/1"},{"id":"redirect_to/3","deprecated":false,"title":"redirect_to(socket_or_conn, to \\\\ nil, opts \\\\ [])","anchor":"redirect_to/3"},{"id":"redirect_to_previous_go/4","deprecated":false,"title":"redirect_to_previous_go(conn, params, default, current_path)","anchor":"redirect_to_previous_go/4"},{"id":"render_sface_or_native/1","deprecated":false,"title":"render_sface_or_native(opts \\\\ [])","anchor":"render_sface_or_native/1"},{"id":"rich/2","deprecated":false,"title":"rich(content, opts \\\\ [])","anchor":"rich/2"},{"id":"self_subscribe/2","deprecated":false,"title":"self_subscribe(socket, assign_names)","anchor":"self_subscribe/2"},{"id":"send_self/2","deprecated":false,"title":"send_self(socket \\\\ nil, assigns)","anchor":"send_self/2"},{"id":"send_self_global/2","deprecated":false,"title":"send_self_global(socket \\\\ nil, assigns)","anchor":"send_self_global/2"},{"id":"set_go_after/2","deprecated":false,"title":"set_go_after(conn, path \\\\ nil)","anchor":"set_go_after/2"},{"id":"socket_connected?/1","deprecated":false,"title":"socket_connected?(socket)","anchor":"socket_connected?/1"},{"id":"templated/2","deprecated":false,"title":"templated(content, data \\\\ %{})","anchor":"templated/2"},{"id":"templated_or_remote_markdown/2","deprecated":false,"title":"templated_or_remote_markdown(content, data \\\\ nil)","anchor":"templated_or_remote_markdown/2"},{"id":"the_object/1","deprecated":false,"title":"the_object(assigns)","anchor":"the_object/1"},{"id":"undead_mount/2","deprecated":false,"title":"undead_mount(socket, fun)","anchor":"undead_mount/2"},{"id":"undead_on_mount/2","deprecated":false,"title":"undead_on_mount(socket, fun)","anchor":"undead_on_mount/2"},{"id":"undead_render/2","deprecated":false,"title":"undead_render(assigns, fun)","anchor":"undead_render/2"},{"id":"undead_update/2","deprecated":false,"title":"undead_update(socket, fun)","anchor":"undead_update/2"},{"id":"update_many_async/2","deprecated":false,"title":"update_many_async(assigns_sockets, opts)","anchor":"update_many_async/2"},{"id":"update_many_async/3","deprecated":false,"title":"update_many_async(current_user, assigns_sockets, opts)","anchor":"update_many_async/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ComponentID","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ComponentID","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ComponentID","nodeGroups":[{"name":"Functions","nodes":[{"id":"new/3","deprecated":false,"title":"new(component_module, object_id, parent_id \\\\ nil)","anchor":"new/3"},{"id":"send_assigns/5","deprecated":false,"title":"send_assigns(component_module, id, set, socket, pid \\\\ nil)","anchor":"send_assigns/5"},{"id":"send_updates/4","deprecated":false,"title":"send_updates(component_module, object_id, assigns, pid \\\\ nil)","anchor":"send_updates/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Endpoint.LiveReload","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Endpoint.LiveReload","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Endpoint.LiveReload"},{"id":"Bonfire.UI.Common.EndpointTemplate","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.EndpointTemplate","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.EndpointTemplate","nodeGroups":[{"name":"Functions","nodes":[{"id":"session_options/0","deprecated":false,"title":"session_options()","anchor":"session_options/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorHandling","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorHandling","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorHandling","nodeGroups":[{"name":"Functions","nodes":[{"id":"undead/3","deprecated":false,"title":"undead(socket, fun, return_key \\\\ :noreply)","anchor":"undead/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorHelpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorHelpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(form, field)","anchor":"error_tag/2"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ErrorReportingPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ErrorReportingPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.ErrorReportingPlug"},{"id":"Bonfire.UI.Common.LiveHandlers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LiveHandlers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LiveHandlers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_attrs/2","deprecated":false,"title":"assign_attrs(socket, attrs)","anchor":"assign_attrs/2"},{"id":"handle_event/5","deprecated":false,"title":"handle_event(action, attrs, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_event/5"},{"id":"handle_info/4","deprecated":false,"title":"handle_info(blob, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_info/4"},{"id":"handle_params/5","deprecated":false,"title":"handle_params(params, uri, socket, source_module \\\\ nil, fun \\\\ nil)","anchor":"handle_params/5"},{"id":"handle_progress/5","deprecated":false,"title":"handle_progress(type, entry, socket, source_module, target_fn)","anchor":"handle_progress/5"},{"id":"maybe_from_json/1","deprecated":false,"title":"maybe_from_json(json)","anchor":"maybe_from_json/1"},{"id":"mod_delegate/5","deprecated":false,"title":"mod_delegate(mod, fun, args, socket, no_delegation_fn \\\\ &no_live_handler/2)","anchor":"mod_delegate/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_send_persistent_assigns/2","deprecated":false,"title":"maybe_send_persistent_assigns(assigns \\\\ nil, socket)","anchor":"maybe_send_persistent_assigns/2"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(modules, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.AllowTestSandbox","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.AllowTestSandbox","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Csrf","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Csrf","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Csrf","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Helpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_default_params/3","deprecated":false,"title":"assign_default_params(params, uri, socket)","anchor":"assign_default_params/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(modules, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.Locale","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.Locale","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.Locale","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_put_locale/2","deprecated":false,"title":"assign_put_locale(locale, socket)","anchor":"assign_put_locale/2"},{"id":"assign_put_locale/3","deprecated":false,"title":"assign_put_locale(locale, current_user, socket)","anchor":"assign_put_locale/3"},{"id":"default/2","deprecated":false,"title":"default(_, _)","anchor":"default/2"},{"id":"mount/3","deprecated":false,"title":"mount(_, arg2, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.LivePlugs.StaticChanged","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.LivePlugs.StaticChanged","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.LivePlugs.StaticChanged","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MaybeStaticGeneratorPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MaybeStaticGeneratorPlug","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"},{"id":"maybe_make_request_path_static/2","deprecated":false,"title":"maybe_make_request_path_static(conn, _)","anchor":"maybe_make_request_path_static/2"},{"id":"maybe_serve_static/2","deprecated":false,"title":"maybe_serve_static(conn, opts)","anchor":"maybe_serve_static/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Modularity.DeclareHelpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Modularity.DeclareHelpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Modularity.DeclareHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"component_props/1","deprecated":false,"title":"component_props(module)","anchor":"component_props/1"},{"id":"component_type/1","deprecated":false,"title":"component_type(module)","anchor":"component_type/1"},{"id":"declare_module_optional/2","deprecated":false,"title":"declare_module_optional(name, opts \\\\ [])","anchor":"declare_module_optional/2"},{"id":"declare_nav_component/2","deprecated":false,"title":"declare_nav_component(name, opts \\\\ [])","anchor":"declare_nav_component/2"},{"id":"declare_nav_link/2","deprecated":false,"title":"declare_nav_link(name, opts \\\\ [])","anchor":"declare_nav_link/2"},{"id":"declare_settings/3","deprecated":false,"title":"declare_settings(type, name, opts \\\\ [])","anchor":"declare_settings/3"},{"id":"declare_settings_component/2","deprecated":false,"title":"declare_settings_component(name, opts \\\\ [])","anchor":"declare_settings_component/2"},{"id":"declare_settings_nav_component/2","deprecated":false,"title":"declare_settings_nav_component(name, opts \\\\ [])","anchor":"declare_settings_nav_component/2"},{"id":"declare_settings_nav_link/2","deprecated":false,"title":"declare_settings_nav_link(name, opts \\\\ [])","anchor":"declare_settings_nav_link/2"},{"id":"declare_widget/2","deprecated":false,"title":"declare_widget(name, opts \\\\ [])","anchor":"declare_widget/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.MultiTenancyPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MultiTenancyPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MultiTenancyPlug"},{"id":"Bonfire.UI.Common.MultiselectLive.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.MultiselectLive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.MultiselectLive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.NavModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.NavModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.NavModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"c:declared_nav/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"nav/0","deprecated":false,"title":"nav()","anchor":"nav/0"},{"id":"nav/1","deprecated":false,"title":"nav(app)","anchor":"nav/1"},{"id":"nav_function_error/2","deprecated":false,"title":"nav_function_error(error, args)","anchor":"nav_function_error/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Notifications","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Notifications","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Notifications","nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_notification/2","deprecated":false,"title":"assign_notification(attrs, socket)","anchor":"assign_notification/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(attrs, socket)","anchor":"handle_info/2"},{"id":"notify_broadcast/2","deprecated":false,"title":"notify_broadcast(to_ids, data)","anchor":"notify_broadcast/2"},{"id":"notify_broadcast/5","deprecated":false,"title":"notify_broadcast(to_ids, title, message, url \\\\ nil, icon \\\\ nil)","anchor":"notify_broadcast/5"},{"id":"notify_me/4","deprecated":false,"title":"notify_me(title, message, icon, socket \\\\ nil)","anchor":"notify_me/4"},{"id":"receive_flash/3","deprecated":false,"title":"receive_flash(attrs, pid \\\\ self(), context \\\\ nil)","anchor":"receive_flash/3"},{"id":"receive_notification/2","deprecated":false,"title":"receive_notification(attrs, socket \\\\ nil)","anchor":"receive_notification/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.PlugProtect","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.PlugProtect","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.PlugProtect","nodeGroups":[{"name":"Functions","nodes":[{"id":"allow_action/3","deprecated":false,"title":"allow_action(conn, data, opts)","anchor":"allow_action/3"},{"id":"block_action/3","deprecated":false,"title":"block_action(conn, data, opts)","anchor":"block_action/3"},{"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":"Bonfire.UI.Common.Plugs.ActivityPub","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Plugs.ActivityPub","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Plugs.ActivityPub","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"},{"id":"maybe_redirect/1","deprecated":false,"title":"maybe_redirect(conn)","anchor":"maybe_redirect/1"},{"id":"with_headers/3","deprecated":false,"title":"with_headers(conn, arg2, opts)","anchor":"with_headers/3"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Presence","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Presence","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Presence","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"fetch/2","deprecated":false,"title":"fetch(topic, presences)","anchor":"fetch/2"},{"id":"fetchers_pids/0","deprecated":false,"title":"fetchers_pids()","anchor":"fetchers_pids/0"},{"id":"get_by_key/2","deprecated":false,"title":"get_by_key(topic, key)","anchor":"get_by_key/2"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(broadcast, socket)","anchor":"handle_info/2"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"list/1","deprecated":false,"title":"list(topic)","anchor":"list/1"},{"id":"list_and_maybe_subscribe_to_presence/1","deprecated":false,"title":"list_and_maybe_subscribe_to_presence(socket)","anchor":"list_and_maybe_subscribe_to_presence/1"},{"id":"present!/2","deprecated":false,"title":"present!(socket, meta \\\\ %{})","anchor":"present!/2"},{"id":"present?/2","deprecated":false,"title":"present?(user_id \\\\ nil, socket)","anchor":"present?/2"},{"id":"present_meta/2","deprecated":false,"title":"present_meta(user \\\\ nil, socket)","anchor":"present_meta/2"},{"id":"track/3","deprecated":false,"title":"track(socket, key, meta)","anchor":"track/3"},{"id":"track/4","deprecated":false,"title":"track(pid, topic, key, meta)","anchor":"track/4"},{"id":"untrack/2","deprecated":false,"title":"untrack(socket, key)","anchor":"untrack/2"},{"id":"untrack/3","deprecated":false,"title":"untrack(pid, topic, key)","anchor":"untrack/3"},{"id":"update/3","deprecated":false,"title":"update(socket, key, meta)","anchor":"update/3"},{"id":"update/4","deprecated":false,"title":"update(pid, topic, key, meta)","anchor":"update/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.PreviewContentLive","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.PreviewContentLive","sections":[{"id":"Properties","anchor":"module-properties"},{"id":"Slots","anchor":"module-slots"}],"nested_context":"Bonfire","nested_title":".UI.Common.PreviewContentLive","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, params, socket)","anchor":"handle_event/3"},{"id":"mount/1","deprecated":false,"title":"mount(socket)","anchor":"mount/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.ReusableModalLive","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.ReusableModalLive","sections":[{"id":"Properties","anchor":"module-properties"},{"id":"Slots","anchor":"module-slots"}],"nested_context":"Bonfire","nested_title":".UI.Common.ReusableModalLive","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_assigns/0","deprecated":false,"title":"default_assigns()","anchor":"default_assigns/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, attrs, socket)","anchor":"handle_event/3"},{"id":"modal_id/1","deprecated":false,"title":"modal_id(assigns)","anchor":"modal_id/1"},{"id":"mount/1","deprecated":false,"title":"mount(socket)","anchor":"mount/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"set/3","deprecated":false,"title":"set(assigns, reusable_modal_id \\\\ nil, opts \\\\ [])","anchor":"set/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"early_hints_authed/0","deprecated":false,"title":"early_hints_authed()","anchor":"early_hints_authed/0"},{"id":"early_hints_guest/0","deprecated":false,"title":"early_hints_guest()","anchor":"early_hints_guest/0"},{"id":"early_hints_shared/0","deprecated":false,"title":"early_hints_shared()","anchor":"early_hints_shared/0"},{"id":"gon_js_config/0","deprecated":false,"title":"gon_js_config()","anchor":"gon_js_config/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SEO","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SEO","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SEO","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"open_graph_config/1","deprecated":false,"title":"open_graph_config(conn \\\\ nil)","anchor":"open_graph_config/1"},{"id":"site_config/1","deprecated":false,"title":"site_config(conn \\\\ nil)","anchor":"site_config/1"},{"id":"twitter_config/1","deprecated":false,"title":"twitter_config(conn \\\\ nil)","anchor":"twitter_config/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SEOImage","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SEOImage","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SEOImage","nodeGroups":[{"name":"Functions","nodes":[{"id":"generate_path/6","deprecated":false,"title":"generate_path(id, author_id, title, body, author, image \\\\ nil)","anchor":"generate_path/6"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SettingsModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SettingsModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SettingsModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_component/0","deprecated":false,"title":"declared_component()","anchor":"c:declared_component/0"},{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"c:declared_nav/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"component_function_error/2","deprecated":false,"title":"component_function_error(error, args)","anchor":"component_function_error/2"},{"id":"components/0","deprecated":false,"title":"components()","anchor":"components/0"},{"id":"components/1","deprecated":false,"title":"components(extension)","anchor":"components/1"},{"id":"extension_has_components?/2","deprecated":false,"title":"extension_has_components?(extension, modules \\\\ nil)","anchor":"extension_has_components?/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"modules_component/1","deprecated":false,"title":"modules_component(modules)","anchor":"modules_component/1"},{"id":"modules_nav/1","deprecated":false,"title":"modules_nav(modules)","anchor":"modules_nav/1"},{"id":"nav/0","deprecated":false,"title":"nav()","anchor":"nav/0"},{"id":"nav/1","deprecated":false,"title":"nav(app)","anchor":"nav/1"},{"id":"nav_function_error/2","deprecated":false,"title":"nav_function_error(error, args)","anchor":"nav_function_error/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SmartInput.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SmartInput.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SmartInput.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"active_smart_input_component/2","deprecated":false,"title":"active_smart_input_component(smart_input_component, create_object_type)","anchor":"active_smart_input_component/2"},{"id":"active_smart_input_components/2","deprecated":false,"title":"active_smart_input_components(smart_input_component, create_object_type)","anchor":"active_smart_input_components/2"},{"id":"activity_type_or_reply/1","deprecated":false,"title":"activity_type_or_reply(assigns)","anchor":"activity_type_or_reply/1"},{"id":"all_smart_input_components/0","deprecated":false,"title":"all_smart_input_components()","anchor":"all_smart_input_components/0"},{"id":"assign_open/2","deprecated":false,"title":"assign_open(context, assigns)","anchor":"assign_open/2"},{"id":"close_smart_input/1","deprecated":false,"title":"close_smart_input(js \\\\ %JS{})","anchor":"close_smart_input/1"},{"id":"confirm_close_smart_input/2","deprecated":false,"title":"confirm_close_smart_input(js \\\\ %JS{}, reusable_modal_id)","anchor":"confirm_close_smart_input/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, params, socket)","anchor":"handle_event/3"},{"id":"max_length/0","deprecated":false,"title":"max_length()","anchor":"max_length/0"},{"id":"maximize/1","deprecated":false,"title":"maximize(js \\\\ %JS{})","anchor":"maximize/1"},{"id":"maybe_from_json/1","deprecated":false,"title":"maybe_from_json(json)","anchor":"maybe_from_json/1"},{"id":"maybe_from_json_string/1","deprecated":false,"title":"maybe_from_json_string(json)","anchor":"maybe_from_json_string/1"},{"id":"minimize/1","deprecated":false,"title":"minimize(js \\\\ %JS{})","anchor":"minimize/1"},{"id":"open/2","deprecated":false,"title":"open(js \\\\ %JS{}, opts \\\\ nil)","anchor":"open/2"},{"id":"open_type/4","deprecated":false,"title":"open_type(js \\\\ %JS{}, component, create_object_type, opts \\\\ nil)","anchor":"open_type/4"},{"id":"open_with_text_suggestion/3","deprecated":false,"title":"open_with_text_suggestion(text, set_assigns, socket_or_context)","anchor":"open_with_text_suggestion/3"},{"id":"replace_input_next_time/1","deprecated":false,"title":"replace_input_next_time(socket_or_context)","anchor":"replace_input_next_time/1"},{"id":"reply_to_param/1","deprecated":false,"title":"reply_to_param(arg1)","anchor":"reply_to_param/1"},{"id":"reset_input/1","deprecated":false,"title":"reset_input(socket)","anchor":"reset_input/1"},{"id":"set/2","deprecated":false,"title":"set(context, assigns)","anchor":"set/2"},{"id":"set_smart_input_text/2","deprecated":false,"title":"set_smart_input_text(socket_or_context, text \\\\ \"\\n\")","anchor":"set_smart_input_text/2"},{"id":"show_main/2","deprecated":false,"title":"show_main(js \\\\ %JS{}, opts \\\\ nil)","anchor":"show_main/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"smart_input_name/1","deprecated":false,"title":"smart_input_name(component)","anchor":"smart_input_name/1"},{"id":"switch_smart_input_type/2","deprecated":false,"title":"switch_smart_input_type(type, js \\\\ %JS{})","anchor":"switch_smart_input_type/2"},{"id":"toggle_expanded/4","deprecated":false,"title":"toggle_expanded(js \\\\ %JS{}, target, btn, class)","anchor":"toggle_expanded/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.SmartInputModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.SmartInputModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.SmartInputModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"smart_input_module/0","deprecated":false,"title":"smart_input_module()","anchor":"c:smart_input_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"smart_input_modules_types/0","deprecated":false,"title":"smart_input_modules_types()","anchor":"smart_input_modules_types/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.StaticGenerator","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.StaticGenerator","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.StaticGenerator","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_path/0","deprecated":false,"title":"base_path()","anchor":"base_path/0"},{"id":"batch/0","deprecated":false,"title":"batch()","anchor":"batch/0"},{"id":"file_exists_age/1","deprecated":false,"title":"file_exists_age(file)","anchor":"file_exists_age/1"},{"id":"file_exists_not_expired/1","deprecated":false,"title":"file_exists_not_expired(file)","anchor":"file_exists_not_expired/1"},{"id":"generate/2","deprecated":false,"title":"generate(urls, opts \\\\ [])","anchor":"generate/2"},{"id":"get/3","deprecated":false,"title":"get(conn, url, params_or_body)","anchor":"get/3"},{"id":"maybe_generate/2","deprecated":false,"title":"maybe_generate(urls, opts \\\\ [])","anchor":"maybe_generate/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.StaticGeneratorPlug","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.StaticGeneratorPlug","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.StaticGeneratorPlug","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"},{"id":"make_request_path_static/2","deprecated":false,"title":"make_request_path_static(conn, _ \\\\ nil)","anchor":"make_request_path_static/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.Testing.Helpers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.Testing.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.Testing.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_field_error/3","deprecated":false,"title":"assert_field_error(doc, name, error)","anchor":"assert_field_error/3"},{"id":"assert_field_good/2","deprecated":false,"title":"assert_field_good(doc, name)","anchor":"assert_field_good/2"},{"id":"assert_flash/3","deprecated":false,"title":"assert_flash(view, kind, message)","anchor":"assert_flash/3"},{"id":"assert_flash_kind/2","deprecated":false,"title":"assert_flash_kind(flash, atom)","anchor":"assert_flash_kind/2"},{"id":"assert_flash_message/2","deprecated":false,"title":"assert_flash_message(flash, r)","anchor":"assert_flash_message/2"},{"id":"assert_form_field_error/3","deprecated":false,"title":"assert_form_field_error(doc, field_qualifiers, error)","anchor":"assert_form_field_error/3"},{"id":"assert_form_field_good/3","deprecated":false,"title":"assert_form_field_good(doc, field_name, field_qualifiers)","anchor":"assert_form_field_good/3"},{"id":"conn/0","deprecated":false,"title":"conn()","anchor":"conn/0"},{"id":"conn/1","deprecated":false,"title":"conn(conn)","anchor":"conn/1"},{"id":"conn/2","deprecated":false,"title":"conn(conn, filters)","anchor":"conn/2"},{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_admin!/3","deprecated":false,"title":"fake_admin!(account \\\\ %{}, attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_admin!/3"},{"id":"fake_user!/3","deprecated":false,"title":"fake_user!(account \\\\ %{}, attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_user!/3"},{"id":"fake_user_and_conn!/1","deprecated":false,"title":"fake_user_and_conn!(account \\\\ fake_account!())","anchor":"fake_user_and_conn!/1"},{"id":"fancy_fake_user!/2","deprecated":false,"title":"fancy_fake_user!(name, opts \\\\ [])","anchor":"fancy_fake_user!/2"},{"id":"fancy_fake_user_on_test_instance/1","deprecated":false,"title":"fancy_fake_user_on_test_instance(opts \\\\ [])","anchor":"fancy_fake_user_on_test_instance/1"},{"id":"find_flash/1","deprecated":false,"title":"find_flash(view_or_doc)","anchor":"find_flash/1"},{"id":"find_form_error/2","deprecated":false,"title":"find_form_error(doc, name)","anchor":"find_form_error/2"},{"id":"find_form_field_error/2","deprecated":false,"title":"find_form_field_error(doc, field_qualifier)","anchor":"find_form_field_error/2"},{"id":"floki_attr/2","deprecated":false,"title":"floki_attr(elem, attr)","anchor":"floki_attr/2"},{"id":"floki_click/3","deprecated":false,"title":"floki_click(conn_or_view \\\\ conn(), path_or_value \\\\ %{}, value \\\\ %{})","anchor":"floki_click/3"},{"id":"floki_live/2","deprecated":false,"title":"floki_live(conn \\\\ conn(), path \\\\ nil)","anchor":"floki_live/2"},{"id":"floki_redirect/2","deprecated":false,"title":"floki_redirect(conn \\\\ conn(), path \\\\ nil)","anchor":"floki_redirect/2"},{"id":"floki_response/2","deprecated":false,"title":"floki_response(conn, code \\\\ 200)","anchor":"floki_response/2"},{"id":"floki_submit/4","deprecated":false,"title":"floki_submit(conn_or_view \\\\ conn(), path_or_event, event_or_value \\\\ %{}, value \\\\ %{})","anchor":"floki_submit/4"},{"id":"live_pubsub_wait/1","deprecated":false,"title":"live_pubsub_wait(live_view)","anchor":"live_pubsub_wait/1"},{"id":"live_sockets_disconnect/1","deprecated":false,"title":"live_sockets_disconnect(context)","anchor":"live_sockets_disconnect/1"},{"id":"live_view_stop/1","deprecated":false,"title":"live_view_stop(view)","anchor":"live_view_stop/1"},{"id":"qualifiers_to_input_name/1","deprecated":false,"title":"qualifiers_to_input_name(list)","anchor":"qualifiers_to_input_name/1"},{"id":"render_stateful/3","deprecated":false,"title":"render_stateful(component, assigns \\\\ %{}, context \\\\ [])","anchor":"render_stateful/3"},{"id":"render_stateless/3","deprecated":false,"title":"render_stateless(component, assigns \\\\ [], context \\\\ [])","anchor":"render_stateless/3"},{"id":"session_conn/1","deprecated":false,"title":"session_conn(conn \\\\ build_conn())","anchor":"session_conn/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Common.WidgetModule","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Common.WidgetModule","sections":[],"nested_context":"Bonfire","nested_title":".UI.Common.WidgetModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_widget/0","deprecated":false,"title":"declared_widget()","anchor":"c:declared_widget/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"widget/1","deprecated":false,"title":"widget(module)","anchor":"widget/1"},{"id":"widget_function_error/2","deprecated":false,"title":"widget_function_error(error, args)","anchor":"widget_function_error/2"},{"id":"widgets/0","deprecated":false,"title":"widgets()","anchor":"widgets/0"},{"id":"widgets/1","deprecated":false,"title":"widgets(extension)","anchor":"widgets/1"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Coordination","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.FeedLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.FeedLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.FeedLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.ProcessLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.ProcessLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.ProcessLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.ProcessesLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.ProcessesLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TaskLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TaskLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TaskLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TasksLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TasksLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TasksLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Coordination.TodoLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Coordination.TodoLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Coordination.TodoLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups","sections":[{"id":"Roadmap","anchor":"module-roadmap"},{"id":"Sponsors","anchor":"module-sponsors"},{"id":"📖 Documentation","anchor":"module-documentation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Groups"},{"id":"Bonfire.UI.Groups.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Groups.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Groups.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Groups.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Kanban","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.BoardLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.BoardLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.BoardLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.HomeLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Kanban.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Kanban.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Kanban.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Me","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".UI.Me","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.AccountRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.AccountRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.AccountRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session \\\\ nil, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.AdminRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.AdminRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.AdminRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccount","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentAccount","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentAccountUsers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentAccountUsers","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUser","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentUser","nodeGroups":[{"name":"Functions","nodes":[{"id":"get_current/2","deprecated":false,"title":"get_current(user_id, account_id)","anchor":"get_current/2"},{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.LoadCurrentUserCircles","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.LoadCurrentUserCircles","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(_, _, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.LivePlugs.UserRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.LivePlugs.UserRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.LivePlugs.UserRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"mount/3","deprecated":false,"title":"mount(params \\\\ nil, session \\\\ nil, socket)","anchor":"mount/3"},{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"Bonfire.UI.Me.Plugs.AccountRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.AccountRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.AccountRequired","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":"Bonfire.UI.Me.Plugs.AdminRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.AdminRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.AdminRequired","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":"Bonfire.UI.Me.Plugs.GuestOnly","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.GuestOnly","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.GuestOnly","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":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccount","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentAccount","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":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentAccountUsers","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentAccountUsers","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":"Bonfire.UI.Me.Plugs.LoadCurrentUser","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.LoadCurrentUser","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.LoadCurrentUser","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":"Bonfire.UI.Me.Plugs.UserRequired","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Plugs.UserRequired","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Plugs.UserRequired","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":"Bonfire.UI.Me.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.Routes"},{"id":"Bonfire.UI.Me.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Me.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Me.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Messages.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Messages.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Messages.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Messages.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Messages.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Messages.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Moderation.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Moderation.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Moderation.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Posts.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Posts.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Posts.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Posts.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Posts.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Posts.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reactions.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reactions.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reactions.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reactions.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reactions.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reactions.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.InventoryLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.InventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.InventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.MaterialsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.MaterialsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProcessLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProcessLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProcessLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProcessesLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProcessesLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ProfileInventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ProfileInventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.ResourceLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.ResourceLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.ResourceLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Reflow.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Reflow.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Reflow.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Benchmark","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Benchmark","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Benchmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"feed_backend/0","deprecated":false,"title":"feed_backend()","anchor":"feed_backend/0"},{"id":"feed_full_backend/0","deprecated":false,"title":"feed_full_backend()","anchor":"feed_full_backend/0"},{"id":"feed_full_get/1","deprecated":false,"title":"feed_full_get(conn \\\\ build_conn())","anchor":"feed_full_get/1"},{"id":"feed_page/0","deprecated":false,"title":"feed_page()","anchor":"feed_page/0"},{"id":"feed_queries_without_benchee/0","deprecated":false,"title":"feed_queries_without_benchee()","anchor":"feed_queries_without_benchee/0"},{"id":"feed_query_methods/0","deprecated":false,"title":"feed_query_methods()","anchor":"feed_query_methods/0"},{"id":"feed_render_page/0","deprecated":false,"title":"feed_render_page()","anchor":"feed_render_page/0"},{"id":"live_feed/1","deprecated":false,"title":"live_feed(opts \\\\ [])","anchor":"live_feed/1"},{"id":"misc/0","deprecated":false,"title":"misc()","anchor":"misc/0"},{"id":"render_feed/2","deprecated":false,"title":"render_feed(feed, opts \\\\ [])","anchor":"render_feed/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Graph.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Graph.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Graph.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Social.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Social.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Social.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics"},{"id":"Bonfire.UI.Topics.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics.Routes","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.Routes","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.UI.Topics.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.Topics.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.Topics.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.AddMilestoneLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.AddMilestoneLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateEconomicEventLive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateEconomicEventLive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateResourceSpecForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateResourceSpecForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateUnitForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateUnitForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateUnitForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.CreateValueCalculationForm","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.CreateValueCalculationForm","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"send/3","deprecated":false,"title":"send(changeset, params, socket)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.Integration","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.Integration","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.IntentCreateActivityFieldsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.RuntimeConfig","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","deprecated":false,"group":"UI extensions","title":"Bonfire.UI.ValueFlows.SettingsLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".UI.ValueFlows.SettingsLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"AnimalAvatarGenerator","deprecated":false,"group":"Bonfire utilities","title":"AnimalAvatarGenerator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar/2","deprecated":false,"title":"avatar(seed, opts \\\\ [])","anchor":"avatar/2"},{"id":"avatar_face/2","deprecated":false,"title":"avatar_face(seed, opts \\\\ [])","anchor":"avatar_face/2"},{"id":"brows/0","deprecated":false,"title":"brows()","anchor":"brows/0"},{"id":"clamp/3","deprecated":false,"title":"clamp(value, min, max)","anchor":"clamp/3"},{"id":"create_background/3","deprecated":false,"title":"create_background(round, color, class)","anchor":"create_background/3"},{"id":"create_blackout/1","deprecated":false,"title":"create_blackout(round)","anchor":"create_blackout/1"},{"id":"create_svg/2","deprecated":false,"title":"create_svg(size, children)","anchor":"create_svg/2"},{"id":"darken/2","deprecated":false,"title":"darken(hex, amount)","anchor":"darken/2"},{"id":"ears/0","deprecated":false,"title":"ears()","anchor":"ears/0"},{"id":"empty_shape/0","deprecated":false,"title":"empty_shape()","anchor":"empty_shape/0"},{"id":"eyes/0","deprecated":false,"title":"eyes()","anchor":"eyes/0"},{"id":"faces/0","deprecated":false,"title":"faces()","anchor":"faces/0"},{"id":"hairs/0","deprecated":false,"title":"hairs()","anchor":"hairs/0"},{"id":"muzzles/0","deprecated":false,"title":"muzzles()","anchor":"muzzles/0"},{"id":"patterns/0","deprecated":false,"title":"patterns()","anchor":"patterns/0"}],"key":"functions"}]},{"id":"Arrows","deprecated":false,"group":"Bonfire utilities","title":"Arrows","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Documentation","anchor":"module-documentation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"<~>/2","deprecated":false,"title":"l <~> r","anchor":"%3C~%3E/2"},{"id":"from_ok/1","deprecated":false,"title":"from_ok(x)","anchor":"from_ok/1"},{"id":"ok/1","deprecated":false,"title":"ok(x)","anchor":"ok/1"},{"id":"ok_or/2","deprecated":false,"title":"ok_or(x, err)","anchor":"ok_or/2"},{"id":"to_ok/1","deprecated":false,"title":"to_ok(x)","anchor":"to_ok/1"},{"id":"|>/2","deprecated":false,"title":"l |> r","anchor":"%7C%3E/2"},{"id":"|||/2","deprecated":false,"title":"l ||| r","anchor":"%7C%7C%7C/2"},{"id":"~>/2","deprecated":false,"title":"l ~> r","anchor":"~%3E/2"}],"key":"functions"}]},{"id":"EctoSparkles","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles","sections":[{"id":"proload documentation","anchor":"module-proload-documentation"},{"id":"Example using proload","anchor":"module-example-using-proload"},{"id":"Example using join_preload","anchor":"module-example-using-join_preload"},{"id":"reusable_join documentation","anchor":"module-reusable_join-documentation"},{"id":"Copyright","anchor":"module-copyright"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"join_preload/2","deprecated":false,"title":"join_preload(query, associations)","anchor":"join_preload/2"},{"id":"proload/3","deprecated":false,"title":"proload(query, qual \\\\ :left, associations)","anchor":"proload/3"},{"id":"reusable_join/5","deprecated":false,"title":"reusable_join(query, qual \\\\ :left, bindings, expr, opts)","anchor":"reusable_join/5"}],"key":"functions"}]},{"id":"EctoSparkles.AutoMigrator","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.AutoMigrator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"},{"id":"startup_migrations/0","deprecated":false,"title":"startup_migrations()","anchor":"startup_migrations/0"}],"key":"functions"}]},{"id":"EctoSparkles.Changesets.Errors","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Changesets.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset_errors_string/2","deprecated":false,"title":"changeset_errors_string(changeset, include_schema_tree \\\\ true)","anchor":"changeset_errors_string/2"},{"id":"error/2","deprecated":false,"title":"error(changeset, list)","anchor":"error/2"}],"key":"functions"}]},{"id":"EctoSparkles.DataMigration","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration","sections":[],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"c:base_query/0"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"c:config/0"},{"id":"migrate/1","deprecated":false,"title":"migrate(list)","anchor":"c:migrate/1"}],"key":"callbacks"}]},{"id":"EctoSparkles.DataMigration.Config","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration.Config","sections":[]},{"id":"EctoSparkles.DataMigration.Runner","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.DataMigration.Runner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(migration_module)","anchor":"run/1"}],"key":"functions"}]},{"id":"EctoSparkles.ErlangTermBinary","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.ErlangTermBinary","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_binary)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"EctoSparkles.JSONSerdeData","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.JSONSerdeData","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(term)","anchor":"cast/1"},{"id":"cast/2","deprecated":false,"title":"cast(atom, term)","anchor":"cast/2"},{"id":"dump/1","deprecated":false,"title":"dump(term)","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(raw_json)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"EctoSparkles.Log","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Log","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_if_n_plus_1/1","deprecated":false,"title":"check_if_n_plus_1(query)","anchor":"check_if_n_plus_1/1"},{"id":"format_log/4","deprecated":false,"title":"format_log(result_key, duration_in_ms, measurements, metadata)","anchor":"format_log/4"},{"id":"handle_event/4","deprecated":false,"title":"handle_event(_, measurements, metadata, config)","anchor":"handle_event/4"},{"id":"inline_params/3","deprecated":false,"title":"inline_params(query, params, repo_adapter \\\\ Ecto.Adapters.SQL)","anchor":"inline_params/3"},{"id":"log_query/4","deprecated":false,"title":"log_query(result_key, duration_in_ms, measurements, metadata)","anchor":"log_query/4"},{"id":"setup/1","deprecated":false,"title":"setup(repo_module)","anchor":"setup/1"}],"key":"functions"}]},{"id":"EctoSparkles.Migrator","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.Migrator","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/0","deprecated":false,"title":"create()","anchor":"create/0"},{"id":"create/2","deprecated":false,"title":"create(repo, attempt \\\\ 0)","anchor":"create/2"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"id":"migrate/1","deprecated":false,"title":"migrate(repo)","anchor":"migrate/1"},{"id":"rollback/2","deprecated":false,"title":"rollback(repo \\\\ nil, step \\\\ 1)","anchor":"rollback/2"},{"id":"rollback_all/0","deprecated":false,"title":"rollback_all()","anchor":"rollback_all/0"},{"id":"rollback_all/1","deprecated":false,"title":"rollback_all(repo)","anchor":"rollback_all/1"},{"id":"rollback_to/1","deprecated":false,"title":"rollback_to(version)","anchor":"rollback_to/1"},{"id":"rollback_to/2","deprecated":false,"title":"rollback_to(repo, version)","anchor":"rollback_to/2"},{"id":"status/0","deprecated":false,"title":"status()","anchor":"status/0"}],"key":"functions"}]},{"id":"EctoSparkles.NPlus1Detector","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.NPlus1Detector","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check/1","deprecated":false,"title":"check(query)","anchor":"check/1"},{"id":"do_check/2","deprecated":false,"title":"do_check(query, counter)","anchor":"do_check/2"}],"key":"functions"}]},{"id":"EctoSparkles.SanitiseStrings","deprecated":false,"group":"Bonfire utilities","title":"EctoSparkles.SanitiseStrings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clean_html/2","deprecated":false,"title":"clean_html(changeset, opts \\\\ [])","anchor":"clean_html/2"},{"id":"sanitise_strings/2","deprecated":false,"title":"sanitise_strings(changeset, opts \\\\ [])","anchor":"sanitise_strings/2"},{"id":"strip_all_tags/2","deprecated":false,"title":"strip_all_tags(changeset, opts \\\\ [])","anchor":"strip_all_tags/2"}],"key":"functions"}]},{"id":"Exto","deprecated":false,"group":"Bonfire utilities","title":"Exto","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"flex_schema/1","deprecated":false,"title":"flex_schema(otp_app)","anchor":"flex_schema/1"}],"key":"functions"}]},{"id":"Needle","deprecated":false,"group":"Bonfire utilities","title":"Needle","sections":[{"id":"Intro","anchor":"module-intro"},{"id":"What is Needle?","anchor":"module-what-is-needle"},{"id":"Identifying objects - the UID type","anchor":"module-identifying-objects-the-uid-type"},{"id":"It's just a table","anchor":"module-it-s-just-a-table"},{"id":"Installation","anchor":"module-installation"},{"id":"Declaring Object Types","anchor":"module-declaring-object-types"},{"id":"Adding re-usable fields","anchor":"module-adding-re-usable-fields"},{"id":"Writing Migrations","anchor":"module-writing-migrations"},{"id":"Configuration and overrides","anchor":"module-configuration-and-overrides"},{"id":"Referencing Pointables","anchor":"module-referencing-pointables"},{"id":"Dereferencing Pointables","anchor":"module-dereferencing-pointables"},{"id":"Inserting data","anchor":"module-inserting-data"},{"id":"Querying Needle","anchor":"module-querying-needle"},{"id":"Tradeoffs","anchor":"module-tradeoffs"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"is_needle?/2","deprecated":false,"title":"is_needle?(schema_or_struct, one_of_types \\\\ [:pointable, :virtual, :mixin, :unpointable, :random, :form])","anchor":"is_needle?/2"}],"key":"functions"}]},{"id":"Needle.Changesets","deprecated":false,"group":"Bonfire utilities","title":"Needle.Changesets","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build_assoc/3","deprecated":false,"title":"build_assoc(changeset, assoc_key, rel)","anchor":"build_assoc/3"},{"id":"built?/1","deprecated":false,"title":"built?(arg1)","anchor":"built?/1"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, params, cols)","anchor":"cast/3"},{"id":"cast_assoc/3","deprecated":false,"title":"cast_assoc(changeset, assoc_key, opts \\\\ [])","anchor":"cast_assoc/3"},{"id":"cast_belongs_to/4","deprecated":false,"title":"cast_belongs_to(changeset, assoc_key, assoc, opts)","anchor":"cast_belongs_to/4"},{"id":"cast_has_many/4","deprecated":false,"title":"cast_has_many(changeset, assoc_key, assoc, opts)","anchor":"cast_has_many/4"},{"id":"cast_has_one/4","deprecated":false,"title":"cast_has_one(changeset, assoc_key, assoc, opts)","anchor":"cast_has_one/4"},{"id":"config_for/3","deprecated":false,"title":"config_for(module, key, default \\\\ [])","anchor":"config_for/3"},{"id":"deleted?/1","deprecated":false,"title":"deleted?(arg1)","anchor":"deleted?/1"},{"id":"get_field/2","deprecated":false,"title":"get_field(cs, key)","anchor":"get_field/2"},{"id":"insert_verb/1","deprecated":false,"title":"insert_verb(thing)","anchor":"insert_verb/1"},{"id":"loaded?/1","deprecated":false,"title":"loaded?(arg1)","anchor":"loaded?/1"},{"id":"merge_child_errors/1","deprecated":false,"title":"merge_child_errors(cs)","anchor":"merge_child_errors/1"},{"id":"put_assoc/3","deprecated":false,"title":"put_assoc(changeset, assoc_key, rels)","anchor":"put_assoc/3"},{"id":"put_assoc!/3","deprecated":false,"title":"put_assoc!(changeset, assoc_key, rels)","anchor":"put_assoc!/3"},{"id":"put_id_on_mixins/3","deprecated":false,"title":"put_id_on_mixins(attrs, mixin_names, pointable)","anchor":"put_id_on_mixins/3"},{"id":"put_new_id/2","deprecated":false,"title":"put_new_id(changeset, schema)","anchor":"put_new_id/2"},{"id":"state/1","deprecated":false,"title":"state(thing)","anchor":"state/1"},{"id":"update_data/2","deprecated":false,"title":"update_data(changeset, fun)","anchor":"update_data/2"},{"id":"valid?/1","deprecated":false,"title":"valid?(cs)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Needle.Form","deprecated":false,"group":"Bonfire utilities","title":"Needle.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"form_schema/1","deprecated":false,"title":"form_schema(list)","anchor":"form_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Migration","deprecated":false,"group":"Bonfire utilities","title":"Needle.Migration","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"pointer_type/0","deprecated":false,"title":"pointer_type()","anchor":"t:pointer_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"add_is_not_deleted/1","deprecated":false,"title":"add_is_not_deleted(table)","anchor":"add_is_not_deleted/1"},{"id":"create_mixin_table/3","deprecated":false,"title":"create_mixin_table(name, opts \\\\ [], body)","anchor":"create_mixin_table/3"},{"id":"create_pointable_table/2","deprecated":false,"title":"create_pointable_table(a, b)","anchor":"create_pointable_table/2"},{"id":"create_pointable_table/3","deprecated":false,"title":"create_pointable_table(a, b, c)","anchor":"create_pointable_table/3"},{"id":"create_pointable_table/4","deprecated":false,"title":"create_pointable_table(a, b, c, d)","anchor":"create_pointable_table/4"},{"id":"create_random_table/3","deprecated":false,"title":"create_random_table(name, opts \\\\ [], body)","anchor":"create_random_table/3"},{"id":"create_virtual/1","deprecated":false,"title":"create_virtual(schema)","anchor":"create_virtual/1"},{"id":"create_virtual/2","deprecated":false,"title":"create_virtual(source, id)","anchor":"create_virtual/2"},{"id":"create_virtual_trigger_function/0","deprecated":false,"title":"create_virtual_trigger_function()","anchor":"create_virtual_trigger_function/0"},{"id":"drop_mixin_table/1","deprecated":false,"title":"drop_mixin_table(name)","anchor":"drop_mixin_table/1"},{"id":"drop_pointable_table/1","deprecated":false,"title":"drop_pointable_table(schema)","anchor":"drop_pointable_table/1"},{"id":"drop_pointable_table/2","deprecated":false,"title":"drop_pointable_table(name, id)","anchor":"drop_pointable_table/2"},{"id":"drop_random_table/1","deprecated":false,"title":"drop_random_table(name)","anchor":"drop_random_table/1"},{"id":"drop_table/1","deprecated":false,"title":"drop_table(name)","anchor":"drop_table/1"},{"id":"drop_virtual/1","deprecated":false,"title":"drop_virtual(schema)","anchor":"drop_virtual/1"},{"id":"drop_virtual/2","deprecated":false,"title":"drop_virtual(name, id)","anchor":"drop_virtual/2"},{"id":"init_pointers/0","deprecated":false,"title":"init_pointers()","anchor":"init_pointers/0"},{"id":"init_pointers/1","deprecated":false,"title":"init_pointers(atom)","anchor":"init_pointers/1"},{"id":"init_pointers_ulid_extra/0","deprecated":false,"title":"init_pointers_ulid_extra()","anchor":"init_pointers_ulid_extra/0"},{"id":"migrate_virtual/1","deprecated":false,"title":"migrate_virtual(schema)","anchor":"migrate_virtual/1"},{"id":"migrate_virtual/2","deprecated":false,"title":"migrate_virtual(name, schema)","anchor":"migrate_virtual/2"},{"id":"migrate_virtual/3","deprecated":false,"title":"migrate_virtual(atom, name, id)","anchor":"migrate_virtual/3"},{"id":"pointer/2","deprecated":false,"title":"pointer(table \\\\ Pointer, type)","anchor":"pointer/2"},{"id":"strong_pointer/1","deprecated":false,"title":"strong_pointer(table \\\\ Pointer)","anchor":"strong_pointer/1"},{"id":"unbreakable_pointer/1","deprecated":false,"title":"unbreakable_pointer(table \\\\ Pointer)","anchor":"unbreakable_pointer/1"},{"id":"weak_pointer/1","deprecated":false,"title":"weak_pointer(table \\\\ Pointer)","anchor":"weak_pointer/1"}],"key":"functions"}]},{"id":"Needle.Mixin","deprecated":false,"group":"Bonfire utilities","title":"Needle.Mixin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"mixin_schema/1","deprecated":false,"title":"mixin_schema(list)","anchor":"mixin_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.NotFound","deprecated":false,"group":"Bonfire utilities","title":"Needle.NotFound","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(name \\\\ \"Pointer\")","anchor":"new/1"}],"key":"functions"}]},{"id":"Needle.Pointable","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointable","sections":[{"id":"Sample Usage","anchor":"module-sample-usage"},{"id":"Overriding with configuration","anchor":"module-overriding-with-configuration"},{"id":"Introspection","anchor":"module-introspection"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pointable_schema/1","deprecated":false,"title":"pointable_schema(body)","anchor":"pointable_schema/1"}],"key":"functions"}]},{"id":"Needle.Pointer","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(id \\\\ Needle.UID.generate(), table)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Needle.Pointers","deprecated":false,"group":"Bonfire utilities","title":"Needle.Pointers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_points_to!/2","deprecated":false,"title":"assert_points_to!(pointer, term)","anchor":"assert_points_to!/2"},{"id":"cast!/1","deprecated":false,"title":"cast!(p)","anchor":"cast!/1"},{"id":"get_table_id!/1","deprecated":false,"title":"get_table_id!(schema)","anchor":"get_table_id!/1"},{"id":"plan/1","deprecated":false,"title":"plan(pointers)","anchor":"plan/1"},{"id":"query_base/1","deprecated":false,"title":"query_base(type \\\\ nil)","anchor":"query_base/1"},{"id":"schema/1","deprecated":false,"title":"schema(pointer)","anchor":"schema/1"},{"id":"table/1","deprecated":false,"title":"table(pointer)","anchor":"table/1"}],"key":"functions"}]},{"id":"Needle.Random","deprecated":false,"group":"Bonfire utilities","title":"Needle.Random","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"random_schema/1","deprecated":false,"title":"random_schema(list)","anchor":"random_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Table","deprecated":false,"group":"Bonfire utilities","title":"Needle.Table","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Needle.Tables","deprecated":false,"group":"Bonfire utilities","title":"Needle.Tables","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"query/0","deprecated":false,"title":"query()","anchor":"t:query/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"data/0"},{"id":"id/1","deprecated":false,"title":"id(query)","anchor":"id/1"},{"id":"id!/1","deprecated":false,"title":"id!(query)","anchor":"id!/1"},{"id":"ids!/1","deprecated":false,"title":"ids!(ids)","anchor":"ids!/1"},{"id":"mixin_modules/0","deprecated":false,"title":"mixin_modules()","anchor":"mixin_modules/0"},{"id":"schema/1","deprecated":false,"title":"schema(query)","anchor":"schema/1"},{"id":"schema!/1","deprecated":false,"title":"schema!(query)","anchor":"schema!/1"},{"id":"schema?/1","deprecated":false,"title":"schema?(module)","anchor":"schema?/1"},{"id":"schema_modules/0","deprecated":false,"title":"schema_modules()","anchor":"schema_modules/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"},{"id":"table/1","deprecated":false,"title":"table(query)","anchor":"table/1"},{"id":"table!/1","deprecated":false,"title":"table!(query)","anchor":"table!/1"}],"key":"functions"}]},{"id":"Needle.UID","deprecated":false,"group":"Bonfire utilities","title":"Needle.UID","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(term, params \\\\ nil)","anchor":"cast/2"},{"id":"cast!/2","deprecated":false,"title":"cast!(value, params \\\\ nil)","anchor":"cast!/2"},{"id":"dump/3","deprecated":false,"title":"dump(value, dumper \\\\ nil, params \\\\ nil)","anchor":"dump/3"},{"id":"generate/1","deprecated":false,"title":"generate(params_or_timestamp \\\\ nil)","anchor":"generate/1"},{"id":"is_pride?/2","deprecated":false,"title":"is_pride?(str, params \\\\ nil)","anchor":"is_pride?/2"},{"id":"is_ulid?/1","deprecated":false,"title":"is_ulid?(str)","anchor":"is_ulid?/1"},{"id":"is_uuid?/2","deprecated":false,"title":"is_uuid?(str, params \\\\ nil)","anchor":"is_uuid?/2"},{"id":"load/3","deprecated":false,"title":"load(value, loader \\\\ nil, params \\\\ nil)","anchor":"load/3"},{"id":"synthesise!/1","deprecated":false,"title":"synthesise!(x)","anchor":"synthesise!/1"},{"id":"timestamp/1","deprecated":false,"title":"timestamp(encoded)","anchor":"timestamp/1"},{"id":"type/1","deprecated":false,"title":"type(params)","anchor":"type/1"},{"id":"valid?/2","deprecated":false,"title":"valid?(str, params \\\\ nil)","anchor":"valid?/2"}],"key":"functions"}]},{"id":"Needle.ULID","deprecated":false,"group":"Bonfire utilities","title":"Needle.ULID","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bingenerate/1","deprecated":false,"title":"bingenerate(timestamp \\\\ System.system_time(:millisecond))","anchor":"bingenerate/1"},{"id":"bintimestamp/1","deprecated":false,"title":"bintimestamp(arg)","anchor":"bintimestamp/1"},{"id":"cast/1","deprecated":false,"title":"cast(value)","anchor":"cast/1"},{"id":"cast!/1","deprecated":false,"title":"cast!(value)","anchor":"cast!/1"},{"id":"decode/1","deprecated":false,"title":"decode(bytes)","anchor":"decode/1"},{"id":"dump/1","deprecated":false,"title":"dump(encoded)","anchor":"dump/1"},{"id":"dump!/1","deprecated":false,"title":"dump!(encoded)","anchor":"dump!/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"encode/2","deprecated":false,"title":"encode(bytes, leading_zeroes? \\\\ true)","anchor":"encode/2"},{"id":"encoded_randomness/1","deprecated":false,"title":"encoded_randomness(arg)","anchor":"encoded_randomness/1"},{"id":"encoded_timestamp/1","deprecated":false,"title":"encoded_timestamp(arg)","anchor":"encoded_timestamp/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"generate/1","deprecated":false,"title":"generate(timestamp \\\\ System.system_time(:millisecond))","anchor":"generate/1"},{"id":"load/1","deprecated":false,"title":"load(bytes)","anchor":"load/1"},{"id":"synthesise!/1","deprecated":false,"title":"synthesise!(x)","anchor":"synthesise!/1"},{"id":"timestamp/1","deprecated":false,"title":"timestamp(encoded)","anchor":"timestamp/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"},{"id":"valid?/1","deprecated":false,"title":"valid?(arg1)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Needle.ULID.Migration","deprecated":false,"group":"Bonfire utilities","title":"Needle.ULID.Migration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"init_pointers_ulid_extra/0","deprecated":false,"title":"init_pointers_ulid_extra()","anchor":"init_pointers_ulid_extra/0"},{"id":"init_pointers_ulid_extra/1","deprecated":false,"title":"init_pointers_ulid_extra(atom)","anchor":"init_pointers_ulid_extra/1"}],"key":"functions"}]},{"id":"Needle.Unpointable","deprecated":false,"group":"Bonfire utilities","title":"Needle.Unpointable","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"unpointable_schema/1","deprecated":false,"title":"unpointable_schema(list)","anchor":"unpointable_schema/1"},{"id":"using/2","deprecated":false,"title":"using(module, options)","anchor":"using/2"}],"key":"functions"}]},{"id":"Needle.Virtual","deprecated":false,"group":"Bonfire utilities","title":"Needle.Virtual","sections":[{"id":"Sample Usage","anchor":"module-sample-usage"},{"id":"Overriding with configuration","anchor":"module-overriding-with-configuration"},{"id":"Introspection","anchor":"module-introspection"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"virtual_schema/1","deprecated":false,"title":"virtual_schema(body)","anchor":"virtual_schema/1"}],"key":"functions"}]},{"id":"Releaser.Git","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Git","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_commit_and_tag/1","deprecated":false,"title":"add_commit_and_tag(version)","anchor":"add_commit_and_tag/1"}],"key":"functions"}]},{"id":"Releaser.Publish","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Publish","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"publish!/0","deprecated":false,"title":"publish!()","anchor":"publish!/0"}],"key":"functions"}]},{"id":"Releaser.Tests","deprecated":false,"group":"Bonfire utilities","title":"Releaser.Tests","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run_tests!/0","deprecated":false,"title":"run_tests!()","anchor":"run_tests!/0"}],"key":"functions"}]},{"id":"Releaser.VersionUtils","deprecated":false,"group":"Bonfire utilities","title":"Releaser.VersionUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bump_major/1","deprecated":false,"title":"bump_major(version)","anchor":"bump_major/1"},{"id":"bump_minor/1","deprecated":false,"title":"bump_minor(version)","anchor":"bump_minor/1"},{"id":"bump_patch/1","deprecated":false,"title":"bump_patch(version)","anchor":"bump_patch/1"},{"id":"bump_pre/2","deprecated":false,"title":"bump_pre(version, pre_label)","anchor":"bump_pre/2"},{"id":"get_version/1","deprecated":false,"title":"get_version(mix_path \\\\ \".\")","anchor":"get_version/1"},{"id":"set_version/2","deprecated":false,"title":"set_version(version, mix_path \\\\ \".\")","anchor":"set_version/2"},{"id":"update_version/2","deprecated":false,"title":"update_version(version, pre_label)","anchor":"update_version/2"},{"id":"version_to_string/1","deprecated":false,"title":"version_to_string(version)","anchor":"version_to_string/1"}],"key":"functions"}]},{"id":"Untangle","deprecated":false,"group":"Bonfire utilities","title":"Untangle","sections":[{"id":"Logging/inspecting","anchor":"module-logging-inspecting"},{"id":"Timing functions","anchor":"module-timing-functions"},{"id":"Installation","anchor":"module-installation"},{"id":"In config/config.exs","anchor":"module-in-config-config-exs"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_dbg/3","deprecated":false,"title":"custom_dbg(code, options, env)","anchor":"custom_dbg/3"},{"id":"debug/3","deprecated":false,"title":"debug(thing, label \\\\ nil, opts \\\\ [])","anchor":"debug/3"},{"id":"dump/3","deprecated":false,"title":"dump(thing, label \\\\ nil, opts \\\\ [])","anchor":"dump/3"},{"id":"error/3","deprecated":false,"title":"error(thing, label \\\\ nil, opts \\\\ [])","anchor":"error/3"},{"id":"format_application_location/3","deprecated":false,"title":"format_application_location(app \\\\ nil, module, location)","anchor":"format_application_location/3"},{"id":"format_location/2","deprecated":false,"title":"format_location(dep_path \\\\ nil, opts)","anchor":"format_location/2"},{"id":"format_stacktrace/1","deprecated":false,"title":"format_stacktrace(trace \\\\ nil)","anchor":"format_stacktrace/1"},{"id":"format_stacktrace_entry/1","deprecated":false,"title":"format_stacktrace_entry(entry)","anchor":"format_stacktrace_entry/1"},{"id":"format_stacktrace_label/2","deprecated":false,"title":"format_stacktrace_label(stacktrace, skip \\\\ 0)","anchor":"format_stacktrace_label/2"},{"id":"format_stacktrace_sliced/3","deprecated":false,"title":"format_stacktrace_sliced(stacktrace, starts \\\\ 1, amount \\\\ 5)","anchor":"format_stacktrace_sliced/3"},{"id":"info/3","deprecated":false,"title":"info(thing, label \\\\ nil, opts \\\\ [])","anchor":"info/3"},{"id":"log_level?/1","deprecated":false,"title":"log_level?(level)","anchor":"log_level?/1"},{"id":"maybe_dbg/3","deprecated":false,"title":"maybe_dbg(thing, label \\\\ \"\", options)","anchor":"maybe_dbg/3"},{"id":"maybe_info/3","deprecated":false,"title":"maybe_info(thing, label \\\\ \"\", options)","anchor":"maybe_info/3"},{"id":"module_name/1","deprecated":false,"title":"module_name(name)","anchor":"module_name/1"},{"id":"smart/3","deprecated":false,"title":"smart(thing, label \\\\ \"\", options)","anchor":"smart/3"},{"id":"warn/3","deprecated":false,"title":"warn(thing, label \\\\ nil, opts \\\\ [])","anchor":"warn/3"}],"key":"functions"}]},{"id":"Untangle.Time","deprecated":false,"group":"Bonfire utilities","title":"Untangle.Time","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"time/0","deprecated":false,"title":"time()","anchor":"time/0"},{"id":"time/2","deprecated":false,"title":"time(fn_body, context)","anchor":"time/2"}],"key":"functions"}]},{"id":"Voodoo","deprecated":false,"group":"Bonfire utilities","title":"Voodoo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"def_reverse_router/2","deprecated":false,"title":"def_reverse_router(name, opts)","anchor":"def_reverse_router/2"},{"id":"router/1","deprecated":false,"title":"router(map)","anchor":"router/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL","sections":[{"id":"GraphQL Introduction","anchor":"module-graphql-introduction"},{"id":"Absinthe Introduction","anchor":"module-absinthe-introduction"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".API.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"admin_or/2","deprecated":false,"title":"admin_or(info, value)","anchor":"admin_or/2"},{"id":"admin_or_empty_page/1","deprecated":false,"title":"admin_or_empty_page(info)","anchor":"admin_or_empty_page/1"},{"id":"admin_or_not_permitted/1","deprecated":false,"title":"admin_or_not_permitted(info)","anchor":"admin_or_not_permitted/1"},{"id":"cast_int_ulid_id/1","deprecated":false,"title":"cast_int_ulid_id(arg1)","anchor":"cast_int_ulid_id/1"},{"id":"cast_nonnegint/1","deprecated":false,"title":"cast_nonnegint(int)","anchor":"cast_nonnegint/1"},{"id":"cast_posint/1","deprecated":false,"title":"cast_posint(int)","anchor":"cast_posint/1"},{"id":"cast_ulid/1","deprecated":false,"title":"cast_ulid(str)","anchor":"cast_ulid/1"},{"id":"current_account/1","deprecated":false,"title":"current_account(arg1)","anchor":"current_account/1"},{"id":"current_user/1","deprecated":false,"title":"current_user(arg1)","anchor":"current_user/1"},{"id":"current_user_or/2","deprecated":false,"title":"current_user_or(info, value)","anchor":"current_user_or/2"},{"id":"current_user_or_empty_page/1","deprecated":false,"title":"current_user_or_empty_page(info)","anchor":"current_user_or_empty_page/1"},{"id":"current_user_or_not_found/1","deprecated":false,"title":"current_user_or_not_found(info)","anchor":"current_user_or_not_found/1"},{"id":"current_user_or_not_logged_in/1","deprecated":false,"title":"current_user_or_not_logged_in(info)","anchor":"current_user_or_not_logged_in/1"},{"id":"empty_page/0","deprecated":false,"title":"empty_page()","anchor":"empty_page/0"},{"id":"equals_or/4","deprecated":false,"title":"equals_or(l, r, good, bad)","anchor":"equals_or/4"},{"id":"equals_or_not_permitted/2","deprecated":false,"title":"equals_or_not_permitted(l, r)","anchor":"equals_or_not_permitted/2"},{"id":"full_page_opts/3","deprecated":false,"title":"full_page_opts(attrs, cursor_validators, opts \\\\ %{})","anchor":"full_page_opts/3"},{"id":"guest_only/1","deprecated":false,"title":"guest_only(info)","anchor":"guest_only/1"},{"id":"in_list?/1","deprecated":false,"title":"in_list?(info)","anchor":"in_list?/1"},{"id":"invalid_credential/0","deprecated":false,"title":"invalid_credential()","anchor":"invalid_credential/0"},{"id":"is_authenticated/1","deprecated":false,"title":"is_authenticated(arg1)","anchor":"is_authenticated/1"},{"id":"limit_page_opts/2","deprecated":false,"title":"limit_page_opts(attrs, opts \\\\ %{})","anchor":"limit_page_opts/2"},{"id":"list_depth/1","deprecated":false,"title":"list_depth(info)","anchor":"list_depth/1"},{"id":"not_found/0","deprecated":false,"title":"not_found()","anchor":"not_found/0"},{"id":"not_in_list_or/2","deprecated":false,"title":"not_in_list_or(info, value)","anchor":"not_in_list_or/2"},{"id":"not_in_list_or_empty_page/1","deprecated":false,"title":"not_in_list_or_empty_page(info)","anchor":"not_in_list_or_empty_page/1"},{"id":"not_logged_in/0","deprecated":false,"title":"not_logged_in()","anchor":"not_logged_in/0"},{"id":"not_permitted/1","deprecated":false,"title":"not_permitted(what \\\\ \"to do this\")","anchor":"not_permitted/1"},{"id":"parent_name/1","deprecated":false,"title":"parent_name(resolution)","anchor":"parent_name/1"},{"id":"predicated/1","deprecated":false,"title":"predicated(fun)","anchor":"predicated/1"},{"id":"predicated/2","deprecated":false,"title":"predicated(fun, arg)","anchor":"predicated/2"},{"id":"reproject/2","deprecated":false,"title":"reproject(projection, list)","anchor":"reproject/2"},{"id":"reverse_path/1","deprecated":false,"title":"reverse_path(info)","anchor":"reverse_path/1"},{"id":"validate_cursor/2","deprecated":false,"title":"validate_cursor(arg1, arg2)","anchor":"validate_cursor/2"},{"id":"wanted/2","deprecated":false,"title":"wanted(resolution, path \\\\ [])","anchor":"wanted/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Auth","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Auth","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Auth","nodeGroups":[{"name":"Functions","nodes":[{"id":"account_by/1","deprecated":false,"title":"account_by(account)","anchor":"account_by/1"},{"id":"build_context/1","deprecated":false,"title":"build_context(conn)","anchor":"build_context/1"},{"id":"login/3","deprecated":false,"title":"login(_, attrs, _)","anchor":"login/3"},{"id":"select_user/3","deprecated":false,"title":"select_user(_, attrs, info)","anchor":"select_user/3"},{"id":"set_context_from_resolution/2","deprecated":false,"title":"set_context_from_resolution(resolution, _)","anchor":"set_context_from_resolution/2"},{"id":"set_session_from_context/2","deprecated":false,"title":"set_session_from_context(conn, arg2)","anchor":"set_session_from_context/2"},{"id":"token_new/1","deprecated":false,"title":"token_new(ids)","anchor":"token_new/1"},{"id":"token_verify/1","deprecated":false,"title":"token_verify(token)","anchor":"token_verify/1"},{"id":"user_by/1","deprecated":false,"title":"user_by(arg)","anchor":"user_by/1"},{"id":"user_by/2","deprecated":false,"title":"user_by(username_or_user_id, account)","anchor":"user_by/2"},{"id":"username/1","deprecated":false,"title":"username(user)","anchor":"username/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.CommonResolver","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.CommonResolver","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.CommonResolver","nodeGroups":[{"name":"Functions","nodes":[{"id":"canonical_url_edge/3","deprecated":false,"title":"canonical_url_edge(obj, _, _)","anchor":"canonical_url_edge/3"},{"id":"context_edge/3","deprecated":false,"title":"context_edge(arg1, _, info)","anchor":"context_edge/3"},{"id":"context_edges/3","deprecated":false,"title":"context_edges(map, page_opts, info)","anchor":"context_edges/3"},{"id":"created_at_edge/3","deprecated":false,"title":"created_at_edge(map, _, _)","anchor":"created_at_edge/3"},{"id":"delete/2","deprecated":false,"title":"delete(map, info)","anchor":"delete/2"},{"id":"display_username_edge/3","deprecated":false,"title":"display_username_edge(object, _, _)","anchor":"display_username_edge/3"},{"id":"fetch_context_edge/2","deprecated":false,"title":"fetch_context_edge(_, ids)","anchor":"fetch_context_edge/2"},{"id":"fetch_context_edges/3","deprecated":false,"title":"fetch_context_edges(page_opts, info, pointers)","anchor":"fetch_context_edges/3"},{"id":"is_deleted_edge/3","deprecated":false,"title":"is_deleted_edge(parent, _, _)","anchor":"is_deleted_edge/3"},{"id":"is_disabled_edge/3","deprecated":false,"title":"is_disabled_edge(parent, _, _)","anchor":"is_disabled_edge/3"},{"id":"is_hidden_edge/3","deprecated":false,"title":"is_hidden_edge(parent, _, _)","anchor":"is_hidden_edge/3"},{"id":"is_local_edge/3","deprecated":false,"title":"is_local_edge(map, _, _)","anchor":"is_local_edge/3"},{"id":"is_public_edge/3","deprecated":false,"title":"is_public_edge(parent, _, _)","anchor":"is_public_edge/3"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.CommonSchema","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.CommonSchema","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.CommonSchema"},{"id":"Bonfire.API.GraphQL.Cursor","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Cursor","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Cursor"},{"id":"Bonfire.API.GraphQL.FetchFields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchFields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchFields","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_fields)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.FetchPage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchPage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchPage","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.FetchPages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.FetchPages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.FetchPages","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(fetch_pages)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Fields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Fields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Fields","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(fields, key, default \\\\ nil)","anchor":"get/3"},{"id":"getter/2","deprecated":false,"title":"getter(key, default \\\\ nil)","anchor":"getter/2"},{"id":"new/2","deprecated":false,"title":"new(data, group_fn)","anchor":"new/2"},{"id":"new/3","deprecated":false,"title":"new(data, group_fn, map_fn)","anchor":"new/3"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.JSON","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.JSON","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.JSON"},{"id":"Bonfire.API.GraphQL.MastoCompatible.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.MastoCompatible.Router","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.MastoCompatible.Router","nodeGroups":[{"name":"Functions","nodes":[{"id":"include_masto_api/0","deprecated":false,"title":"include_masto_api()","anchor":"include_masto_api/0"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.CollapseErrors","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.CollapseErrors","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.CollapseErrors","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, _)","anchor":"call/2"},{"id":"collapse/1","deprecated":false,"title":"collapse(list)","anchor":"collapse/1"},{"id":"collapse/2","deprecated":false,"title":"collapse(other, extra)","anchor":"collapse/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.Debug","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, arg2)","anchor":"call/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Middleware.RenderLists","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Middleware.RenderLists","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Middleware.RenderLists","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(resolution, _)","anchor":"call/2"},{"id":"collapse/1","deprecated":false,"title":"collapse(list)","anchor":"collapse/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Page","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Page","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Page","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/4","deprecated":false,"title":"new(edges, total_count, cursor_fn, page_opts)","anchor":"new/4"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.PageInfo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.PageInfo","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.PageInfo","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/4","deprecated":false,"title":"new(start_cursor, end_cursor, has_previous_page, has_next_page)","anchor":"new/4"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Pages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Pages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Pages","nodeGroups":[{"name":"Types","nodes":[{"id":"counts/0","deprecated":false,"title":"counts()","anchor":"t:counts/0"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"t:data/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(pages, key)","anchor":"get/2"},{"id":"getter/1","deprecated":false,"title":"getter(key)","anchor":"getter/1"},{"id":"new/4","deprecated":false,"title":"new(data, counts, cursor_fn, page_opts)","anchor":"new/4"},{"id":"new/5","deprecated":false,"title":"new(data_rows, count_rows, group_fn, cursor_fn, page_opts)","anchor":"new/5"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Pagination","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Pagination","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Pagination","nodeGroups":[{"name":"Functions","nodes":[{"id":"connection_paginate/3","deprecated":false,"title":"connection_paginate(list, args, opts \\\\ [])","anchor":"connection_paginate/3"},{"id":"page/7","deprecated":false,"title":"page(queries, schema, cursor_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"page/7"},{"id":"page_all/7","deprecated":false,"title":"page_all(queries, schema, cursor_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"page_all/7"},{"id":"pages/8","deprecated":false,"title":"pages(queries, schema, cursor_fn, group_fn, page_opts, base_filters, data_filters, count_filters)","anchor":"pages/8"},{"id":"pagination_args_filter/1","deprecated":false,"title":"pagination_args_filter(args)","anchor":"pagination_args_filter/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.PlugPipelines","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.PlugPipelines","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.PlugPipelines","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_pipeline/2","deprecated":false,"title":"default_pipeline(config, opts)","anchor":"default_pipeline/2"},{"id":"run/2","deprecated":false,"title":"run(blueprint, _)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Plugs.GraphQLContext","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Plugs.GraphQLContext","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Plugs.GraphQLContext","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, _)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.QueryHelper","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.QueryHelper","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.QueryHelper","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_overrides/2","deprecated":false,"title":"apply_overrides(fields, override_fun)","anchor":"apply_overrides/2"},{"id":"camelize/1","deprecated":false,"title":"camelize(type)","anchor":"camelize/1"},{"id":"do_format_fields/3","deprecated":false,"title":"do_format_fields(type, arg2, schema)","anchor":"do_format_fields/3"},{"id":"document_for/4","deprecated":false,"title":"document_for(schema, type, nesting \\\\ 1, override_fun \\\\ nil)","anchor":"document_for/4"},{"id":"fields_for/3","deprecated":false,"title":"fields_for(schema, type, nesting)","anchor":"fields_for/3"},{"id":"format_fields/4","deprecated":false,"title":"format_fields(fields, type, left_pad, schema)","anchor":"format_fields/4"},{"id":"get_fields/3","deprecated":false,"title":"get_fields(type, schema, nesting)","anchor":"get_fields/3"},{"id":"maybe_debug_api/4","deprecated":false,"title":"maybe_debug_api(q, obj, debug, msg \\\\ \"The below GraphQL query had some errors in the response\")","anchor":"maybe_debug_api/4"},{"id":"padding/1","deprecated":false,"title":"padding(left_pad)","anchor":"padding/1"},{"id":"query_with_id/4","deprecated":false,"title":"query_with_id(schema, type, nesting \\\\ 1, override_fun \\\\ nil)","anchor":"query_with_id/4"},{"id":"run_query_id/6","deprecated":false,"title":"run_query_id(id, schema, type, nesting \\\\ 1, override_fun \\\\ nil, debug \\\\ nil)","anchor":"run_query_id/6"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveField","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveField","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveField","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_field)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveFields","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveFields","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveFields","nodeGroups":[{"name":"Types","nodes":[{"id":"getter/0","deprecated":false,"title":"getter()","anchor":"t:getter/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"default_getter/2","deprecated":false,"title":"default_getter(context, default)","anchor":"default_getter/2"},{"id":"run/1","deprecated":false,"title":"run(resolve_fields)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolvePage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolvePage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolvePage","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolvePages","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolvePages","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolvePages","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(rp)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.ResolveRootPage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.ResolveRootPage","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.ResolveRootPage","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(resolve_root_page)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.RestAdapter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.RestAdapter","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.RestAdapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"endpoint/3","deprecated":false,"title":"endpoint(query, success_fn \\\\ nil, error_fn \\\\ nil)","anchor":"endpoint/3"},{"id":"error_fn/2","deprecated":false,"title":"error_fn(response, conn)","anchor":"error_fn/2"},{"id":"return/4","deprecated":false,"title":"return(name, ret, conn, transform_fun \\\\ nil)","anchor":"return/4"},{"id":"success_fn/2","deprecated":false,"title":"success_fn(response, conn)","anchor":"success_fn/2"},{"id":"transform_data/1","deprecated":false,"title":"transform_data(data)","anchor":"transform_data/1"},{"id":"transform_data/2","deprecated":false,"title":"transform_data(data, transform_fun)","anchor":"transform_data/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.RestAdapter.EndpointConfig","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.RestAdapter.EndpointConfig"},{"id":"Bonfire.API.GraphQL.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Router","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Router"},{"id":"Bonfire.API.GraphQL.SchemaPipelines","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.SchemaPipelines","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.SchemaPipelines","nodeGroups":[{"name":"Functions","nodes":[{"id":"pipeline/1","deprecated":false,"title":"pipeline(pipeline)","anchor":"pipeline/1"},{"id":"run/2","deprecated":false,"title":"run(blueprint, _)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.SchemaUtils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.SchemaUtils","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.SchemaUtils","nodeGroups":[{"name":"Functions","nodes":[{"id":"context_types/0","deprecated":false,"title":"context_types()","anchor":"context_types/0"},{"id":"hydrations_merge/1","deprecated":false,"title":"hydrations_merge(hydrators)","anchor":"hydrations_merge/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.Test.GraphQLAssertions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.Test.GraphQLAssertions","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.Test.GraphQLAssertions","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_binary/1","deprecated":false,"title":"assert_binary(val)","anchor":"assert_binary/1"},{"id":"assert_boolean/1","deprecated":false,"title":"assert_boolean(val)","anchor":"assert_boolean/1"},{"id":"assert_created_at/2","deprecated":false,"title":"assert_created_at(map1, map2)","anchor":"assert_created_at/2"},{"id":"assert_cursor/1","deprecated":false,"title":"assert_cursor(x)","anchor":"assert_cursor/1"},{"id":"assert_cursors/1","deprecated":false,"title":"assert_cursors(x)","anchor":"assert_cursors/1"},{"id":"assert_datetime/1","deprecated":false,"title":"assert_datetime(time)","anchor":"assert_datetime/1"},{"id":"assert_datetime/2","deprecated":false,"title":"assert_datetime(dt, du)","anchor":"assert_datetime/2"},{"id":"assert_display_username/1","deprecated":false,"title":"assert_display_username(val)","anchor":"assert_display_username/1"},{"id":"assert_email/1","deprecated":false,"title":"assert_email(val)","anchor":"assert_email/1"},{"id":"assert_eq/1","deprecated":false,"title":"assert_eq(val1)","anchor":"assert_eq/1"},{"id":"assert_field/3","deprecated":false,"title":"assert_field(object, key, test)","anchor":"assert_field/3"},{"id":"assert_float/1","deprecated":false,"title":"assert_float(val)","anchor":"assert_float/1"},{"id":"assert_int/1","deprecated":false,"title":"assert_int(val)","anchor":"assert_int/1"},{"id":"assert_invalid_credential/2","deprecated":false,"title":"assert_invalid_credential(errs, path)","anchor":"assert_invalid_credential/2"},{"id":"assert_list/0","deprecated":false,"title":"assert_list()","anchor":"assert_list/0"},{"id":"assert_list/1","deprecated":false,"title":"assert_list(of)","anchor":"assert_list/1"},{"id":"assert_list/2","deprecated":false,"title":"assert_list(of, size)","anchor":"assert_list/2"},{"id":"assert_location/1","deprecated":false,"title":"assert_location(loc)","anchor":"assert_location/1"},{"id":"assert_maps_eq/3","deprecated":false,"title":"assert_maps_eq(left, right, name)","anchor":"assert_maps_eq/3"},{"id":"assert_maps_eq/4","deprecated":false,"title":"assert_maps_eq(left, right, name, required)","anchor":"assert_maps_eq/4"},{"id":"assert_maps_eq/5","deprecated":false,"title":"assert_maps_eq(left, right, name, required, optional)","anchor":"assert_maps_eq/5"},{"id":"assert_non_neg/1","deprecated":false,"title":"assert_non_neg(val)","anchor":"assert_non_neg/1"},{"id":"assert_not_found/2","deprecated":false,"title":"assert_not_found(errs, path)","anchor":"assert_not_found/2"},{"id":"assert_not_logged_in/2","deprecated":false,"title":"assert_not_logged_in(errs, path)","anchor":"assert_not_logged_in/2"},{"id":"assert_not_permitted/3","deprecated":false,"title":"assert_not_permitted(errs, path, verb \\\\ \"do\")","anchor":"assert_not_permitted/3"},{"id":"assert_object/4","deprecated":false,"title":"assert_object(struct, name, required, optional \\\\ [])","anchor":"assert_object/4"},{"id":"assert_optional/1","deprecated":false,"title":"assert_optional(map_fn)","anchor":"assert_optional/1"},{"id":"assert_optional_field/3","deprecated":false,"title":"assert_optional_field(object, key, test)","anchor":"assert_optional_field/3"},{"id":"assert_page/0","deprecated":false,"title":"assert_page()","anchor":"assert_page/0"},{"id":"assert_page/1","deprecated":false,"title":"assert_page(of)","anchor":"assert_page/1"},{"id":"assert_page/6","deprecated":false,"title":"assert_page(page, returned_count, total_count, prev?, next?, cursor_fn)","anchor":"assert_page/6"},{"id":"assert_page_info/1","deprecated":false,"title":"assert_page_info(page_info)","anchor":"assert_page_info/1"},{"id":"assert_pos/1","deprecated":false,"title":"assert_pos(val)","anchor":"assert_pos/1"},{"id":"assert_ulid/1","deprecated":false,"title":"assert_ulid(ulid)","anchor":"assert_ulid/1"},{"id":"assert_updated_at/2","deprecated":false,"title":"assert_updated_at(map1, map2)","anchor":"assert_updated_at/2"},{"id":"assert_url/1","deprecated":false,"title":"assert_url(url)","anchor":"assert_url/1"},{"id":"assert_username/1","deprecated":false,"title":"assert_username(val)","anchor":"assert_username/1"},{"id":"assert_uuid/1","deprecated":false,"title":"assert_uuid(uuid)","anchor":"assert_uuid/1"},{"id":"uncamel_map/1","deprecated":false,"title":"uncamel_map(map)","anchor":"uncamel_map/1"}],"key":"functions"}]},{"id":"Bonfire.API.GraphQL.UserSocket","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.API.GraphQL.UserSocket","sections":[],"nested_context":"Bonfire","nested_title":".API.GraphQL.UserSocket","nodeGroups":[{"name":"Functions","nodes":[{"id":"build_context_from_params/2","deprecated":false,"title":"build_context_from_params(params, socket)","anchor":"build_context_from_params/2"},{"id":"connect/2","deprecated":false,"title":"connect(params, socket)","anchor":"connect/2"},{"id":"id/1","deprecated":false,"title":"id(socket)","anchor":"id/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries","sections":[{"id":"Glossary","anchor":"module-glossary"},{"id":"Users and Circles","anchor":"module-users-and-circles"},{"id":"Verbs","anchor":"module-verbs"},{"id":"Permissions","anchor":"module-permissions"},{"id":"ACLs","anchor":"module-acls"},{"id":"Controlled - Applying boundaries to an object","anchor":"module-controlled-applying-boundaries-to-an-object"},{"id":"Practical example: Surprise birthday party","anchor":"module-practical-example-surprise-birthday-party"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Boundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"acls_from_preset_boundary_names/1","deprecated":false,"title":"acls_from_preset_boundary_names(presets)","anchor":"acls_from_preset_boundary_names/1"},{"id":"boundaries_normalise/1","deprecated":false,"title":"boundaries_normalise(text)","anchor":"boundaries_normalise/1"},{"id":"boundaries_or_default/2","deprecated":false,"title":"boundaries_or_default(to_boundaries, context \\\\ [])","anchor":"boundaries_or_default/2"},{"id":"can?/4","deprecated":false,"title":"can?(subject, verbs, object, opts \\\\ [])","anchor":"can?/4"},{"id":"default_boundaries/1","deprecated":false,"title":"default_boundaries(context \\\\ [])","anchor":"default_boundaries/1"},{"id":"find_caretaker_stereotype/3","deprecated":false,"title":"find_caretaker_stereotype(caretaker, stereotype, from)","anchor":"find_caretaker_stereotype/3"},{"id":"find_caretaker_stereotypes/3","deprecated":false,"title":"find_caretaker_stereotypes(caretaker, stereotypes, from \\\\ Pointer)","anchor":"find_caretaker_stereotypes/3"},{"id":"list_grants_on/1","deprecated":false,"title":"list_grants_on(things)","anchor":"list_grants_on/1"},{"id":"list_grants_on/2","deprecated":false,"title":"list_grants_on(things, verbs)","anchor":"list_grants_on/2"},{"id":"list_object_acls/2","deprecated":false,"title":"list_object_acls(object, opts \\\\ [])","anchor":"list_object_acls/2"},{"id":"list_object_boundaries/2","deprecated":false,"title":"list_object_boundaries(object, opts \\\\ [])","anchor":"list_object_boundaries/2"},{"id":"load_pointer/2","deprecated":false,"title":"load_pointer(item, opts)","anchor":"load_pointer/2"},{"id":"load_pointers/2","deprecated":false,"title":"load_pointers(items, opts)","anchor":"load_pointers/2"},{"id":"load_pointers!/2","deprecated":false,"title":"load_pointers!(items, opts)","anchor":"load_pointers!/2"},{"id":"pointer_permitted?/2","deprecated":false,"title":"pointer_permitted?(item, opts)","anchor":"pointer_permitted?/2"},{"id":"preset_boundary_from_acl/2","deprecated":false,"title":"preset_boundary_from_acl(acl, object_type \\\\ nil)","anchor":"preset_boundary_from_acl/2"},{"id":"preset_boundary_tuple_from_acl/2","deprecated":false,"title":"preset_boundary_tuple_from_acl(acl, object_type \\\\ nil)","anchor":"preset_boundary_tuple_from_acl/2"},{"id":"preset_name/2","deprecated":false,"title":"preset_name(boundaries, include_remote? \\\\ false)","anchor":"preset_name/2"},{"id":"set_boundaries/3","deprecated":false,"title":"set_boundaries(creator, object, opts)","anchor":"set_boundaries/3"},{"id":"take_care_of!/2","deprecated":false,"title":"take_care_of!(things, user)","anchor":"take_care_of!/2"},{"id":"user_default_boundaries/0","deprecated":false,"title":"user_default_boundaries()","anchor":"user_default_boundaries/0"},{"id":"users_grants_on/2","deprecated":false,"title":"users_grants_on(users, things)","anchor":"users_grants_on/2"},{"id":"users_grants_on/3","deprecated":false,"title":"users_grants_on(users, things, verbs)","anchor":"users_grants_on/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Acls","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Acls","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Acls","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl_grants_to_tuples/2","deprecated":false,"title":"acl_grants_to_tuples(creator, acls)","anchor":"acl_grants_to_tuples/2"},{"id":"acl_id/1","deprecated":false,"title":"acl_id(obj)","anchor":"acl_id/1"},{"id":"acls/0","deprecated":false,"title":"acls()","anchor":"acls/0"},{"id":"acls_from_preset/3","deprecated":false,"title":"acls_from_preset(creator, to_boundaries, opts \\\\ [])","anchor":"acls_from_preset/3"},{"id":"base_acls_from_preset/3","deprecated":false,"title":"base_acls_from_preset(creator, preset, opts \\\\ [])","anchor":"base_acls_from_preset/3"},{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, creator, opts)","anchor":"cast/3"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, attrs, opts)","anchor":"changeset/3"},{"id":"create/2","deprecated":false,"title":"create(attrs \\\\ %{}, opts)","anchor":"create/2"},{"id":"default_exclude_ids/1","deprecated":false,"title":"default_exclude_ids(including_custom? \\\\ true)","anchor":"default_exclude_ids/1"},{"id":"delete/2","deprecated":false,"title":"delete(acl, opts)","anchor":"delete/2"},{"id":"edit/3","deprecated":false,"title":"edit(acl, user, params)","anchor":"edit/3"},{"id":"exclude_stereotypes/1","deprecated":false,"title":"exclude_stereotypes(including_custom? \\\\ true)","anchor":"exclude_stereotypes/1"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"get!/1","deprecated":false,"title":"get!(slug)","anchor":"get!/1"},{"id":"get_for_caretaker/3","deprecated":false,"title":"get_for_caretaker(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker/3"},{"id":"get_for_caretaker_q/3","deprecated":false,"title":"get_for_caretaker_q(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker_q/3"},{"id":"get_id/1","deprecated":false,"title":"get_id(slug)","anchor":"get_id/1"},{"id":"get_id!/1","deprecated":false,"title":"get_id!(slug)","anchor":"get_id!/1"},{"id":"get_object_custom_acl/1","deprecated":false,"title":"get_object_custom_acl(object)","anchor":"get_object_custom_acl/1"},{"id":"get_or_create_object_custom_acl/2","deprecated":false,"title":"get_or_create_object_custom_acl(object, caretaker \\\\ nil)","anchor":"get_or_create_object_custom_acl/2"},{"id":"grant_tuples_from_preset/3","deprecated":false,"title":"grant_tuples_from_preset(creator, to_boundaries, opts \\\\ [])","anchor":"grant_tuples_from_preset/3"},{"id":"is_built_in?/1","deprecated":false,"title":"is_built_in?(acl)","anchor":"is_built_in?/1"},{"id":"is_object_custom?/1","deprecated":false,"title":"is_object_custom?(acl)","anchor":"is_object_custom?/1"},{"id":"is_stereotype?/1","deprecated":false,"title":"is_stereotype?(acl)","anchor":"is_stereotype?/1"},{"id":"is_stereotyped?/1","deprecated":false,"title":"is_stereotyped?(acl)","anchor":"is_stereotyped?/1"},{"id":"list/1","deprecated":false,"title":"list(opts \\\\ [])","anchor":"list/1"},{"id":"list_built_ins/1","deprecated":false,"title":"list_built_ins(opts \\\\ [])","anchor":"list_built_ins/1"},{"id":"list_my/2","deprecated":false,"title":"list_my(user, opts \\\\ [])","anchor":"list_my/2"},{"id":"list_my_q/2","deprecated":false,"title":"list_my_q(user, opts \\\\ [])","anchor":"list_my_q/2"},{"id":"list_my_with_counts/2","deprecated":false,"title":"list_my_with_counts(user, opts \\\\ [])","anchor":"list_my_with_counts/2"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts \\\\ [])","anchor":"list_q/1"},{"id":"maybe_by_ids/2","deprecated":false,"title":"maybe_by_ids(query, ids)","anchor":"maybe_by_ids/2"},{"id":"maybe_search/2","deprecated":false,"title":"maybe_search(query, text)","anchor":"maybe_search/2"},{"id":"opts_for_dropdown/0","deprecated":false,"title":"opts_for_dropdown()","anchor":"opts_for_dropdown/0"},{"id":"opts_for_list/0","deprecated":false,"title":"opts_for_list()","anchor":"opts_for_list/0"},{"id":"prepare_cast/3","deprecated":false,"title":"prepare_cast(changeset_or_obj, creator, opts)","anchor":"prepare_cast/3"},{"id":"preset_acl_ids/0","deprecated":false,"title":"preset_acl_ids()","anchor":"preset_acl_ids/0"},{"id":"preset_acl_ids/2","deprecated":false,"title":"preset_acl_ids(preset, preset_acls \\\\ Config.get!(:preset_acls_match))","anchor":"preset_acl_ids/2"},{"id":"preview/2","deprecated":false,"title":"preview(creator, opts)","anchor":"preview/2"},{"id":"remote_public_acl_ids/0","deprecated":false,"title":"remote_public_acl_ids()","anchor":"remote_public_acl_ids/0"},{"id":"set/3","deprecated":false,"title":"set(object, creator, opts)","anchor":"set/3"},{"id":"simple_create/2","deprecated":false,"title":"simple_create(caretaker, name)","anchor":"simple_create/2"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(acl, opts)","anchor":"soft_delete/2"},{"id":"stereotype_ids/0","deprecated":false,"title":"stereotype_ids()","anchor":"stereotype_ids/0"},{"id":"user_default_acl/1","deprecated":false,"title":"user_default_acl(name)","anchor":"user_default_acl/1"},{"id":"user_default_acls/0","deprecated":false,"title":"user_default_acls()","anchor":"user_default_acls/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Acts.SetBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Acts.SetBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Acts.SetBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Blocks","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Blocks","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Blocks","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(blocker, activity, blocked)","anchor":"ap_receive_activity/3"},{"id":"block/3","deprecated":false,"title":"block(user_or_instance_to_block, block_type \\\\ nil, scope)","anchor":"block/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"instance_wide_block/2","deprecated":false,"title":"instance_wide_block(user_or_instance_to_block, block_type \\\\ nil)","anchor":"instance_wide_block/2"},{"id":"instance_wide_circles/1","deprecated":false,"title":"instance_wide_circles(block_types)","anchor":"instance_wide_circles/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(user_or_instance, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/2","deprecated":false,"title":"list(block_type, opts)","anchor":"list/2"},{"id":"remote_instance_block/3","deprecated":false,"title":"remote_instance_block(display_hostname, block_type, scope)","anchor":"remote_instance_block/3"},{"id":"types_blocked/1","deprecated":false,"title":"types_blocked(types)","anchor":"types_blocked/1"},{"id":"unblock/3","deprecated":false,"title":"unblock(user_or_instance_to_unblock, block_type \\\\ nil, scope)","anchor":"unblock/3"},{"id":"unblock_all/2","deprecated":false,"title":"unblock_all(block_type \\\\ nil, scope)","anchor":"unblock_all/2"},{"id":"user_block_circles/2","deprecated":false,"title":"user_block_circles(current_user, block_type)","anchor":"user_block_circles/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Blocks.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Blocks.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Blocks.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"preload_one/2","deprecated":false,"title":"preload_one(object, opts)","anchor":"preload_one/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Circles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Circles","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Circles","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_to_circles/2","deprecated":false,"title":"add_to_circles(subjects, circles)","anchor":"add_to_circles/2"},{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"changeset/2","deprecated":false,"title":"changeset(circle \\\\ %Circle{}, attrs)","anchor":"changeset/2"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, circle, params)","anchor":"changeset/3"},{"id":"circle_ids/1","deprecated":false,"title":"circle_ids(subjects)","anchor":"circle_ids/1"},{"id":"circles/0","deprecated":false,"title":"circles()","anchor":"circles/0"},{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(circle, opts)","anchor":"delete/2"},{"id":"edit/3","deprecated":false,"title":"edit(circle, user, params)","anchor":"edit/3"},{"id":"empty_circles/1","deprecated":false,"title":"empty_circles(circles)","anchor":"empty_circles/1"},{"id":"exists?/2","deprecated":false,"title":"exists?(id, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"get!/1","deprecated":false,"title":"get!(slug)","anchor":"get!/1"},{"id":"get_by_name/2","deprecated":false,"title":"get_by_name(name, caretaker)","anchor":"get_by_name/2"},{"id":"get_for_caretaker/3","deprecated":false,"title":"get_for_caretaker(id, caretaker, opts \\\\ [])","anchor":"get_for_caretaker/3"},{"id":"get_id/1","deprecated":false,"title":"get_id(slug)","anchor":"get_id/1"},{"id":"get_id!/1","deprecated":false,"title":"get_id!(slug)","anchor":"get_id!/1"},{"id":"get_or_create/2","deprecated":false,"title":"get_or_create(name, caretaker \\\\ nil)","anchor":"get_or_create/2"},{"id":"get_stereotype_circles/2","deprecated":false,"title":"get_stereotype_circles(subject, stereotypes)","anchor":"get_stereotype_circles/2"},{"id":"get_tuple/1","deprecated":false,"title":"get_tuple(slug)","anchor":"get_tuple/1"},{"id":"is_built_in?/1","deprecated":false,"title":"is_built_in?(circle)","anchor":"is_built_in?/1"},{"id":"is_encircled_by?/2","deprecated":false,"title":"is_encircled_by?(subject, circle)","anchor":"is_encircled_by?/2"},{"id":"is_stereotype?/1","deprecated":false,"title":"is_stereotype?(acl)","anchor":"is_stereotype?/1"},{"id":"leave_all_circles/1","deprecated":false,"title":"leave_all_circles(users)","anchor":"leave_all_circles/1"},{"id":"list_built_ins/0","deprecated":false,"title":"list_built_ins()","anchor":"list_built_ins/0"},{"id":"list_by_ids/1","deprecated":false,"title":"list_by_ids(ids)","anchor":"list_by_ids/1"},{"id":"list_my/2","deprecated":false,"title":"list_my(user, opts \\\\ [])","anchor":"list_my/2"},{"id":"list_my_defaults/1","deprecated":false,"title":"list_my_defaults(user \\\\ nil)","anchor":"list_my_defaults/1"},{"id":"list_my_with_counts/2","deprecated":false,"title":"list_my_with_counts(user, opts \\\\ [])","anchor":"list_my_with_counts/2"},{"id":"list_my_with_global/2","deprecated":false,"title":"list_my_with_global(user, opts \\\\ [])","anchor":"list_my_with_global/2"},{"id":"list_visible/2","deprecated":false,"title":"list_visible(user, opts \\\\ [])","anchor":"list_visible/2"},{"id":"preload_encircled_by/3","deprecated":false,"title":"preload_encircled_by(subject, circles, opts \\\\ [])","anchor":"preload_encircled_by/3"},{"id":"query/1","deprecated":false,"title":"query(opts \\\\ [])","anchor":"query/1"},{"id":"query_my/2","deprecated":false,"title":"query_my(caretaker, opts \\\\ [])","anchor":"query_my/2"},{"id":"query_my_by_id/3","deprecated":false,"title":"query_my_by_id(id, caretaker, opts \\\\ [])","anchor":"query_my_by_id/3"},{"id":"query_visible/2","deprecated":false,"title":"query_visible(user, opts \\\\ [])","anchor":"query_visible/2"},{"id":"remove_from_circles/2","deprecated":false,"title":"remove_from_circles(subject, circles)","anchor":"remove_from_circles/2"},{"id":"stereotype_ids/0","deprecated":false,"title":"stereotype_ids()","anchor":"stereotype_ids/0"},{"id":"stereotypes/1","deprecated":false,"title":"stereotypes(atom)","anchor":"stereotypes/1"},{"id":"to_circle_ids/1","deprecated":false,"title":"to_circle_ids(subjects)","anchor":"to_circle_ids/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Controlleds","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Controlleds","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Controlleds","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_acls/2","deprecated":false,"title":"add_acls(object, acl)","anchor":"add_acls/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(c \\\\ %Controlled{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(attrs)","anchor":"create/1"},{"id":"get_preset_on_object/1","deprecated":false,"title":"get_preset_on_object(object)","anchor":"get_preset_on_object/1"},{"id":"grant_role/4","deprecated":false,"title":"grant_role(subject_id, object, role, opts \\\\ [])","anchor":"grant_role/4"},{"id":"list_acls_on_object/2","deprecated":false,"title":"list_acls_on_object(object, opts \\\\ [])","anchor":"list_acls_on_object/2"},{"id":"list_grants_by_verbs/3","deprecated":false,"title":"list_grants_by_verbs(objects, verbs, value \\\\ true)","anchor":"list_grants_by_verbs/3"},{"id":"list_on_object/2","deprecated":false,"title":"list_on_object(object, opts \\\\ [])","anchor":"list_on_object/2"},{"id":"list_on_objects_by_subject/2","deprecated":false,"title":"list_on_objects_by_subject(objects, current_user)","anchor":"list_on_objects_by_subject/2"},{"id":"list_presets_on_objects/1","deprecated":false,"title":"list_presets_on_objects(objects)","anchor":"list_presets_on_objects/1"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts \\\\ [])","anchor":"list_q/1"},{"id":"list_subjects_by_verb/3","deprecated":false,"title":"list_subjects_by_verb(objects, verb, value \\\\ true)","anchor":"list_subjects_by_verb/3"},{"id":"remove_acls/2","deprecated":false,"title":"remove_acls(object, acls)","anchor":"remove_acls/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Debug","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_grants_on/1","deprecated":false,"title":"debug_grants_on(things)","anchor":"debug_grants_on/1"},{"id":"debug_grants_on/2","deprecated":false,"title":"debug_grants_on(things, verbs)","anchor":"debug_grants_on/2"},{"id":"debug_my_grants_on/2","deprecated":false,"title":"debug_my_grants_on(users, things)","anchor":"debug_my_grants_on/2"},{"id":"debug_object_acls/1","deprecated":false,"title":"debug_object_acls(thing)","anchor":"debug_object_acls/1"},{"id":"debug_user_acls/2","deprecated":false,"title":"debug_user_acls(user, label \\\\ \"\")","anchor":"debug_user_acls/2"},{"id":"debug_user_circles/1","deprecated":false,"title":"debug_user_circles(user)","anchor":"debug_user_circles/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Grants","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Grants","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Grants","nodeGroups":[{"name":"Functions","nodes":[{"id":"change_role/4","deprecated":false,"title":"change_role(subject, acl_id, role, opts \\\\ [])","anchor":"change_role/4"},{"id":"create/2","deprecated":false,"title":"create(attrs, opts \\\\ [])","anchor":"create/2"},{"id":"get/1","deprecated":false,"title":"get(slug)","anchor":"get/1"},{"id":"grant/5","deprecated":false,"title":"grant(subject_id, acl_id, verb, value, opts \\\\ [])","anchor":"grant/5"},{"id":"grant_role/4","deprecated":false,"title":"grant_role(subject, acl_id, role, opts \\\\ [])","anchor":"grant_role/4"},{"id":"grants/0","deprecated":false,"title":"grants()","anchor":"grants/0"},{"id":"grants_to_tuples/2","deprecated":false,"title":"grants_to_tuples(creator, grants)","anchor":"grants_to_tuples/2"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_for_acl/2","deprecated":false,"title":"list_for_acl(acl, opts)","anchor":"list_for_acl/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(user)","anchor":"list_my/1"},{"id":"list_q/1","deprecated":false,"title":"list_q(opts)","anchor":"list_q/1"},{"id":"remove_role/4","deprecated":false,"title":"remove_role(subject, acl_id, role, opts \\\\ [])","anchor":"remove_role/4"},{"id":"remove_subject_from_acl/2","deprecated":false,"title":"remove_subject_from_acl(subject, acls)","anchor":"remove_subject_from_acl/2"},{"id":"subject_grants/1","deprecated":false,"title":"subject_grants(grants)","anchor":"subject_grants/1"},{"id":"subject_verb_grants/1","deprecated":false,"title":"subject_verb_grants(grants)","anchor":"subject_verb_grants/1"},{"id":"subjects/1","deprecated":false,"title":"subjects(grants)","anchor":"subjects/1"},{"id":"upsert_or_delete/2","deprecated":false,"title":"upsert_or_delete(attrs, arg2)","anchor":"upsert_or_delete/2"},{"id":"verb_subject_grant/1","deprecated":false,"title":"verb_subject_grant(grants)","anchor":"verb_subject_grant/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Integration","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"many/3","deprecated":false,"title":"many(query, paginate?, opts \\\\ [])","anchor":"many/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl_create/2","deprecated":false,"title":"acl_create(attrs, socket)","anchor":"acl_create/2"},{"id":"boundaries_on_objects/2","deprecated":false,"title":"boundaries_on_objects(list_of_ids, current_user)","anchor":"boundaries_on_objects/2"},{"id":"circle_create/2","deprecated":false,"title":"circle_create(attrs, socket)","anchor":"circle_create/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(action, params, socket)","anchor":"handle_event/3"},{"id":"maybe_check_boundaries/2","deprecated":false,"title":"maybe_check_boundaries(assigns_sockets, opts \\\\ [])","anchor":"maybe_check_boundaries/2"},{"id":"maybe_redirect_to/3","deprecated":false,"title":"maybe_redirect_to(socket, path, arg3)","anchor":"maybe_redirect_to/3"},{"id":"my_acls/2","deprecated":false,"title":"my_acls(current_user_id, opts \\\\ nil)","anchor":"my_acls/2"},{"id":"my_circles_paginated/2","deprecated":false,"title":"my_circles_paginated(scope, attrs \\\\ nil)","anchor":"my_circles_paginated/2"},{"id":"prepare_assigns/1","deprecated":false,"title":"prepare_assigns(socket)","anchor":"prepare_assigns/1"},{"id":"remove_from_circle_tuples/2","deprecated":false,"title":"remove_from_circle_tuples(ids, previous_circles)","anchor":"remove_from_circle_tuples/2"},{"id":"scope_origin/2","deprecated":false,"title":"scope_origin(assigns \\\\ nil, socket)","anchor":"scope_origin/2"},{"id":"set_circles_tuples/3","deprecated":false,"title":"set_circles_tuples(field, circles, socket)","anchor":"set_circles_tuples/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"subject_name/1","deprecated":false,"title":"subject_name(subject)","anchor":"subject_name/1"},{"id":"unblock/4","deprecated":false,"title":"unblock(id, block_type, scope, socket)","anchor":"unblock/4"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_perms/2","deprecated":false,"title":"add_perms(l, r)","anchor":"add_perms/2"},{"id":"agg_perms/1","deprecated":false,"title":"agg_perms(p)","anchor":"agg_perms/1"},{"id":"boundarise/3","deprecated":false,"title":"boundarise(query, field_ref, opts)","anchor":"boundarise/3"},{"id":"object_boundarised/2","deprecated":false,"title":"object_boundarised(q, opts \\\\ nil)","anchor":"object_boundarised/2"},{"id":"permitted/1","deprecated":false,"title":"permitted(user)","anchor":"permitted/1"},{"id":"permitted/2","deprecated":false,"title":"permitted(user, verbs)","anchor":"permitted/2"},{"id":"query_with_summary/3","deprecated":false,"title":"query_with_summary(user, verbs \\\\ [:see, :read], query \\\\ Summary)","anchor":"query_with_summary/3"},{"id":"skip_boundary_check?/2","deprecated":false,"title":"skip_boundary_check?(opts, object \\\\ nil)","anchor":"skip_boundary_check?/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Roles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Roles","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Roles","nodeGroups":[{"name":"Functions","nodes":[{"id":"cannot_role_from_verb/5","deprecated":false,"title":"cannot_role_from_verb(verbs, verb_field \\\\ :verb, all_role_verbs \\\\ role_verbs(:all), role_for_all \\\\ :read, verbs_field \\\\ :cannot_verbs)","anchor":"cannot_role_from_verb/5"},{"id":"create/2","deprecated":false,"title":"create(attrs, opts)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(name, usage, opts)","anchor":"create/3"},{"id":"edit_verb_permission/4","deprecated":false,"title":"edit_verb_permission(role_name, verb, value, opts)","anchor":"edit_verb_permission/4"},{"id":"get/2","deprecated":false,"title":"get(role_name, opts \\\\ [])","anchor":"get/2"},{"id":"preset_boundary_role_from_acl/1","deprecated":false,"title":"preset_boundary_role_from_acl(summary)","anchor":"preset_boundary_role_from_acl/1"},{"id":"reset_instance_roles/0","deprecated":false,"title":"reset_instance_roles()","anchor":"reset_instance_roles/0"},{"id":"role_from_grants/2","deprecated":false,"title":"role_from_grants(grants, opts)","anchor":"role_from_grants/2"},{"id":"role_from_verb/5","deprecated":false,"title":"role_from_verb(verbs, verb_field \\\\ :verb, all_role_verbs \\\\ role_verbs(:all), role_for_all \\\\ :administer, verbs_field \\\\ :can_verbs)","anchor":"role_from_verb/5"},{"id":"role_verbs/2","deprecated":false,"title":"role_verbs(usage \\\\ :all, opts \\\\ [])","anchor":"role_verbs/2"},{"id":"roles_for_dropdown/2","deprecated":false,"title":"roles_for_dropdown(usage \\\\ nil, opts)","anchor":"roles_for_dropdown/2"},{"id":"split_tuples_can_cannot/1","deprecated":false,"title":"split_tuples_can_cannot(tuples)","anchor":"split_tuples_can_cannot/1"},{"id":"verbs_for_role/2","deprecated":false,"title":"verbs_for_role(role, opts \\\\ [])","anchor":"verbs_for_role/2"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Scaffold","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Scaffold","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Scaffold","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_default_boundaries/1","deprecated":false,"title":"create_default_boundaries(user)","anchor":"create_default_boundaries/1"},{"id":"create_missing_boundaries/1","deprecated":false,"title":"create_missing_boundaries(user)","anchor":"create_missing_boundaries/1"},{"id":"insert/0","deprecated":false,"title":"insert()","anchor":"insert/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Scaffold.Instance","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Scaffold.Instance","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Scaffold.Instance","nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_pub_circle/0","deprecated":false,"title":"activity_pub_circle()","anchor":"activity_pub_circle/0"},{"id":"admin_circle/0","deprecated":false,"title":"admin_circle()","anchor":"admin_circle/0"},{"id":"custom_acl/0","deprecated":false,"title":"custom_acl()","anchor":"custom_acl/0"},{"id":"fixtures/0","deprecated":false,"title":"fixtures()","anchor":"fixtures/0"},{"id":"global_circles/0","deprecated":false,"title":"global_circles()","anchor":"global_circles/0"},{"id":"insert/0","deprecated":false,"title":"insert()","anchor":"insert/0"},{"id":"instance_acl/0","deprecated":false,"title":"instance_acl()","anchor":"instance_acl/0"},{"id":"mod_circle/0","deprecated":false,"title":"mod_circle()","anchor":"mod_circle/0"},{"id":"upsert_verbs/0","deprecated":false,"title":"upsert_verbs()","anchor":"upsert_verbs/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Scaffold.Users","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Scaffold.Users","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Scaffold.Users","nodeGroups":[{"name":"Functions","nodes":[{"id":"down/0","deprecated":false,"title":"down()","anchor":"down/0"},{"id":"up/0","deprecated":false,"title":"up()","anchor":"up/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Summary","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Summary","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Summary","nodeGroups":[{"name":"Functions","nodes":[{"id":"drop_views/1","deprecated":false,"title":"drop_views(view_type \\\\ \"view\")","anchor":"drop_views/1"},{"id":"migrate/1","deprecated":false,"title":"migrate(atom)","anchor":"migrate/1"},{"id":"migrate_functions/0","deprecated":false,"title":"migrate_functions()","anchor":"migrate_functions/0"},{"id":"migrate_views/0","deprecated":false,"title":"migrate_views()","anchor":"migrate_views/0"},{"id":"refresh/0","deprecated":false,"title":"refresh()","anchor":"refresh/0"},{"id":"refresh_material_view/0","deprecated":false,"title":"refresh_material_view()","anchor":"refresh_material_view/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"source/0","deprecated":false,"title":"source()","anchor":"source/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Users","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Users","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Users","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_default_boundaries/2","deprecated":false,"title":"create_default_boundaries(user, opts \\\\ [])","anchor":"create_default_boundaries/2"},{"id":"create_missing_boundaries/1","deprecated":false,"title":"create_missing_boundaries(user)","anchor":"create_missing_boundaries/1"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Users.PreparedBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Users.PreparedBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Users.PreparedBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"from_config/3","deprecated":false,"title":"from_config(user, opts, skip_acls_extra \\\\ false)","anchor":"from_config/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Verbs","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Verbs","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Verbs","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(verb \\\\ %Verb{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(attrs)","anchor":"create/1"},{"id":"get/2","deprecated":false,"title":"get(slug, all_verbs \\\\ verbs())","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(id_or_name, all_verbs \\\\ verbs())","anchor":"get!/2"},{"id":"get_id/2","deprecated":false,"title":"get_id(slug, all_verbs \\\\ verbs())","anchor":"get_id/2"},{"id":"get_id!/2","deprecated":false,"title":"get_id!(slug, all_verbs \\\\ verbs())","anchor":"get_id!/2"},{"id":"get_slug/2","deprecated":false,"title":"get_slug(id_or_name, all_verbs \\\\ verbs())","anchor":"get_slug/2"},{"id":"get_tuple/2","deprecated":false,"title":"get_tuple(id_or_name, all_verbs \\\\ verbs())","anchor":"get_tuple/2"},{"id":"ids/2","deprecated":false,"title":"ids(verbs, all_verbs \\\\ verbs())","anchor":"ids/2"},{"id":"list/2","deprecated":false,"title":"list(from \\\\ :db, key \\\\ :verb)","anchor":"list/2"},{"id":"list_verbs_debug/0","deprecated":false,"title":"list_verbs_debug()","anchor":"list_verbs_debug/0"},{"id":"slugs/0","deprecated":false,"title":"slugs()","anchor":"slugs/0"},{"id":"verbs/0","deprecated":false,"title":"verbs()","anchor":"verbs/0"},{"id":"verbs_count/0","deprecated":false,"title":"verbs_count()","anchor":"verbs_count/0"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Web.ExcludeBoundaries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Web.ExcludeBoundaries","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Web.ExcludeBoundaries","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(event, params, socket)","anchor":"handle_event/3"}],"key":"functions"}]},{"id":"Bonfire.Boundaries.Web.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Boundaries.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Boundaries.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Common","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Common","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_fallback/2","deprecated":false,"title":"maybe_fallback(val, fun)","anchor":"maybe_fallback/2"}],"key":"functions"}]},{"id":"Bonfire.Common.AntiSpam","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam","nodeGroups":[{"name":"Functions","nodes":[{"id":"service/0","deprecated":false,"title":"service()","anchor":"service/0"}],"key":"functions"}]},{"id":"Bonfire.Common.AntiSpam.Akismet","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Akismet","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Akismet"},{"id":"Bonfire.Common.AntiSpam.BumblebeeAdapter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.BumblebeeAdapter","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.BumblebeeAdapter"},{"id":"Bonfire.Common.AntiSpam.Mock","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Mock","sections":[],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Mock"},{"id":"Bonfire.Common.AntiSpam.Provider","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.AntiSpam.Provider","sections":[{"id":"Supported backends","anchor":"module-supported-backends"}],"nested_context":"Bonfire","nested_title":".Common.AntiSpam.Provider","nodeGroups":[{"name":"Types","nodes":[{"id":"result/0","deprecated":false,"title":"result()","anchor":"t:result/0"},{"id":"spam_result/0","deprecated":false,"title":"spam_result()","anchor":"t:spam_result/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"check_comment/3","deprecated":false,"title":"check_comment(comment_body, is_reply?, context)","anchor":"c:check_comment/3"},{"id":"check_current_user/1","deprecated":false,"title":"check_current_user(context)","anchor":"c:check_current_user/1"},{"id":"check_object/2","deprecated":false,"title":"check_object(body, context)","anchor":"c:check_object/2"},{"id":"check_profile/2","deprecated":false,"title":"check_profile(summary, context)","anchor":"c:check_profile/2"},{"id":"ready?/0","deprecated":false,"title":"ready?()","anchor":"c:ready?/0"},{"id":"report_ham/2","deprecated":false,"title":"report_ham(user, text)","anchor":"c:report_ham/2"},{"id":"report_spam/2","deprecated":false,"title":"report_spam(user, text)","anchor":"c:report_spam/2"}],"key":"callbacks"}]},{"id":"Bonfire.Common.Benchmark","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Benchmark","sections":[],"nested_context":"Bonfire","nested_title":".Common.Benchmark","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_timed/1","deprecated":false,"title":"apply_timed(function)","anchor":"apply_timed/1"},{"id":"apply_timed/2","deprecated":false,"title":"apply_timed(function, args)","anchor":"apply_timed/2"},{"id":"apply_timed/3","deprecated":false,"title":"apply_timed(module, function, args)","anchor":"apply_timed/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Cache","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Cache","sections":[],"nested_context":"Bonfire","nested_title":".Common.Cache","nodeGroups":[{"name":"Functions","nodes":[{"id":"cache_store/1","deprecated":false,"title":"cache_store(opts \\\\ [])","anchor":"cache_store/1"},{"id":"cached_preloads_for_objects/3","deprecated":false,"title":"cached_preloads_for_objects(name, objects, fun)","anchor":"cached_preloads_for_objects/3"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(key, opts \\\\ [])","anchor":"get!/2"},{"id":"maybe_apply_cached/3","deprecated":false,"title":"maybe_apply_cached(fun, args \\\\ [], opts \\\\ [])","anchor":"maybe_apply_cached/3"},{"id":"put/3","deprecated":false,"title":"put(key, value, opts \\\\ [])","anchor":"put/3"},{"id":"remove/2","deprecated":false,"title":"remove(key, opts \\\\ [])","anchor":"remove/2"},{"id":"remove_all/1","deprecated":false,"title":"remove_all(opts \\\\ [])","anchor":"remove_all/1"},{"id":"reset/3","deprecated":false,"title":"reset(fun, args, opts \\\\ [])","anchor":"reset/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Cache.DiskCache","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Cache.DiskCache","sections":[],"nested_context":"Bonfire","nested_title":".Common.Cache.DiskCache"},{"id":"Bonfire.Common.Changelog.Github.DataGrabber","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Changelog.Github.DataGrabber","sections":[],"nested_context":"Bonfire","nested_title":".Common.Changelog.Github.DataGrabber","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_issues/1","deprecated":false,"title":"fetch_issues(opts \\\\ [])","anchor":"fetch_issues/1"},{"id":"format_issue/1","deprecated":false,"title":"format_issue(issue)","anchor":"format_issue/1"},{"id":"prepare_data/2","deprecated":false,"title":"prepare_data(issues, new_version)","anchor":"prepare_data/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Config","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config","nodeGroups":[{"name":"Functions","nodes":[{"id":"compilation_error/1","deprecated":false,"title":"compilation_error(error)","anchor":"compilation_error/1"},{"id":"delete/2","deprecated":false,"title":"delete(key, otp_app \\\\ top_level_otp_app())","anchor":"delete/2"},{"id":"endpoint_module/0","deprecated":false,"title":"endpoint_module()","anchor":"endpoint_module/0"},{"id":"env/0","deprecated":false,"title":"env()","anchor":"env/0"},{"id":"get/3","deprecated":false,"title":"get(key_or_keys, default \\\\ nil, otp_app \\\\ nil)","anchor":"get/3"},{"id":"get!/2","deprecated":false,"title":"get!(key, otp_app \\\\ top_level_otp_app())","anchor":"get!/2"},{"id":"get_ext/1","deprecated":false,"title":"get_ext(module_or_otp_app)","anchor":"get_ext/1"},{"id":"get_ext/3","deprecated":false,"title":"get_ext(module_or_otp_app, key, default \\\\ nil)","anchor":"get_ext/3"},{"id":"get_ext!/1","deprecated":false,"title":"get_ext!(module_or_otp_app)","anchor":"get_ext!/1"},{"id":"get_ext!/2","deprecated":false,"title":"get_ext!(module_or_otp_app, key)","anchor":"get_ext!/2"},{"id":"get_for_process/1","deprecated":false,"title":"get_for_process(keys)","anchor":"get_for_process/1"},{"id":"keys_tree/1","deprecated":false,"title":"keys_tree(keys)","anchor":"keys_tree/1"},{"id":"module_enabled?/1","deprecated":false,"title":"module_enabled?(module)","anchor":"module_enabled?/1"},{"id":"put/1","deprecated":false,"title":"put(tree)","anchor":"put/1"},{"id":"put/3","deprecated":false,"title":"put(key, value, otp_app \\\\ nil)","anchor":"put/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"require_extension_config!/1","deprecated":false,"title":"require_extension_config!(extension)","anchor":"require_extension_config!/1"},{"id":"top_level_otp_app/0","deprecated":false,"title":"top_level_otp_app()","anchor":"top_level_otp_app/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Config.Error","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config.Error","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config.Error"},{"id":"Bonfire.Common.Config.LoadExtensionsConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Config.LoadExtensionsConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.Config.LoadExtensionsConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"load_configs/1","deprecated":false,"title":"load_configs(extras \\\\ [])","anchor":"load_configs/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.ConfigModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ConfigModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ConfigModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"c:config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"c:config_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.ContextModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ContextModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ContextModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"apply_error/2","deprecated":false,"title":"apply_error(error, args)","anchor":"apply_error/2"},{"id":"context_function_error/2","deprecated":false,"title":"context_function_error(error, args)","anchor":"context_function_error/2"},{"id":"context_module/1","deprecated":false,"title":"context_module(query)","anchor":"context_module/1"},{"id":"context_module!/1","deprecated":false,"title":"context_module!(query)","anchor":"context_module!/1"},{"id":"context_modules/1","deprecated":false,"title":"context_modules(modules)","anchor":"context_modules/1"},{"id":"linked_query_modules/0","deprecated":false,"title":"linked_query_modules()","anchor":"linked_query_modules/0"},{"id":"linked_schema_modules/0","deprecated":false,"title":"linked_schema_modules()","anchor":"linked_schema_modules/0"},{"id":"maybe_apply/4","deprecated":false,"title":"maybe_apply(object_schema_or_context, fun, args \\\\ [], opts \\\\ [fallback_fun: &apply_error/2])","anchor":"maybe_apply/4"},{"id":"maybe_context_module/1","deprecated":false,"title":"maybe_context_module(query)","anchor":"maybe_context_module/1"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Crypto","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Crypto","sections":[],"nested_context":"Bonfire","nested_title":".Common.Crypto","nodeGroups":[{"name":"Functions","nodes":[{"id":"decrypt_with_auth_key/3","deprecated":false,"title":"decrypt_with_auth_key(encrypted, password, salt)","anchor":"decrypt_with_auth_key/3"},{"id":"encrypt_with_auth_key/2","deprecated":false,"title":"encrypt_with_auth_key(clear_text, password)","anchor":"encrypt_with_auth_key/2"},{"id":"encrypt_with_auth_key/3","deprecated":false,"title":"encrypt_with_auth_key(clear_text, password, salt)","anchor":"encrypt_with_auth_key/3"}],"key":"functions"}]},{"id":"Bonfire.Common.DatesTimes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.DatesTimes","sections":[],"nested_context":"Bonfire","nested_title":".Common.DatesTimes","nodeGroups":[{"name":"Functions","nodes":[{"id":"available_format_keys/2","deprecated":false,"title":"available_format_keys(scope \\\\ DateTime, locale \\\\ Cldr.get_locale())","anchor":"available_format_keys/2"},{"id":"available_formats/2","deprecated":false,"title":"available_formats(scope \\\\ DateTime, locale \\\\ Cldr.get_locale())","anchor":"available_formats/2"},{"id":"date_from_now/2","deprecated":false,"title":"date_from_now(ulid_or_date, opts \\\\ [])","anchor":"date_from_now/2"},{"id":"date_from_pointer/1","deprecated":false,"title":"date_from_pointer(object)","anchor":"date_from_pointer/1"},{"id":"format/2","deprecated":false,"title":"format(date, opts \\\\ [])","anchor":"format/2"},{"id":"format_date/2","deprecated":false,"title":"format_date(date, opts \\\\ [])","anchor":"format_date/2"},{"id":"future?/1","deprecated":false,"title":"future?(dt)","anchor":"future?/1"},{"id":"maybe_generate_ulid/1","deprecated":false,"title":"maybe_generate_ulid(date_time_or_string)","anchor":"maybe_generate_ulid/1"},{"id":"now/0","deprecated":false,"title":"now()","anchor":"now/0"},{"id":"past/2","deprecated":false,"title":"past(amount_to_remove, unit \\\\ :second)","anchor":"past/2"},{"id":"past?/1","deprecated":false,"title":"past?(dt)","anchor":"past?/1"},{"id":"relative_date/2","deprecated":false,"title":"relative_date(date_time, opts \\\\ [])","anchor":"relative_date/2"},{"id":"remove/3","deprecated":false,"title":"remove(dt, amount_to_remove, unit \\\\ :second)","anchor":"remove/3"},{"id":"to_date/1","deprecated":false,"title":"to_date(date)","anchor":"to_date/1"},{"id":"to_date_time/1","deprecated":false,"title":"to_date_time(date_time)","anchor":"to_date_time/1"}],"key":"functions"}]},{"id":"Bonfire.Common.E","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.E","sections":[],"nested_context":"Bonfire","nested_title":".Common.E","nodeGroups":[{"name":"Functions","nodes":[{"id":"e/2","deprecated":false,"title":"e(val, fallback \\\\ nil)","anchor":"e/2"},{"id":"e/3","deprecated":false,"title":"e(object, key1, fallback)","anchor":"e/3"},{"id":"e/4","deprecated":false,"title":"e(object, key1, key2, fallback)","anchor":"e/4"},{"id":"e/5","deprecated":false,"title":"e(object, key1, key2, key3, fallback)","anchor":"e/5"},{"id":"e/6","deprecated":false,"title":"e(object, key1, key2, key3, key4, fallback)","anchor":"e/6"},{"id":"e/7","deprecated":false,"title":"e(object, key1, key2, key3, key4, key5, fallback)","anchor":"e/7"},{"id":"e/8","deprecated":false,"title":"e(object, key1, key2, key3, key4, key5, key6, fallback)","anchor":"e/8"},{"id":"ed/2","deprecated":false,"title":"ed(val, fallback \\\\ nil)","anchor":"ed/2"},{"id":"ed/3","deprecated":false,"title":"ed(map, key, fallback)","anchor":"ed/3"},{"id":"ed/4","deprecated":false,"title":"ed(object, key1, key2, fallback)","anchor":"ed/4"},{"id":"ed/5","deprecated":false,"title":"ed(object, key1, key2, key3, fallback)","anchor":"ed/5"},{"id":"ed/6","deprecated":false,"title":"ed(object, key1, key2, key3, key4, fallback)","anchor":"ed/6"},{"id":"ed/7","deprecated":false,"title":"ed(object, key1, key2, key3, key4, key5, fallback)","anchor":"ed/7"},{"id":"ed/8","deprecated":false,"title":"ed(object, key1, key2, key3, key4, key5, key6, fallback)","anchor":"ed/8"}],"key":"functions"}]},{"id":"Bonfire.Common.Enums","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Enums","sections":[],"nested_context":"Bonfire","nested_title":".Common.Enums","nodeGroups":[{"name":"Functions","nodes":[{"id":"access_keys/2","deprecated":false,"title":"access_keys(keys, last_fallback \\\\ nil)","anchor":"access_keys/2"},{"id":"all_ok?/1","deprecated":false,"title":"all_ok?(enum)","anchor":"all_ok?/1"},{"id":"all_oks_or_error/1","deprecated":false,"title":"all_oks_or_error(enum)","anchor":"all_oks_or_error/1"},{"id":"attr_get_id/2","deprecated":false,"title":"attr_get_id(attrs, field_name)","anchor":"attr_get_id/2"},{"id":"count_where/2","deprecated":false,"title":"count_where(collection, function \\\\ &is_nil/1)","anchor":"count_where/2"},{"id":"deep_merge/3","deprecated":false,"title":"deep_merge(left, right, opts \\\\ [])","anchor":"deep_merge/3"},{"id":"deep_merge_reduce/2","deprecated":false,"title":"deep_merge_reduce(list_or_map, opts \\\\ [])","anchor":"deep_merge_reduce/2"},{"id":"enum_get/3","deprecated":false,"title":"enum_get(map, key, fallback \\\\ nil)","anchor":"enum_get/3"},{"id":"filter_empty/2","deprecated":false,"title":"filter_empty(val, fallback)","anchor":"filter_empty/2"},{"id":"filter_empty/3","deprecated":false,"title":"filter_empty(enum, fallback, key)","anchor":"filter_empty/3"},{"id":"first!/1","deprecated":false,"title":"first!(list)","anchor":"first!/1"},{"id":"flatter/1","deprecated":false,"title":"flatter(list)","anchor":"flatter/1"},{"id":"fun/3","deprecated":false,"title":"fun(map, fun, args \\\\ [])","anchor":"fun/3"},{"id":"get_in_access_keys/3","deprecated":false,"title":"get_in_access_keys(map, keys, last_fallback)","anchor":"get_in_access_keys/3"},{"id":"get_in_access_keys!/3","deprecated":false,"title":"get_in_access_keys!(map, keys, last_fallback)","anchor":"get_in_access_keys!/3"},{"id":"group/2","deprecated":false,"title":"group(list, fun)","anchor":"group/2"},{"id":"group_map/2","deprecated":false,"title":"group_map(list, fun)","anchor":"group_map/2"},{"id":"has_duplicates?/2","deprecated":false,"title":"has_duplicates?(list, fun \\\\ nil)","anchor":"has_duplicates?/2"},{"id":"has_error?/1","deprecated":false,"title":"has_error?(enum)","anchor":"has_error?/1"},{"id":"has_ok?/1","deprecated":false,"title":"has_ok?(enum)","anchor":"has_ok?/1"},{"id":"has_tuple_key?/2","deprecated":false,"title":"has_tuple_key?(enum, key)","anchor":"has_tuple_key?/2"},{"id":"id/1","deprecated":false,"title":"id(id)","anchor":"id/1"},{"id":"ids/1","deprecated":false,"title":"ids(objects)","anchor":"ids/1"},{"id":"input_to_atoms/2","deprecated":false,"title":"input_to_atoms(data, opts \\\\ [])","anchor":"input_to_atoms/2"},{"id":"input_to_value/7","deprecated":false,"title":"input_to_value(v, _, including_values, _, force, arg6, values_to_integers)","anchor":"input_to_value/7"},{"id":"map_filter_empty/1","deprecated":false,"title":"map_filter_empty(data)","anchor":"map_filter_empty/1"},{"id":"map_key_replace/4","deprecated":false,"title":"map_key_replace(map, key, new_key, new_value \\\\ nil)","anchor":"map_key_replace/4"},{"id":"map_key_replace_existing/4","deprecated":false,"title":"map_key_replace_existing(map, key, new_key, new_value \\\\ nil)","anchor":"map_key_replace_existing/4"},{"id":"map_new/2","deprecated":false,"title":"map_new(data, fallback_key \\\\ :data)","anchor":"map_new/2"},{"id":"map_put_default/3","deprecated":false,"title":"map_put_default(map, key, default)","anchor":"map_put_default/3"},{"id":"map_put_in/3","deprecated":false,"title":"map_put_in(root \\\\ %{}, keys, value)","anchor":"map_put_in/3"},{"id":"maybe_append/2","deprecated":false,"title":"maybe_append(list, value)","anchor":"maybe_append/2"},{"id":"maybe_elem/3","deprecated":false,"title":"maybe_elem(tuple, index, fallback \\\\ nil)","anchor":"maybe_elem/3"},{"id":"maybe_flatten/1","deprecated":false,"title":"maybe_flatten(list)","anchor":"maybe_flatten/1"},{"id":"maybe_get/3","deprecated":false,"title":"maybe_get(map, key, fallback \\\\ nil)","anchor":"maybe_get/3"},{"id":"maybe_list/2","deprecated":false,"title":"maybe_list(val, change_fn)","anchor":"maybe_list/2"},{"id":"maybe_merge_to_struct/2","deprecated":false,"title":"maybe_merge_to_struct(first, precedence)","anchor":"maybe_merge_to_struct/2"},{"id":"maybe_put/3","deprecated":false,"title":"maybe_put(map, key, value)","anchor":"maybe_put/3"},{"id":"maybe_to_keyword_list/3","deprecated":false,"title":"maybe_to_keyword_list(obj, recursive \\\\ false, force_top_level \\\\ true)","anchor":"maybe_to_keyword_list/3"},{"id":"maybe_to_map/2","deprecated":false,"title":"maybe_to_map(obj, recursive \\\\ false)","anchor":"maybe_to_map/2"},{"id":"maybe_to_struct/2","deprecated":false,"title":"maybe_to_struct(obj, type \\\\ nil)","anchor":"maybe_to_struct/2"},{"id":"maybe_to_structs/2","deprecated":false,"title":"maybe_to_structs(v, opts \\\\ [])","anchor":"maybe_to_structs/2"},{"id":"merge_as_map/3","deprecated":false,"title":"merge_as_map(left, right, opts \\\\ [])","anchor":"merge_as_map/3"},{"id":"merge_changesets/2","deprecated":false,"title":"merge_changesets(cs1, cs2)","anchor":"merge_changesets/2"},{"id":"merge_keeping_only_first_keys/2","deprecated":false,"title":"merge_keeping_only_first_keys(map_1, map_2)","anchor":"merge_keeping_only_first_keys/2"},{"id":"merge_structs_as_map/2","deprecated":false,"title":"merge_structs_as_map(target, merge)","anchor":"merge_structs_as_map/2"},{"id":"merge_uniq/2","deprecated":false,"title":"merge_uniq(left, right)","anchor":"merge_uniq/2"},{"id":"naughty_to_atoms!/2","deprecated":false,"title":"naughty_to_atoms!(data, opts \\\\ [])","anchor":"naughty_to_atoms!/2"},{"id":"nested_structs_to_maps/1","deprecated":false,"title":"nested_structs_to_maps(struct)","anchor":"nested_structs_to_maps/1"},{"id":"put_new_in/3","deprecated":false,"title":"put_new_in(map, list, val)","anchor":"put_new_in/3"},{"id":"stringify_keys/2","deprecated":false,"title":"stringify_keys(map, recursive \\\\ false)","anchor":"stringify_keys/2"},{"id":"struct_from_map/2","deprecated":false,"title":"struct_from_map(a_map, list)","anchor":"struct_from_map/2"},{"id":"struct_to_map/2","deprecated":false,"title":"struct_to_map(other, recursive \\\\ false)","anchor":"struct_to_map/2"},{"id":"uniq_by_id/1","deprecated":false,"title":"uniq_by_id(list)","anchor":"uniq_by_id/1"},{"id":"unwrap_tuples/2","deprecated":false,"title":"unwrap_tuples(enum, key)","anchor":"unwrap_tuples/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Errors","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Errors","sections":[],"nested_context":"Bonfire","nested_title":".Common.Errors","nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_banner_with_trace/4","deprecated":false,"title":"debug_banner_with_trace(kind, exception, stacktrace, opts \\\\ [])","anchor":"debug_banner_with_trace/4"},{"id":"debug_exception/5","deprecated":false,"title":"debug_exception(msg, exception \\\\ nil, stacktrace \\\\ nil, kind \\\\ :error, opts \\\\ [])","anchor":"debug_exception/5"},{"id":"debug_log/5","deprecated":false,"title":"debug_log(msg, exception \\\\ nil, stacktrace \\\\ nil, kind \\\\ :error, msg_text \\\\ nil)","anchor":"debug_log/5"},{"id":"error_msg/1","deprecated":false,"title":"error_msg(errors)","anchor":"error_msg/1"},{"id":"format_banner/4","deprecated":false,"title":"format_banner(kind, exception, stacktrace \\\\ [], opts \\\\ [])","anchor":"format_banner/4"},{"id":"format_location/1","deprecated":false,"title":"format_location(opts)","anchor":"format_location/1"},{"id":"format_mfa/3","deprecated":false,"title":"format_mfa(module, fun, arity)","anchor":"format_mfa/3"},{"id":"format_stacktrace/2","deprecated":false,"title":"format_stacktrace(trace \\\\ nil, opts \\\\ [])","anchor":"format_stacktrace/2"},{"id":"format_stacktrace_entry/2","deprecated":false,"title":"format_stacktrace_entry(entry, opts \\\\ [])","anchor":"format_stacktrace_entry/2"},{"id":"format_stacktrace_entry_sliced/2","deprecated":false,"title":"format_stacktrace_entry_sliced(entry, opts)","anchor":"format_stacktrace_entry_sliced/2"},{"id":"last_stacktrace/0","deprecated":false,"title":"last_stacktrace()","anchor":"last_stacktrace/0"},{"id":"map_error/2","deprecated":false,"title":"map_error(other, fun)","anchor":"map_error/2"},{"id":"maybe_ok_error/2","deprecated":false,"title":"maybe_ok_error(other, change_fn)","anchor":"maybe_ok_error/2"},{"id":"mf_maybe_link_to_code/4","deprecated":false,"title":"mf_maybe_link_to_code(text \\\\ nil, mod, fun, opts)","anchor":"mf_maybe_link_to_code/4"},{"id":"module_maybe_link_to_code/3","deprecated":false,"title":"module_maybe_link_to_code(text \\\\ nil, mod, opts)","anchor":"module_maybe_link_to_code/3"},{"id":"replace_error/2","deprecated":false,"title":"replace_error(other, value)","anchor":"replace_error/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Extend","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extend","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extend","nodeGroups":[{"name":"Functions","nodes":[{"id":"application_for_module/1","deprecated":false,"title":"application_for_module(module)","anchor":"application_for_module/1"},{"id":"beam_file_from_object_code/1","deprecated":false,"title":"beam_file_from_object_code(module)","anchor":"beam_file_from_object_code/1"},{"id":"deps_tree/0","deprecated":false,"title":"deps_tree()","anchor":"deps_tree/0"},{"id":"deps_tree_flat/1","deprecated":false,"title":"deps_tree_flat(tree \\\\ deps_tree())","anchor":"deps_tree_flat/1"},{"id":"disabled_value?/1","deprecated":false,"title":"disabled_value?(value)","anchor":"disabled_value?/1"},{"id":"extend_module/1","deprecated":false,"title":"extend_module(module)","anchor":"extend_module/1"},{"id":"extension_enabled?/2","deprecated":false,"title":"extension_enabled?(module_or_otp_app, opts \\\\ [])","anchor":"extension_enabled?/2"},{"id":"extension_loaded?/1","deprecated":false,"title":"extension_loaded?(module_or_otp_app)","anchor":"extension_loaded?/1"},{"id":"fetch_docs_as_markdown/1","deprecated":false,"title":"fetch_docs_as_markdown(module)","anchor":"fetch_docs_as_markdown/1"},{"id":"fetch_docs_as_markdown/2","deprecated":false,"title":"fetch_docs_as_markdown(module, function)","anchor":"fetch_docs_as_markdown/2"},{"id":"file_code/1","deprecated":false,"title":"file_code(code_file)","anchor":"file_code/1"},{"id":"function_ast/3","deprecated":false,"title":"function_ast(module, fun, opts \\\\ [])","anchor":"function_ast/3"},{"id":"function_code/3","deprecated":false,"title":"function_code(module, fun, opts \\\\ [])","anchor":"function_code/3"},{"id":"function_line_number/3","deprecated":false,"title":"function_line_number(module, fun, opts \\\\ [])","anchor":"function_line_number/3"},{"id":"function_line_numbers/3","deprecated":false,"title":"function_line_numbers(module, fun, opts \\\\ [])","anchor":"function_line_numbers/3"},{"id":"generate_reverse_router!/0","deprecated":false,"title":"generate_reverse_router!()","anchor":"generate_reverse_router!/0"},{"id":"has_extension_config?/1","deprecated":false,"title":"has_extension_config?(module_or_otp_app)","anchor":"has_extension_config?/1"},{"id":"import_if_enabled/3","deprecated":false,"title":"import_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil)","anchor":"import_if_enabled/3"},{"id":"inject_function/3","deprecated":false,"title":"inject_function(module, fun, target_module \\\\ nil)","anchor":"inject_function/3"},{"id":"loaded_applications_map/1","deprecated":false,"title":"loaded_applications_map(opts \\\\ [cache: false])","anchor":"loaded_applications_map/1"},{"id":"loaded_applications_names/1","deprecated":false,"title":"loaded_applications_names(opts \\\\ [cache: false])","anchor":"loaded_applications_names/1"},{"id":"macro_inspect/1","deprecated":false,"title":"macro_inspect(fun)","anchor":"macro_inspect/1"},{"id":"maybe_extension_loaded/1","deprecated":false,"title":"maybe_extension_loaded(module_or_otp_app)","anchor":"maybe_extension_loaded/1"},{"id":"maybe_extension_loaded!/1","deprecated":false,"title":"maybe_extension_loaded!(module_or_otp_app)","anchor":"maybe_extension_loaded!/1"},{"id":"maybe_module/2","deprecated":false,"title":"maybe_module(module, opts \\\\ [])","anchor":"maybe_module/2"},{"id":"maybe_module!/2","deprecated":false,"title":"maybe_module!(module, opts \\\\ [])","anchor":"maybe_module!/2"},{"id":"maybe_module_loaded/1","deprecated":false,"title":"maybe_module_loaded(module)","anchor":"maybe_module_loaded/1"},{"id":"maybe_schema_or_pointer/1","deprecated":false,"title":"maybe_schema_or_pointer(schema_module)","anchor":"maybe_schema_or_pointer/1"},{"id":"module_ast_normalize/3","deprecated":false,"title":"module_ast_normalize(module, ast, target \\\\ :ast)","anchor":"module_ast_normalize/3"},{"id":"module_beam_code/2","deprecated":false,"title":"module_beam_code(module, opts \\\\ [])","anchor":"module_beam_code/2"},{"id":"module_behaviour?/2","deprecated":false,"title":"module_behaviour?(module, behaviour)","anchor":"module_behaviour?/2"},{"id":"module_behaviours/1","deprecated":false,"title":"module_behaviours(module)","anchor":"module_behaviours/1"},{"id":"module_code/2","deprecated":false,"title":"module_code(module, opts \\\\ [])","anchor":"module_code/2"},{"id":"module_code_from_ast/3","deprecated":false,"title":"module_code_from_ast(module, ast, target \\\\ :ast)","anchor":"module_code_from_ast/3"},{"id":"module_code_from_object_code/1","deprecated":false,"title":"module_code_from_object_code(module)","anchor":"module_code_from_object_code/1"},{"id":"module_enabled?/2","deprecated":false,"title":"module_enabled?(module, opts \\\\ [])","anchor":"module_enabled?/2"},{"id":"module_exists?/1","deprecated":false,"title":"module_exists?(module)","anchor":"module_exists?/1"},{"id":"module_file/1","deprecated":false,"title":"module_file(module)","anchor":"module_file/1"},{"id":"module_file_code/2","deprecated":false,"title":"module_file_code(module, opts \\\\ [])","anchor":"module_file_code/2"},{"id":"module_file_from_object_code/1","deprecated":false,"title":"module_file_from_object_code(module)","anchor":"module_file_from_object_code/1"},{"id":"module_object_byte_code/1","deprecated":false,"title":"module_object_byte_code(module)","anchor":"module_object_byte_code/1"},{"id":"module_object_code_tuple/1","deprecated":false,"title":"module_object_code_tuple(module)","anchor":"module_object_code_tuple/1"},{"id":"quoted_import_if_enabled/4","deprecated":false,"title":"quoted_import_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_import_if_enabled/4"},{"id":"quoted_require_if_enabled/4","deprecated":false,"title":"quoted_require_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_require_if_enabled/4"},{"id":"quoted_use_if_enabled/4","deprecated":false,"title":"quoted_use_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil, caller \\\\ nil)","anchor":"quoted_use_if_enabled/4"},{"id":"require_if_enabled/3","deprecated":false,"title":"require_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil)","anchor":"require_if_enabled/3"},{"id":"return_file/1","deprecated":false,"title":"return_file(raw)","anchor":"return_file/1"},{"id":"tar_file_code/1","deprecated":false,"title":"tar_file_code(code_file)","anchor":"tar_file_code/1"},{"id":"use_if_enabled/3","deprecated":false,"title":"use_if_enabled(module, opts \\\\ [], fallback_module \\\\ nil)","anchor":"use_if_enabled/3"}],"key":"functions"}]},{"id":"Bonfire.Common.ExtensionBehaviour","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ExtensionBehaviour","sections":[],"nested_context":"Bonfire","nested_title":".Common.ExtensionBehaviour","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"c:modules/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"adopters_of_behaviour/2","deprecated":false,"title":"adopters_of_behaviour(behaviour \\\\ __MODULE__, app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"adopters_of_behaviour/2"},{"id":"app_modules_to_scan/1","deprecated":false,"title":"app_modules_to_scan(opts \\\\ [])","anchor":"app_modules_to_scan/1"},{"id":"apply_modules/2","deprecated":false,"title":"apply_modules(modules, fun)","anchor":"apply_modules/2"},{"id":"apply_modules_cached/2","deprecated":false,"title":"apply_modules_cached(modules, fun)","anchor":"apply_modules_cached/2"},{"id":"apps_to_scan/1","deprecated":false,"title":"apps_to_scan(opts \\\\ [])","anchor":"apps_to_scan/1"},{"id":"behaviour_app_modules/2","deprecated":false,"title":"behaviour_app_modules(behaviour, behaviours \\\\ nil)","anchor":"behaviour_app_modules/2"},{"id":"behaviour_modules/2","deprecated":false,"title":"behaviour_modules(behaviour, behaviours \\\\ nil)","anchor":"behaviour_modules/2"},{"id":"behaviours/0","deprecated":false,"title":"behaviours()","anchor":"behaviours/0"},{"id":"cached_behaviours/0","deprecated":false,"title":"cached_behaviours()","anchor":"cached_behaviours/0"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"find_adopters_of_behaviours/2","deprecated":false,"title":"find_adopters_of_behaviours(behaviours \\\\ find_extension_behaviours(), app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"find_adopters_of_behaviours/2"},{"id":"find_extension_behaviours/1","deprecated":false,"title":"find_extension_behaviours(app_modules_to_scan \\\\ app_modules_to_scan())","anchor":"find_extension_behaviours/1"},{"id":"populate/0","deprecated":false,"title":"populate()","anchor":"populate/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.ExtensionModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.ExtensionModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.ExtensionModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"c:declared_extension/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"declared_extension/1","deprecated":false,"title":"declared_extension(module)","anchor":"declared_extension/1"},{"id":"declared_extensions/1","deprecated":false,"title":"declared_extensions(modules \\\\ app_modules())","anchor":"declared_extensions/1"},{"id":"default_nav/0","deprecated":false,"title":"default_nav()","anchor":"default_nav/0"},{"id":"default_nav/1","deprecated":false,"title":"default_nav(app)","anchor":"default_nav/1"},{"id":"default_nav_apps/0","deprecated":false,"title":"default_nav_apps()","anchor":"default_nav_apps/0"},{"id":"extension/1","deprecated":false,"title":"extension(app)","anchor":"extension/1"},{"id":"extension_function_error/2","deprecated":false,"title":"extension_function_error(error, args)","anchor":"extension_function_error/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Extensions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extensions","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extensions","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_deps/0","deprecated":false,"title":"all_deps()","anchor":"all_deps/0"},{"id":"data/0","deprecated":false,"title":"data()","anchor":"data/0"},{"id":"dep_name/1","deprecated":false,"title":"dep_name(dep)","anchor":"dep_name/1"},{"id":"get_branch/1","deprecated":false,"title":"get_branch(arg1)","anchor":"get_branch/1"},{"id":"get_code_link/1","deprecated":false,"title":"get_code_link(dep)","anchor":"get_code_link/1"},{"id":"get_link/1","deprecated":false,"title":"get_link(dep)","anchor":"get_link/1"},{"id":"get_version/1","deprecated":false,"title":"get_version(dep)","anchor":"get_version/1"},{"id":"get_version_link/1","deprecated":false,"title":"get_version_link(dep)","anchor":"get_version_link/1"},{"id":"global_disable/1","deprecated":false,"title":"global_disable(extension)","anchor":"global_disable/1"},{"id":"global_enable/1","deprecated":false,"title":"global_enable(extension)","anchor":"global_enable/1"},{"id":"loaded_deps/1","deprecated":false,"title":"loaded_deps(opts \\\\ [])","anchor":"loaded_deps/1"},{"id":"loaded_deps_names/1","deprecated":false,"title":"loaded_deps_names(opts \\\\ [])","anchor":"loaded_deps_names/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Extensions.Diff","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Extensions.Diff","sections":[],"nested_context":"Bonfire","nested_title":".Common.Extensions.Diff","nodeGroups":[{"name":"Functions","nodes":[{"id":"analyse_repo_latest_diff_stream/1","deprecated":false,"title":"analyse_repo_latest_diff_stream(path_diff)","anchor":"analyse_repo_latest_diff_stream/1"},{"id":"generate_diff/2","deprecated":false,"title":"generate_diff(ref_or_branch, repo_path)","anchor":"generate_diff/2"},{"id":"git!/4","deprecated":false,"title":"git!(args, repo_path \\\\ \".\", into \\\\ default_into(), original_cwd \\\\ root())","anchor":"git!/4"},{"id":"git_add_all/1","deprecated":false,"title":"git_add_all(repo_path)","anchor":"git_add_all/1"},{"id":"git_fetch/1","deprecated":false,"title":"git_fetch(repo_path)","anchor":"git_fetch/1"},{"id":"git_generate_diff/4","deprecated":false,"title":"git_generate_diff(ref_or_branch, repo_path, path_output, extra_opt \\\\ \"--cached\")","anchor":"git_generate_diff/4"},{"id":"git_pre_configure/1","deprecated":false,"title":"git_pre_configure(repo_path)","anchor":"git_pre_configure/1"},{"id":"parse_repo_latest_diff/1","deprecated":false,"title":"parse_repo_latest_diff(path_diff)","anchor":"parse_repo_latest_diff/1"},{"id":"repo_latest_diff/3","deprecated":false,"title":"repo_latest_diff(ref_or_branch, repo_path, msg \\\\ nil)","anchor":"repo_latest_diff/3"},{"id":"root/0","deprecated":false,"title":"root()","anchor":"root/0"},{"id":"tmp_path/1","deprecated":false,"title":"tmp_path(prefix)","anchor":"tmp_path/1"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/4","deprecated":false,"title":"delete(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"delete/4"},{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(url)","anchor":"get_cached/1"},{"id":"patch/4","deprecated":false,"title":"patch(url, body, headers \\\\ [], options \\\\ [])","anchor":"patch/4"},{"id":"post/4","deprecated":false,"title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"put/4","deprecated":false,"title":"put(url, body, headers \\\\ [], options \\\\ [])","anchor":"put/4"},{"id":"request/5","deprecated":false,"title":"request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"request/5"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP.Connection","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP.Connection","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP.Connection","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter_options/2","deprecated":false,"title":"adapter_options(adapter \\\\ Tesla.Adapter.Hackney, opts)","anchor":"adapter_options/2"},{"id":"new/1","deprecated":false,"title":"new(opts \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"Bonfire.Common.HTTP.RequestBuilder","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.HTTP.RequestBuilder","sections":[],"nested_context":"Bonfire","nested_title":".Common.HTTP.RequestBuilder","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_param/4","deprecated":false,"title":"add_param(request, atom1, atom2, values)","anchor":"add_param/4"},{"id":"headers/2","deprecated":false,"title":"headers(request, header_list)","anchor":"headers/2"},{"id":"method/2","deprecated":false,"title":"method(request, m)","anchor":"method/2"},{"id":"opts/2","deprecated":false,"title":"opts(request, options)","anchor":"opts/2"},{"id":"url/2","deprecated":false,"title":"url(request, u)","anchor":"url/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_locale/0","deprecated":false,"title":"default_locale()","anchor":"default_locale/0"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_locale_id/0","deprecated":false,"title":"get_locale_id()","anchor":"get_locale_id/0"},{"id":"known_locales/0","deprecated":false,"title":"known_locales()","anchor":"known_locales/0"},{"id":"locale_name/1","deprecated":false,"title":"locale_name(locale)","anchor":"locale_name/1"},{"id":"put_locale/1","deprecated":false,"title":"put_locale(locale)","anchor":"put_locale/1"},{"id":"set_locale_config/0","deprecated":false,"title":"set_locale_config()","anchor":"set_locale_config/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr","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":"Bonfire.Common.Localise.Cldr.AcceptLanguage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.AcceptLanguage","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.AcceptLanguage","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":"Bonfire.Common.Localise.Cldr.Calendar","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Calendar","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Calendar","nodeGroups":[{"name":"Functions","nodes":[{"id":"calendar_from_locale/1","deprecated":false,"title":"calendar_from_locale(locale)","anchor":"calendar_from_locale/1"},{"id":"calendar_from_territory/1","deprecated":false,"title":"calendar_from_territory(territory)","anchor":"calendar_from_territory/1"},{"id":"cyclic_years/2","deprecated":false,"title":"cyclic_years(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"cyclic_years/2"},{"id":"day_periods/2","deprecated":false,"title":"day_periods(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"day_periods/2"},{"id":"days/2","deprecated":false,"title":"days(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"days/2"},{"id":"eras/2","deprecated":false,"title":"eras(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"eras/2"},{"id":"localize/1","deprecated":false,"title":"localize(date)","anchor":"localize/1"},{"id":"localize/2","deprecated":false,"title":"localize(datetime, options)","anchor":"localize/2"},{"id":"localize/3","deprecated":false,"title":"localize(datetime, part, options \\\\ [])","anchor":"localize/3"},{"id":"month_patterns/2","deprecated":false,"title":"month_patterns(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"month_patterns/2"},{"id":"months/2","deprecated":false,"title":"months(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"months/2"},{"id":"quarters/2","deprecated":false,"title":"quarters(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ :gregorian)","anchor":"quarters/2"},{"id":"strftime_options!/2","deprecated":false,"title":"strftime_options!(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), options \\\\ [])","anchor":"strftime_options!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Currency","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Currency","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Currency","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: Bonfire.Common.Localise.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: Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Date","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Date","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Date","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(date, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(date, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Date.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Date.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Date.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options)","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options)","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(date_time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(date_time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Format","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Format","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Format","nodeGroups":[{"name":"Types","nodes":[{"id":"calendar/0","deprecated":false,"title":"calendar()","anchor":"t:calendar/0"},{"id":"formats/0","deprecated":false,"title":"formats()","anchor":"t:formats/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"calendars_for/1","deprecated":false,"title":"calendars_for(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"calendars_for/1"},{"id":"common_date_time_format_names/0","deprecated":false,"title":"common_date_time_format_names()","anchor":"common_date_time_format_names/0"},{"id":"date_available_formats/2","deprecated":false,"title":"date_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_available_formats/2"},{"id":"date_formats/2","deprecated":false,"title":"date_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_formats/2"},{"id":"date_time_at_formats/2","deprecated":false,"title":"date_time_at_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_at_formats/2"},{"id":"date_time_available_formats/2","deprecated":false,"title":"date_time_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_available_formats/2"},{"id":"date_time_formats/2","deprecated":false,"title":"date_time_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_formats/2"},{"id":"date_time_interval_fallback/2","deprecated":false,"title":"date_time_interval_fallback(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_interval_fallback/2"},{"id":"date_time_interval_formats/2","deprecated":false,"title":"date_time_interval_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"date_time_interval_formats/2"},{"id":"day_period_for/2","deprecated":false,"title":"day_period_for(time, language)","anchor":"day_period_for/2"},{"id":"gmt_format/1","deprecated":false,"title":"gmt_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"gmt_format/1"},{"id":"gmt_zero_format/1","deprecated":false,"title":"gmt_zero_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"gmt_zero_format/1"},{"id":"hour_format/1","deprecated":false,"title":"hour_format(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"hour_format/1"},{"id":"language_has_noon_and_midnight?/1","deprecated":false,"title":"language_has_noon_and_midnight?(locale)","anchor":"language_has_noon_and_midnight?/1"},{"id":"time_available_formats/2","deprecated":false,"title":"time_available_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"time_available_formats/2"},{"id":"time_formats/2","deprecated":false,"title":"time_formats(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale(), calendar \\\\ Cldr.Calendar.default_cldr_calendar())","anchor":"time_formats/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Formatter","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Formatter","nodeGroups":[{"name":"Functions","nodes":[{"id":"format/4","deprecated":false,"title":"format(date, format, locale \\\\ Cldr.get_locale(), options \\\\ [])","anchor":"format/4"},{"id":"gmt_tz_format/3","deprecated":false,"title":"gmt_tz_format(locale, offset, options \\\\ [])","anchor":"gmt_tz_format/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string/3","deprecated":false,"title":"do_to_string(from, to, options)","anchor":"do_to_string/3"},{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.DateTime.Relative","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.DateTime.Relative","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.DateTime.Relative","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(interval, options)","anchor":"to_string/2"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(interval, options)","anchor":"to_string!/2"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Language","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Language","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Language","nodeGroups":[{"name":"Types","nodes":[{"id":"styles/0","deprecated":false,"title":"styles()","anchor":"t:styles/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"available_languages/1","deprecated":false,"title":"available_languages(locale \\\\ get_locale())","anchor":"available_languages/1"},{"id":"known_languages/1","deprecated":false,"title":"known_languages(locale \\\\ get_locale())","anchor":"known_languages/1"},{"id":"to_string/2","deprecated":false,"title":"to_string(key, options \\\\ [])","anchor":"to_string/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.List","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.List","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.List","nodeGroups":[{"name":"Functions","nodes":[{"id":"intersperse/2","deprecated":false,"title":"intersperse(list, options \\\\ [])","anchor":"intersperse/2"},{"id":"intersperse/3","deprecated":false,"title":"intersperse(list, locale, pattern)","anchor":"intersperse/3"},{"id":"intersperse!/2","deprecated":false,"title":"intersperse!(list, options \\\\ [])","anchor":"intersperse!/2"},{"id":"list_formats_for/1","deprecated":false,"title":"list_formats_for(locale_name)","anchor":"list_formats_for/1"},{"id":"list_patterns_for/1","deprecated":false,"title":"list_patterns_for(locale_name)","anchor":"list_patterns_for/1"},{"id":"to_string/2","deprecated":false,"title":"to_string(list, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(list, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Locale","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Locale","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Locale","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":"Bonfire.Common.Localise.Cldr.LocaleDisplay","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.LocaleDisplay","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.LocaleDisplay","nodeGroups":[{"name":"Functions","nodes":[{"id":"display_name/2","deprecated":false,"title":"display_name(language_tag, options \\\\ [])","anchor":"display_name/2"},{"id":"display_name!/2","deprecated":false,"title":"display_name!(language_tag, options \\\\ [])","anchor":"display_name!/2"},{"id":"display_names/1","deprecated":false,"title":"display_names(locale)","anchor":"display_names/1"},{"id":"time_zone_names/1","deprecated":false,"title":"time_zone_names(locale)","anchor":"time_zone_names/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Number","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number","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":"Bonfire.Common.Localise.Cldr.Number.Cardinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Cardinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Cardinal","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":"Bonfire.Common.Localise.Cldr.Number.Format","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Format","sections":[{"id":"Number Pattern Examples","anchor":"module-number-pattern-examples"}],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Format","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_formats_for/1","deprecated":false,"title":"all_formats_for(locale \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"all_formats_for/1"},{"id":"all_formats_for!/1","deprecated":false,"title":"all_formats_for!(locale \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.Cldr.get_locale())","anchor":"decimal_format_list_for/1"},{"id":"default_grouping_for/1","deprecated":false,"title":"default_grouping_for(locale \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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 \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Formatter.Decimal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Formatter.Decimal","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":"Bonfire.Common.Localise.Cldr.Number.Ordinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Ordinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Ordinal","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":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.PluralRule.Range","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.PluralRule.Range","nodeGroups":[{"name":"Functions","nodes":[{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(first, last, locale)","anchor":"plural_rule/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Number.Symbol","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Symbol","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Symbol","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 \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Number.System","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.System","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.System","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":"Bonfire.Common.Localise.Cldr.Number.Transliterate","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Number.Transliterate","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Number.Transliterate","nodeGroups":[{"name":"Functions","nodes":[{"id":"transliterate/3","deprecated":false,"title":"transliterate(sequence, locale \\\\ Bonfire.Common.Localise.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":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.NumberSystem","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":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.Ordinal","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.Ordinal","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":"digits_ordinal_feminine/2","deprecated":false,"title":"digits_ordinal_feminine(number, locale)","anchor":"digits_ordinal_feminine/2"},{"id":"digits_ordinal_feminine_plural/2","deprecated":false,"title":"digits_ordinal_feminine_plural(number, locale)","anchor":"digits_ordinal_feminine_plural/2"},{"id":"digits_ordinal_indicator_m/2","deprecated":false,"title":"digits_ordinal_indicator_m(number, language_tag)","anchor":"digits_ordinal_indicator_m/2"},{"id":"digits_ordinal_masculine/2","deprecated":false,"title":"digits_ordinal_masculine(number, locale)","anchor":"digits_ordinal_masculine/2"},{"id":"digits_ordinal_masculine_adjective/2","deprecated":false,"title":"digits_ordinal_masculine_adjective(number, locale)","anchor":"digits_ordinal_masculine_adjective/2"},{"id":"digits_ordinal_masculine_plural/2","deprecated":false,"title":"digits_ordinal_masculine_plural(number, locale)","anchor":"digits_ordinal_masculine_plural/2"},{"id":"dord_femabbrev/2","deprecated":false,"title":"dord_femabbrev(number, language_tag)","anchor":"dord_femabbrev/2"},{"id":"dord_mascabbrev/2","deprecated":false,"title":"dord_mascabbrev(number, language_tag)","anchor":"dord_mascabbrev/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":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Rbnf.Spellout","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Rbnf.Spellout","nodeGroups":[{"name":"Functions","nodes":[{"id":"after_hundred/2","deprecated":false,"title":"after_hundred(number, language_tag)","anchor":"after_hundred/2"},{"id":"after_thousand_or_more/2","deprecated":false,"title":"after_thousand_or_more(number, language_tag)","anchor":"after_thousand_or_more/2"},{"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":"cents_f/2","deprecated":false,"title":"cents_f(number, language_tag)","anchor":"cents_f/2"},{"id":"cents_m/2","deprecated":false,"title":"cents_m(number, language_tag)","anchor":"cents_m/2"},{"id":"cents_o/2","deprecated":false,"title":"cents_o(number, language_tag)","anchor":"cents_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":"et_un/2","deprecated":false,"title":"et_un(number, language_tag)","anchor":"et_un/2"},{"id":"et_une/2","deprecated":false,"title":"et_une(number, language_tag)","anchor":"et_une/2"},{"id":"et_unieme/2","deprecated":false,"title":"et_unieme(number, language_tag)","anchor":"et_unieme/2"},{"id":"fem_with_a/2","deprecated":false,"title":"fem_with_a(number, language_tag)","anchor":"fem_with_a/2"},{"id":"fem_with_i/2","deprecated":false,"title":"fem_with_i(number, language_tag)","anchor":"fem_with_i/2"},{"id":"fem_with_o/2","deprecated":false,"title":"fem_with_o(number, language_tag)","anchor":"fem_with_o/2"},{"id":"lenient_parse/2","deprecated":false,"title":"lenient_parse(number, language_tag)","anchor":"lenient_parse/2"},{"id":"mille_o/2","deprecated":false,"title":"mille_o(number, language_tag)","anchor":"mille_o/2"},{"id":"msc_no_final/2","deprecated":false,"title":"msc_no_final(number, language_tag)","anchor":"msc_no_final/2"},{"id":"msc_with_a/2","deprecated":false,"title":"msc_with_a(number, language_tag)","anchor":"msc_with_a/2"},{"id":"msc_with_a_nofinal/2","deprecated":false,"title":"msc_with_a_nofinal(number, language_tag)","anchor":"msc_with_a_nofinal/2"},{"id":"msc_with_i/2","deprecated":false,"title":"msc_with_i(number, language_tag)","anchor":"msc_with_i/2"},{"id":"msc_with_i_nofinal/2","deprecated":false,"title":"msc_with_i_nofinal(number, language_tag)","anchor":"msc_with_i_nofinal/2"},{"id":"msc_with_o/2","deprecated":false,"title":"msc_with_o(number, language_tag)","anchor":"msc_with_o/2"},{"id":"msc_with_o_nofinal/2","deprecated":false,"title":"msc_with_o_nofinal(number, language_tag)","anchor":"msc_with_o_nofinal/2"},{"id":"msco_with_a/2","deprecated":false,"title":"msco_with_a(number, language_tag)","anchor":"msco_with_a/2"},{"id":"msco_with_i/2","deprecated":false,"title":"msco_with_i(number, language_tag)","anchor":"msco_with_i/2"},{"id":"msco_with_o/2","deprecated":false,"title":"msco_with_o(number, language_tag)","anchor":"msco_with_o/2"},{"id":"ordinal_esima/2","deprecated":false,"title":"ordinal_esima(number, language_tag)","anchor":"ordinal_esima/2"},{"id":"ordinal_esima_with_a/2","deprecated":false,"title":"ordinal_esima_with_a(number, language_tag)","anchor":"ordinal_esima_with_a/2"},{"id":"ordinal_esima_with_i/2","deprecated":false,"title":"ordinal_esima_with_i(number, language_tag)","anchor":"ordinal_esima_with_i/2"},{"id":"ordinal_esima_with_o/2","deprecated":false,"title":"ordinal_esima_with_o(number, language_tag)","anchor":"ordinal_esima_with_o/2"},{"id":"ordinal_esime/2","deprecated":false,"title":"ordinal_esime(number, language_tag)","anchor":"ordinal_esime/2"},{"id":"ordinal_esime_with_a/2","deprecated":false,"title":"ordinal_esime_with_a(number, language_tag)","anchor":"ordinal_esime_with_a/2"},{"id":"ordinal_esime_with_i/2","deprecated":false,"title":"ordinal_esime_with_i(number, language_tag)","anchor":"ordinal_esime_with_i/2"},{"id":"ordinal_esime_with_o/2","deprecated":false,"title":"ordinal_esime_with_o(number, language_tag)","anchor":"ordinal_esime_with_o/2"},{"id":"ordinal_esimi/2","deprecated":false,"title":"ordinal_esimi(number, language_tag)","anchor":"ordinal_esimi/2"},{"id":"ordinal_esimi_with_a/2","deprecated":false,"title":"ordinal_esimi_with_a(number, language_tag)","anchor":"ordinal_esimi_with_a/2"},{"id":"ordinal_esimi_with_i/2","deprecated":false,"title":"ordinal_esimi_with_i(number, language_tag)","anchor":"ordinal_esimi_with_i/2"},{"id":"ordinal_esimi_with_o/2","deprecated":false,"title":"ordinal_esimi_with_o(number, language_tag)","anchor":"ordinal_esimi_with_o/2"},{"id":"ordinal_esimo/2","deprecated":false,"title":"ordinal_esimo(number, language_tag)","anchor":"ordinal_esimo/2"},{"id":"ordinal_esimo_with_a/2","deprecated":false,"title":"ordinal_esimo_with_a(number, language_tag)","anchor":"ordinal_esimo_with_a/2"},{"id":"ordinal_esimo_with_i/2","deprecated":false,"title":"ordinal_esimo_with_i(number, language_tag)","anchor":"ordinal_esimo_with_i/2"},{"id":"ordinal_esimo_with_o/2","deprecated":false,"title":"ordinal_esimo_with_o(number, language_tag)","anchor":"ordinal_esimo_with_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_feminine/2","deprecated":false,"title":"spellout_cardinal_feminine(number, locale)","anchor":"spellout_cardinal_feminine/2"},{"id":"spellout_cardinal_feminine_cents/2","deprecated":false,"title":"spellout_cardinal_feminine_cents(number, language_tag)","anchor":"spellout_cardinal_feminine_cents/2"},{"id":"spellout_cardinal_masculine/2","deprecated":false,"title":"spellout_cardinal_masculine(number, locale)","anchor":"spellout_cardinal_masculine/2"},{"id":"spellout_cardinal_masculine_cents/2","deprecated":false,"title":"spellout_cardinal_masculine_cents(number, language_tag)","anchor":"spellout_cardinal_masculine_cents/2"},{"id":"spellout_cardinal_verbose/2","deprecated":false,"title":"spellout_cardinal_verbose(number, locale)","anchor":"spellout_cardinal_verbose/2"},{"id":"spellout_leading/2","deprecated":false,"title":"spellout_leading(number, language_tag)","anchor":"spellout_leading/2"},{"id":"spellout_numbering/2","deprecated":false,"title":"spellout_numbering(number, locale)","anchor":"spellout_numbering/2"},{"id":"spellout_numbering_cents/2","deprecated":false,"title":"spellout_numbering_cents(number, language_tag)","anchor":"spellout_numbering_cents/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_feminine/2","deprecated":false,"title":"spellout_ordinal_feminine(number, locale)","anchor":"spellout_ordinal_feminine/2"},{"id":"spellout_ordinal_feminine_cont/2","deprecated":false,"title":"spellout_ordinal_feminine_cont(number, language_tag)","anchor":"spellout_ordinal_feminine_cont/2"},{"id":"spellout_ordinal_feminine_conts/2","deprecated":false,"title":"spellout_ordinal_feminine_conts(number, language_tag)","anchor":"spellout_ordinal_feminine_conts/2"},{"id":"spellout_ordinal_feminine_plural/2","deprecated":false,"title":"spellout_ordinal_feminine_plural(number, locale)","anchor":"spellout_ordinal_feminine_plural/2"},{"id":"spellout_ordinal_masculine/2","deprecated":false,"title":"spellout_ordinal_masculine(number, locale)","anchor":"spellout_ordinal_masculine/2"},{"id":"spellout_ordinal_masculine_adjective/2","deprecated":false,"title":"spellout_ordinal_masculine_adjective(number, locale)","anchor":"spellout_ordinal_masculine_adjective/2"},{"id":"spellout_ordinal_masculine_cont/2","deprecated":false,"title":"spellout_ordinal_masculine_cont(number, language_tag)","anchor":"spellout_ordinal_masculine_cont/2"},{"id":"spellout_ordinal_masculine_conts/2","deprecated":false,"title":"spellout_ordinal_masculine_conts(number, language_tag)","anchor":"spellout_ordinal_masculine_conts/2"},{"id":"spellout_ordinal_masculine_plural/2","deprecated":false,"title":"spellout_ordinal_masculine_plural(number, locale)","anchor":"spellout_ordinal_masculine_plural/2"},{"id":"spellout_ordinal_verbose/2","deprecated":false,"title":"spellout_ordinal_verbose(number, locale)","anchor":"spellout_ordinal_verbose/2"},{"id":"subcents_f/2","deprecated":false,"title":"subcents_f(number, language_tag)","anchor":"subcents_f/2"},{"id":"subcents_m/2","deprecated":false,"title":"subcents_m(number, language_tag)","anchor":"subcents_m/2"},{"id":"subcents_o/2","deprecated":false,"title":"subcents_o(number, language_tag)","anchor":"subcents_o/2"},{"id":"teen/2","deprecated":false,"title":"teen(number, language_tag)","anchor":"teen/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"},{"id":"x_ty/2","deprecated":false,"title":"x_ty(number, language_tag)","anchor":"x_ty/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Territory","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Territory","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Territory","nodeGroups":[{"name":"Functions","nodes":[{"id":"available_styles/0","deprecated":false,"title":"available_styles()","anchor":"available_styles/0"},{"id":"available_subdivisions/1","deprecated":false,"title":"available_subdivisions(locale \\\\ Cldr.get_locale())","anchor":"available_subdivisions/1"},{"id":"available_territories/1","deprecated":false,"title":"available_territories(locale \\\\ Cldr.get_locale())","anchor":"available_territories/1"},{"id":"children/2","deprecated":false,"title":"children(territory_code, options \\\\ [as: :atom])","anchor":"children/2"},{"id":"children!/2","deprecated":false,"title":"children!(territory_code, options \\\\ [as: :atom])","anchor":"children!/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(parent, child)","anchor":"contains?/2"},{"id":"country_codes/1","deprecated":false,"title":"country_codes(options \\\\ [as: :atom])","anchor":"country_codes/1"},{"id":"from_language_tag/2","deprecated":false,"title":"from_language_tag(language_tag, options \\\\ [])","anchor":"from_language_tag/2"},{"id":"from_language_tag!/2","deprecated":false,"title":"from_language_tag!(language_tag, options \\\\ [])","anchor":"from_language_tag!/2"},{"id":"from_subdivision_code/2","deprecated":false,"title":"from_subdivision_code(subdivision_code, options \\\\ [])","anchor":"from_subdivision_code/2"},{"id":"from_subdivision_code!/2","deprecated":false,"title":"from_subdivision_code!(subdivision_code, options \\\\ [])","anchor":"from_subdivision_code!/2"},{"id":"from_territory_code/2","deprecated":false,"title":"from_territory_code(territory_code, options \\\\ [])","anchor":"from_territory_code/2"},{"id":"from_territory_code!/2","deprecated":false,"title":"from_territory_code!(territory_code, options \\\\ [])","anchor":"from_territory_code!/2"},{"id":"info/1","deprecated":false,"title":"info(territory_code)","anchor":"info/1"},{"id":"info!/1","deprecated":false,"title":"info!(territory_code)","anchor":"info!/1"},{"id":"inverted_subdivisions/1","deprecated":false,"title":"inverted_subdivisions(atom)","anchor":"inverted_subdivisions/1"},{"id":"inverted_territories/1","deprecated":false,"title":"inverted_territories(atom)","anchor":"inverted_territories/1"},{"id":"known_subdivisions/1","deprecated":false,"title":"known_subdivisions(locale \\\\ Cldr.get_locale())","anchor":"known_subdivisions/1"},{"id":"known_territories/1","deprecated":false,"title":"known_territories(locale \\\\ Cldr.get_locale())","anchor":"known_territories/1"},{"id":"known_territory_subdivisions/1","deprecated":false,"title":"known_territory_subdivisions(territory_code)","anchor":"known_territory_subdivisions/1"},{"id":"parent/2","deprecated":false,"title":"parent(territory_code, options \\\\ [as: :atom])","anchor":"parent/2"},{"id":"parent!/2","deprecated":false,"title":"parent!(territory_code, options \\\\ [as: :atom])","anchor":"parent!/2"},{"id":"subdivision_aliases/0","deprecated":false,"title":"subdivision_aliases()","anchor":"subdivision_aliases/0"},{"id":"to_currency_code/2","deprecated":false,"title":"to_currency_code(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_code/2"},{"id":"to_currency_code!/2","deprecated":false,"title":"to_currency_code!(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_code!/2"},{"id":"to_currency_codes/2","deprecated":false,"title":"to_currency_codes(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_codes/2"},{"id":"to_currency_codes!/2","deprecated":false,"title":"to_currency_codes!(territory_code, options \\\\ [as: :atom])","anchor":"to_currency_codes!/2"},{"id":"to_unicode_flag/1","deprecated":false,"title":"to_unicode_flag(territory_code)","anchor":"to_unicode_flag/1"},{"id":"to_unicode_flag!/1","deprecated":false,"title":"to_unicode_flag!(territory_code)","anchor":"to_unicode_flag!/1"},{"id":"translate_language_tag/2","deprecated":false,"title":"translate_language_tag(tag, options \\\\ [])","anchor":"translate_language_tag/2"},{"id":"translate_language_tag!/2","deprecated":false,"title":"translate_language_tag!(locale_from, options \\\\ [])","anchor":"translate_language_tag!/2"},{"id":"translate_subdivision/4","deprecated":false,"title":"translate_subdivision(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_subdivision/4"},{"id":"translate_subdivision!/4","deprecated":false,"title":"translate_subdivision!(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_subdivision!/4"},{"id":"translate_territory/4","deprecated":false,"title":"translate_territory(localized_string, from_locale, to_locale \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_territory/4"},{"id":"translate_territory!/4","deprecated":false,"title":"translate_territory!(localized_string, locale_from, locale_name \\\\ Cldr.get_locale(), style \\\\ :standard)","anchor":"translate_territory!/4"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Time","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Time","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Time","nodeGroups":[{"name":"Functions","nodes":[{"id":"to_string/2","deprecated":false,"title":"to_string(time, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(time, options \\\\ [])","anchor":"to_string!/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Time.Interval","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Time.Interval","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Time.Interval","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_to_string/3","deprecated":false,"title":"do_to_string(from, to, options)","anchor":"do_to_string/3"},{"id":"do_to_string!/3","deprecated":false,"title":"do_to_string!(from, to, options)","anchor":"do_to_string!/3"},{"id":"to_string/3","deprecated":false,"title":"to_string(from, to, options \\\\ [])","anchor":"to_string/3"},{"id":"to_string!/3","deprecated":false,"title":"to_string!(from, to, options \\\\ [])","anchor":"to_string!/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Cldr.Unit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Cldr.Unit","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Cldr.Unit","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/2","deprecated":false,"title":"add(unit_1, unit_2)","anchor":"add/2"},{"id":"add!/2","deprecated":false,"title":"add!(unit_1, unit_2)","anchor":"add!/2"},{"id":"compatible?/2","deprecated":false,"title":"compatible?(unit_1, unit_2)","anchor":"compatible?/2"},{"id":"convert/2","deprecated":false,"title":"convert(unit_1, to_unit)","anchor":"convert/2"},{"id":"convert!/2","deprecated":false,"title":"convert!(unit_1, to_unit)","anchor":"convert!/2"},{"id":"decompose/2","deprecated":false,"title":"decompose(unit, list)","anchor":"decompose/2"},{"id":"default_gender/1","deprecated":false,"title":"default_gender(locale_name)","anchor":"default_gender/1"},{"id":"default_style/0","deprecated":false,"title":"default_style()","anchor":"default_style/0"},{"id":"display_name/2","deprecated":false,"title":"display_name(unit, options \\\\ [])","anchor":"display_name/2"},{"id":"div/2","deprecated":false,"title":"div(unit_1, unit_2)","anchor":"div/2"},{"id":"div!/2","deprecated":false,"title":"div!(unit_1, unit_2)","anchor":"div!/2"},{"id":"grammatical_features/1","deprecated":false,"title":"grammatical_features(locale_name)","anchor":"grammatical_features/1"},{"id":"grammatical_gender/1","deprecated":false,"title":"grammatical_gender(locale_name)","anchor":"grammatical_gender/1"},{"id":"known_styles/0","deprecated":false,"title":"known_styles()","anchor":"known_styles/0"},{"id":"known_unit_categories/0","deprecated":false,"title":"known_unit_categories()","anchor":"known_unit_categories/0"},{"id":"known_units/0","deprecated":false,"title":"known_units()","anchor":"known_units/0"},{"id":"localize/1","deprecated":false,"title":"localize(unit)","anchor":"localize/1"},{"id":"localize/2","deprecated":false,"title":"localize(unit, options \\\\ [])","anchor":"localize/2"},{"id":"measurement_system?/2","deprecated":false,"title":"measurement_system?(unit, systems)","anchor":"measurement_system?/2"},{"id":"measurement_system_for/1","deprecated":true,"title":"measurement_system_for(territory)","anchor":"measurement_system_for/1"},{"id":"measurement_system_for/2","deprecated":true,"title":"measurement_system_for(territory, key)","anchor":"measurement_system_for/2"},{"id":"measurement_system_for_territory/1","deprecated":false,"title":"measurement_system_for_territory(territory)","anchor":"measurement_system_for_territory/1"},{"id":"measurement_system_for_territory/2","deprecated":false,"title":"measurement_system_for_territory(territory, key)","anchor":"measurement_system_for_territory/2"},{"id":"measurement_system_from_locale/1","deprecated":false,"title":"measurement_system_from_locale(locale)","anchor":"measurement_system_from_locale/1"},{"id":"measurement_system_from_locale/2","deprecated":false,"title":"measurement_system_from_locale(locale, category)","anchor":"measurement_system_from_locale/2"},{"id":"measurement_system_from_locale/3","deprecated":false,"title":"measurement_system_from_locale(locale, backend, category)","anchor":"measurement_system_from_locale/3"},{"id":"measurement_systems_for_unit/1","deprecated":false,"title":"measurement_systems_for_unit(unit)","anchor":"measurement_systems_for_unit/1"},{"id":"mult/2","deprecated":false,"title":"mult(unit_1, unit_2)","anchor":"mult/2"},{"id":"mult!/2","deprecated":false,"title":"mult!(unit_1, unit_2)","anchor":"mult!/2"},{"id":"new/2","deprecated":false,"title":"new(unit, value)","anchor":"new/2"},{"id":"new!/2","deprecated":false,"title":"new!(unit, value)","anchor":"new!/2"},{"id":"parse/2","deprecated":false,"title":"parse(unit_string, options \\\\ [])","anchor":"parse/2"},{"id":"parse!/2","deprecated":false,"title":"parse!(unit_string, options \\\\ [])","anchor":"parse!/2"},{"id":"parse_unit_name/2","deprecated":false,"title":"parse_unit_name(unit_name_string, options \\\\ [])","anchor":"parse_unit_name/2"},{"id":"parse_unit_name!/2","deprecated":false,"title":"parse_unit_name!(unit_name_string, options \\\\ [])","anchor":"parse_unit_name!/2"},{"id":"preferred_units/2","deprecated":false,"title":"preferred_units(unit, options \\\\ [])","anchor":"preferred_units/2"},{"id":"preferred_units!/2","deprecated":false,"title":"preferred_units!(unit, options \\\\ [])","anchor":"preferred_units!/2"},{"id":"round/1","deprecated":false,"title":"round(unit)","anchor":"round/1"},{"id":"round/2","deprecated":false,"title":"round(unit, places)","anchor":"round/2"},{"id":"round/3","deprecated":false,"title":"round(unit, places, mode)","anchor":"round/3"},{"id":"styles/0","deprecated":false,"title":"styles()","anchor":"styles/0"},{"id":"sub/2","deprecated":false,"title":"sub(unit_1, unit_2)","anchor":"sub/2"},{"id":"sub!/2","deprecated":false,"title":"sub!(unit_1, unit_2)","anchor":"sub!/2"},{"id":"to_iolist/2","deprecated":false,"title":"to_iolist(number, options \\\\ [])","anchor":"to_iolist/2"},{"id":"to_iolist!/2","deprecated":false,"title":"to_iolist!(number, options \\\\ [])","anchor":"to_iolist!/2"},{"id":"to_string/2","deprecated":false,"title":"to_string(number, options \\\\ [])","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(number, options \\\\ [])","anchor":"to_string!/2"},{"id":"unit_category/1","deprecated":false,"title":"unit_category(unit)","anchor":"unit_category/1"},{"id":"unit_strings_for/1","deprecated":false,"title":"unit_strings_for(locale)","anchor":"unit_strings_for/1"},{"id":"validate_style/1","deprecated":false,"title":"validate_style(unit)","anchor":"validate_style/1"},{"id":"validate_unit/1","deprecated":false,"title":"validate_unit(unit)","anchor":"validate_unit/1"},{"id":"value/1","deprecated":false,"title":"value(unit)","anchor":"value/1"},{"id":"zero/1","deprecated":false,"title":"zero(unit)","anchor":"zero/1"},{"id":"zero?/1","deprecated":false,"title":"zero?(unit)","anchor":"zero?/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext","nodeGroups":[{"name":"Functions","nodes":[{"id":"dgettext/3","deprecated":false,"title":"dgettext(domain, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dgettext/3"},{"id":"dgettext_noop/2","deprecated":false,"title":"dgettext_noop(domain, msgid)","anchor":"dgettext_noop/2"},{"id":"dngettext/5","deprecated":false,"title":"dngettext(domain, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dngettext/5"},{"id":"dngettext_noop/3","deprecated":false,"title":"dngettext_noop(domain, msgid, msgid_plural)","anchor":"dngettext_noop/3"},{"id":"dpgettext/4","deprecated":false,"title":"dpgettext(domain, msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"dpgettext/4"},{"id":"dpgettext_noop/3","deprecated":false,"title":"dpgettext_noop(domain, msgctxt, msgid)","anchor":"dpgettext_noop/3"},{"id":"dpngettext/6","deprecated":false,"title":"dpngettext(domain, msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"dpngettext/6"},{"id":"dpngettext_noop/4","deprecated":false,"title":"dpngettext_noop(domain, msgctxt, msgid, msgid_plural)","anchor":"dpngettext_noop/4"},{"id":"gettext/2","deprecated":false,"title":"gettext(msgid, bindings \\\\ Macro.escape(%{}))","anchor":"gettext/2"},{"id":"gettext_comment/1","deprecated":false,"title":"gettext_comment(comment)","anchor":"gettext_comment/1"},{"id":"gettext_noop/1","deprecated":false,"title":"gettext_noop(msgid)","anchor":"gettext_noop/1"},{"id":"handle_missing_bindings/2","deprecated":false,"title":"handle_missing_bindings(exception, incomplete)","anchor":"handle_missing_bindings/2"},{"id":"handle_missing_plural_translation/7","deprecated":false,"title":"handle_missing_plural_translation(locale, domain, msgctxt, msgid, msgid_plural, n, bindings)","anchor":"handle_missing_plural_translation/7"},{"id":"handle_missing_translation/5","deprecated":false,"title":"handle_missing_translation(locale, domain, msgctxt, msgid, bindings)","anchor":"handle_missing_translation/5"},{"id":"ngettext/4","deprecated":false,"title":"ngettext(msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"ngettext/4"},{"id":"ngettext_noop/2","deprecated":false,"title":"ngettext_noop(msgid, msgid_plural)","anchor":"ngettext_noop/2"},{"id":"pgettext/3","deprecated":false,"title":"pgettext(msgctxt, msgid, bindings \\\\ Macro.escape(%{}))","anchor":"pgettext/3"},{"id":"pgettext_noop/2","deprecated":false,"title":"pgettext_noop(msgid, context)","anchor":"pgettext_noop/2"},{"id":"pngettext/5","deprecated":false,"title":"pngettext(msgctxt, msgid, msgid_plural, n, bindings \\\\ Macro.escape(%{}))","anchor":"pngettext/5"},{"id":"pngettext_noop/3","deprecated":false,"title":"pngettext_noop(msgctxt, msgid, msgid_plural)","anchor":"pngettext_noop/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext.Helpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"l/4","deprecated":false,"title":"l(original_text_or_id, bindings \\\\ [], context \\\\ nil, domain \\\\ nil)","anchor":"l/4"},{"id":"localise_dynamic/2","deprecated":false,"title":"localise_dynamic(msgid, caller_module \\\\ nil)","anchor":"localise_dynamic/2"},{"id":"localise_strings/2","deprecated":false,"title":"localise_strings(strings, caller_module \\\\ nil)","anchor":"localise_strings/2"},{"id":"lp/6","deprecated":false,"title":"lp(original_text_or_id, msgid_plural, n, bindings \\\\ [], context \\\\ nil, domain \\\\ nil)","anchor":"lp/6"}],"key":"functions"}]},{"id":"Bonfire.Common.Localise.Gettext.Plural","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Localise.Gettext.Plural","sections":[],"nested_context":"Bonfire","nested_title":".Common.Localise.Gettext.Plural","nodeGroups":[{"name":"Functions","nodes":[{"id":"nplurals/1","deprecated":false,"title":"nplurals(locale_name)","anchor":"nplurals/1"},{"id":"plural/2","deprecated":false,"title":"plural(locale, n)","anchor":"plural/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Media","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Media","sections":[],"nested_context":"Bonfire","nested_title":".Common.Media","nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar_fallback/1","deprecated":false,"title":"avatar_fallback(_ \\\\ nil)","anchor":"avatar_fallback/1"},{"id":"avatar_media/1","deprecated":false,"title":"avatar_media(maybe_media)","anchor":"avatar_media/1"},{"id":"avatar_url/1","deprecated":false,"title":"avatar_url(media)","anchor":"avatar_url/1"},{"id":"banner_fallback/0","deprecated":false,"title":"banner_fallback()","anchor":"banner_fallback/0"},{"id":"banner_url/1","deprecated":false,"title":"banner_url(media)","anchor":"banner_url/1"},{"id":"extract_tar/2","deprecated":false,"title":"extract_tar(archive, opts \\\\ [:compressed, :memory])","anchor":"extract_tar/2"},{"id":"image_url/1","deprecated":false,"title":"image_url(url)","anchor":"image_url/1"},{"id":"maybe_dominant_color/4","deprecated":false,"title":"maybe_dominant_color(user, avatar_url \\\\ nil, banner_url \\\\ nil, banner_fallback \\\\ nil)","anchor":"maybe_dominant_color/4"},{"id":"media_url/1","deprecated":false,"title":"media_url(media)","anchor":"media_url/1"},{"id":"read_tar_files/3","deprecated":false,"title":"read_tar_files(archive, file_or_files, opts \\\\ [:compressed, :verbose])","anchor":"read_tar_files/3"},{"id":"thumbnail_url/1","deprecated":false,"title":"thumbnail_url(media)","anchor":"thumbnail_url/1"}],"key":"functions"}]},{"id":"Bonfire.Common.MemoryMonitor","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.MemoryMonitor","sections":[],"nested_context":"Bonfire","nested_title":".Common.MemoryMonitor","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"get_memory_usage/2","deprecated":false,"title":"get_memory_usage(name, pid \\\\ self())","anchor":"get_memory_usage/2"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(msg, state)","anchor":"handle_info/2"},{"id":"start_link/2","deprecated":false,"title":"start_link(name, pid_to_monitor \\\\ self())","anchor":"start_link/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Modularity.DeclareHelpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Modularity.DeclareHelpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Modularity.DeclareHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"app/1","deprecated":false,"title":"app(module)","anchor":"app/1"},{"id":"declare_extension/2","deprecated":false,"title":"declare_extension(name, opts \\\\ [])","anchor":"declare_extension/2"},{"id":"generate_link/3","deprecated":false,"title":"generate_link(name, module, opts)","anchor":"generate_link/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Module.Override","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Module.Override","sections":[],"nested_context":"Bonfire","nested_title":".Common.Module.Override","nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/2","deprecated":false,"title":"clone(old_module, new_module)","anchor":"clone/2"},{"id":"clone_original/2","deprecated":false,"title":"clone_original(old_module, prefix \\\\ nil)","anchor":"clone_original/2"},{"id":"module_name_atom/1","deprecated":false,"title":"module_name_atom(module)","anchor":"module_name_atom/1"},{"id":"module_name_string/1","deprecated":false,"title":"module_name_string(module)","anchor":"module_name_string/1"},{"id":"module_original_name_atom/2","deprecated":false,"title":"module_original_name_atom(module, prefix \\\\ nil)","anchor":"module_original_name_atom/2"},{"id":"module_original_name_str/2","deprecated":false,"title":"module_original_name_str(module, prefix \\\\ nil)","anchor":"module_original_name_str/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles","nodeGroups":[{"name":"Functions","nodes":[{"id":"dataloader/1","deprecated":false,"title":"dataloader(context)","anchor":"dataloader/1"},{"id":"exists?/2","deprecated":false,"title":"exists?(filters, opts \\\\ [])","anchor":"exists?/2"},{"id":"filter_one/1","deprecated":false,"title":"filter_one(filters)","anchor":"filter_one/1"},{"id":"filters/3","deprecated":false,"title":"filters(schema, id_filters, opts \\\\ [])","anchor":"filters/3"},{"id":"follow!/2","deprecated":false,"title":"follow!(pointer_or_pointers, opts \\\\ [])","anchor":"follow!/2"},{"id":"follow_function_error/2","deprecated":false,"title":"follow_function_error(error, args)","anchor":"follow_function_error/2"},{"id":"forge!/1","deprecated":false,"title":"forge!(pointed)","anchor":"forge!/1"},{"id":"forge!/2","deprecated":false,"title":"forge!(table_id, id)","anchor":"forge!/2"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get!/2","deprecated":false,"title":"get!(id, opts \\\\ [])","anchor":"get!/2"},{"id":"id_binary/1","deprecated":false,"title":"id_binary(id)","anchor":"id_binary/1"},{"id":"id_filter/2","deprecated":false,"title":"id_filter(query, id)","anchor":"id_filter/2"},{"id":"list!/2","deprecated":false,"title":"list!(pointers, opts \\\\ [])","anchor":"list!/2"},{"id":"list_by_type!/3","deprecated":false,"title":"list_by_type!(table_id_or_schema, filters \\\\ [], opts \\\\ [])","anchor":"list_by_type!/3"},{"id":"list_ids/0","deprecated":false,"title":"list_ids()","anchor":"list_ids/0"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"many!/2","deprecated":false,"title":"many!(filters \\\\ [], opts \\\\ [])","anchor":"many!/2"},{"id":"maybe_forge/1","deprecated":false,"title":"maybe_forge(thing)","anchor":"maybe_forge/1"},{"id":"maybe_forge!/1","deprecated":false,"title":"maybe_forge!(thing)","anchor":"maybe_forge!/1"},{"id":"maybe_resolve/4","deprecated":false,"title":"maybe_resolve(parent, field, args, context)","anchor":"maybe_resolve/4"},{"id":"one/2","deprecated":false,"title":"one(id, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(filters, opts \\\\ [])","anchor":"one!/2"},{"id":"pointer_preloads/2","deprecated":false,"title":"pointer_preloads(query, preloads)","anchor":"pointer_preloads/2"},{"id":"pointer_query/2","deprecated":false,"title":"pointer_query(q, opts)","anchor":"pointer_query/2"},{"id":"preload!/2","deprecated":false,"title":"preload!(pointer_or_pointers, opts \\\\ [])","anchor":"preload!/2"},{"id":"query/3","deprecated":false,"title":"query(schema, filters, opts \\\\ [])","anchor":"query/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Pointers.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Pointers.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Pointers.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters \\\\ Pointer)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"},{"id":"query_incl_deleted/0","deprecated":false,"title":"query_incl_deleted()","anchor":"query_incl_deleted/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Preload","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Preload","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Preload","nodeGroups":[{"name":"Functions","nodes":[{"id":"access_key/2","deprecated":false,"title":"access_key(key, default_val \\\\ nil)","anchor":"access_key/2"},{"id":"custom_access_key_fun/3","deprecated":false,"title":"custom_access_key_fun(key, fun \\\\ &preload_next_in/1, default_val \\\\ nil)","anchor":"custom_access_key_fun/3"},{"id":"maybe_preload_nested_pointers/3","deprecated":false,"title":"maybe_preload_nested_pointers(object, keys, opts \\\\ [])","anchor":"maybe_preload_nested_pointers/3"},{"id":"maybe_preload_pointer/2","deprecated":false,"title":"maybe_preload_pointer(pointer, opts \\\\ [])","anchor":"maybe_preload_pointer/2"},{"id":"maybe_preload_pointers/3","deprecated":false,"title":"maybe_preload_pointers(object, keys, opts \\\\ [])","anchor":"maybe_preload_pointers/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Tables","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Tables","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Tables","nodeGroups":[{"name":"Functions","nodes":[{"id":"list_ids/0","deprecated":false,"title":"list_ids()","anchor":"list_ids/0"},{"id":"list_schemas/0","deprecated":false,"title":"list_schemas()","anchor":"list_schemas/0"},{"id":"list_tables/1","deprecated":false,"title":"list_tables(source \\\\ :code)","anchor":"list_tables/1"},{"id":"list_tables_debug/0","deprecated":false,"title":"list_tables_debug()","anchor":"list_tables_debug/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(id)","anchor":"one/1"},{"id":"one!/1","deprecated":false,"title":"one!(filters)","anchor":"one!/1"},{"id":"schema_or_table!/1","deprecated":false,"title":"schema_or_table!(schema_or_tablename_or_id)","anchor":"schema_or_table!/1"},{"id":"table!/1","deprecated":false,"title":"table!(schema_or_tablename_or_id)","anchor":"table!/1"},{"id":"table_fields/1","deprecated":false,"title":"table_fields(schema)","anchor":"table_fields/1"},{"id":"table_fields_meta/1","deprecated":false,"title":"table_fields_meta(schema)","anchor":"table_fields_meta/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Needles.Tables.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Needles.Tables.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Common.Needles.Tables.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Opts","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Opts","sections":[],"nested_context":"Bonfire","nested_title":".Common.Opts","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_from_opts/3","deprecated":false,"title":"maybe_from_opts(opts, key, fallback \\\\ nil)","anchor":"maybe_from_opts/3"},{"id":"to_options/1","deprecated":false,"title":"to_options(user_or_socket_or_opts)","anchor":"to_options/1"}],"key":"functions"}]},{"id":"Bonfire.Common.PubSub","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.PubSub","sections":[],"nested_context":"Bonfire","nested_title":".Common.PubSub","nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/2","deprecated":false,"title":"broadcast(topics, payload)","anchor":"broadcast/2"},{"id":"broadcast_with_telemetry/2","deprecated":false,"title":"broadcast_with_telemetry(topic, message)","anchor":"broadcast_with_telemetry/2"},{"id":"broadcast_with_telemetry/3","deprecated":false,"title":"broadcast_with_telemetry(topic, message, source)","anchor":"broadcast_with_telemetry/3"},{"id":"current_function/1","deprecated":false,"title":"current_function(env)","anchor":"current_function/1"},{"id":"subscribe/2","deprecated":false,"title":"subscribe(topics, socket)","anchor":"subscribe/2"}],"key":"functions"}]},{"id":"Bonfire.Common.PubSub.Event","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.PubSub.Event","sections":[],"nested_context":"Bonfire","nested_title":".Common.PubSub.Event"},{"id":"Bonfire.Common.QueryModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.QueryModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.QueryModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"apply_error/2","deprecated":false,"title":"apply_error(error, args)","anchor":"apply_error/2"},{"id":"linked_context_modules/0","deprecated":false,"title":"linked_context_modules()","anchor":"linked_context_modules/0"},{"id":"linked_schema_modules/0","deprecated":false,"title":"linked_schema_modules()","anchor":"linked_schema_modules/0"},{"id":"maybe_query/3","deprecated":false,"title":"maybe_query(schema, filters \\\\ [], fallback_fun \\\\ &apply_error/2)","anchor":"maybe_query/3"},{"id":"maybe_query_module/1","deprecated":false,"title":"maybe_query_module(query)","anchor":"maybe_query_module/1"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"},{"id":"query_function_error/3","deprecated":false,"title":"query_function_error(error, args, level \\\\ :info)","anchor":"query_function_error/3"},{"id":"query_module/1","deprecated":false,"title":"query_module(query)","anchor":"query_module/1"},{"id":"query_module!/1","deprecated":false,"title":"query_module!(query)","anchor":"query_module!/1"},{"id":"query_modules/1","deprecated":false,"title":"query_modules(modules)","anchor":"query_modules/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo","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":"default_repo_opts/0","deprecated":false,"title":"default_repo_opts()","anchor":"default_repo_opts/0"},{"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":"delete_many/1","deprecated":false,"title":"delete_many(query)","anchor":"delete_many/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":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"fetch/2","deprecated":false,"title":"fetch(queryable, id)","anchor":"fetch/2"},{"id":"fetch_all/2","deprecated":false,"title":"fetch_all(queryable, id_or_ids)","anchor":"fetch_all/2"},{"id":"fetch_by/2","deprecated":false,"title":"fetch_by(queryable, term)","anchor":"fetch_by/2"},{"id":"find/3","deprecated":false,"title":"find(q, changeset, field \\\\ :form)","anchor":"find/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_all_or_ignore/2","deprecated":false,"title":"insert_all_or_ignore(schema, data)","anchor":"insert_all_or_ignore/2"},{"id":"insert_or_ignore/1","deprecated":false,"title":"insert_or_ignore(cs_or_struct)","anchor":"insert_or_ignore/1"},{"id":"insert_or_ignore/2","deprecated":false,"title":"insert_or_ignore(schema, object)","anchor":"insert_or_ignore/2"},{"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":"make_subquery/1","deprecated":false,"title":"make_subquery(query)","anchor":"make_subquery/1"},{"id":"many/2","deprecated":false,"title":"many(query, opts \\\\ [])","anchor":"many/2"},{"id":"many_paginated/3","deprecated":false,"title":"many_paginated(queryable, opts \\\\ [], repo_opts \\\\ default_repo_opts())","anchor":"many_paginated/3"},{"id":"maybe_one/2","deprecated":false,"title":"maybe_one(q, fallback \\\\ nil)","anchor":"maybe_one/2"},{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_where_ilike/5","deprecated":false,"title":"maybe_where_ilike(query, field, user_query, system_prefix \\\\ \"\", system_suffix \\\\ \"\")","anchor":"maybe_where_ilike/5"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"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":"pluck/3","deprecated":false,"title":"pluck(query, fields, opts \\\\ [])","anchor":"pluck/3"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(obj, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(obj, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put/1","deprecated":false,"title":"put(changeset)","anchor":"put/1"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"put_many/1","deprecated":false,"title":"put_many(things)","anchor":"put_many/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":"single/1","deprecated":false,"title":"single(q)","anchor":"single/1"},{"id":"sql/3","deprecated":false,"title":"sql(raw_sql, data \\\\ [], opts \\\\ [])","anchor":"sql/3"},{"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":"trace/1","deprecated":false,"title":"trace(fun)","anchor":"trace/1"},{"id":"transact_many/1","deprecated":false,"title":"transact_many(queries)","anchor":"transact_many/1"},{"id":"transact_with/2","deprecated":false,"title":"transact_with(fun, opts \\\\ [])","anchor":"transact_with/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"},{"id":"upsert/3","deprecated":false,"title":"upsert(cs, keys_or_attrs_to_update \\\\ nil, conflict_target \\\\ [:id])","anchor":"upsert/3"},{"id":"upsert_all/3","deprecated":false,"title":"upsert_all(schema, data, conflict_target \\\\ [:id])","anchor":"upsert_all/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Delete","nodeGroups":[{"name":"Functions","nodes":[{"id":"deletion_result/1","deprecated":false,"title":"deletion_result(other)","anchor":"deletion_result/1"},{"id":"deletion_result!/1","deprecated":false,"title":"deletion_result!(arg)","anchor":"deletion_result!/1"},{"id":"hard_delete/1","deprecated":false,"title":"hard_delete(it)","anchor":"hard_delete/1"},{"id":"hard_delete!/1","deprecated":false,"title":"hard_delete!(it)","anchor":"hard_delete!/1"},{"id":"maybe_allow_delete?/2","deprecated":false,"title":"maybe_allow_delete?(user, context)","anchor":"maybe_allow_delete?/2"},{"id":"schema/1","deprecated":false,"title":"schema(it)","anchor":"schema/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(it)","anchor":"soft_delete/1"},{"id":"soft_delete!/1","deprecated":false,"title":"soft_delete!(it)","anchor":"soft_delete!/1"},{"id":"soft_delete_changeset/4","deprecated":false,"title":"soft_delete_changeset(it, column \\\\ :deleted_at, value \\\\ DateTime.utc_now(), error \\\\ \"was already deleted\")","anchor":"soft_delete_changeset/4"},{"id":"undelete/1","deprecated":false,"title":"undelete(it)","anchor":"undelete/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Filter","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Filter","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Filter","nodeGroups":[{"name":"Functions","nodes":[{"id":"query_filter/4","deprecated":false,"title":"query_filter(module_or_query, filters, order_by_prop \\\\ :id, order_direction \\\\ :desc)","anchor":"query_filter/4"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Preload","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Preload","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Preload","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_preloads_per_nested_schema/4","deprecated":false,"title":"maybe_preloads_per_nested_schema(objects, path, preloads, opts \\\\ [])","anchor":"maybe_preloads_per_nested_schema/4"},{"id":"maybe_preloads_per_schema/3","deprecated":false,"title":"maybe_preloads_per_schema(object, schema_preloads, opts \\\\ [])","anchor":"maybe_preloads_per_schema/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(structure, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(structure, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"schema_mixins/1","deprecated":false,"title":"schema_mixins(structure)","anchor":"schema_mixins/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Repo.Utils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Repo.Utils","sections":[],"nested_context":"Bonfire","nested_title":".Common.Repo.Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"change_disabled/1","deprecated":false,"title":"change_disabled(changeset)","anchor":"change_disabled/1"},{"id":"change_muted/1","deprecated":false,"title":"change_muted(changeset)","anchor":"change_muted/1"},{"id":"change_public/1","deprecated":false,"title":"change_public(changeset)","anchor":"change_public/1"},{"id":"change_synced_timestamp/3","deprecated":false,"title":"change_synced_timestamp(changeset, bool_field, timestamp_field)","anchor":"change_synced_timestamp/3"},{"id":"change_synced_timestamps/5","deprecated":false,"title":"change_synced_timestamps(changeset, bool_field, on_field, off_field, default \\\\ true)","anchor":"change_synced_timestamps/5"},{"id":"match_admin/0","deprecated":false,"title":"match_admin()","anchor":"match_admin/0"},{"id":"validate_email/2","deprecated":false,"title":"validate_email(changeset, field)","anchor":"validate_email/2"},{"id":"validate_email_domain/2","deprecated":false,"title":"validate_email_domain(changeset, field)","anchor":"validate_email_domain/2"},{"id":"validate_exactly_one/3","deprecated":false,"title":"validate_exactly_one(changeset, columns, message)","anchor":"validate_exactly_one/3"},{"id":"validate_http_url/2","deprecated":false,"title":"validate_http_url(changeset, field)","anchor":"validate_http_url/2"},{"id":"validate_not_expired/4","deprecated":false,"title":"validate_not_expired(cs, now \\\\ DateTime.utc_now(), column \\\\ :expires_at, message \\\\ \"expired\")","anchor":"validate_not_expired/4"}],"key":"functions"}]},{"id":"Bonfire.Common.RepoTemplate","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.RepoTemplate","sections":[],"nested_context":"Bonfire","nested_title":".Common.RepoTemplate"},{"id":"Bonfire.Common.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"skip_test_tags/1","deprecated":false,"title":"skip_test_tags(extras \\\\ [])","anchor":"skip_test_tags/1"},{"id":"test_formatters/0","deprecated":false,"title":"test_formatters()","anchor":"test_formatters/0"},{"id":"test_formatters/1","deprecated":false,"title":"test_formatters(extra)","anchor":"test_formatters/1"}],"key":"functions"}]},{"id":"Bonfire.Common.SchemaModule","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.SchemaModule","sections":[],"nested_context":"Bonfire","nested_title":".Common.SchemaModule","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"c:context_module/0"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"c:query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"c:schema_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"linked_context_modules/0","deprecated":false,"title":"linked_context_modules()","anchor":"linked_context_modules/0"},{"id":"linked_query_modules/0","deprecated":false,"title":"linked_query_modules()","anchor":"linked_query_modules/0"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_get_in/2","deprecated":false,"title":"do_get_in(result, keys_tree)","anchor":"do_get_in/2"},{"id":"get/3","deprecated":false,"title":"get(key, default \\\\ nil, opts \\\\ [])","anchor":"get/3"},{"id":"get!/2","deprecated":false,"title":"get!(key, opts \\\\ [])","anchor":"get!/2"},{"id":"get_for_process/1","deprecated":false,"title":"get_for_process(keys)","anchor":"get_for_process/1"},{"id":"get_settings/4","deprecated":false,"title":"get_settings(keys, default, otp_app, opts)","anchor":"get_settings/4"},{"id":"load_instance_settings/0","deprecated":false,"title":"load_instance_settings()","anchor":"load_instance_settings/0"},{"id":"put/3","deprecated":false,"title":"put(keys, value, opts \\\\ [])","anchor":"put/3"},{"id":"reset_all/0","deprecated":false,"title":"reset_all()","anchor":"reset_all/0"},{"id":"reset_instance/0","deprecated":false,"title":"reset_instance()","anchor":"reset_instance/0"},{"id":"set/2","deprecated":false,"title":"set(attrs, opts \\\\ [])","anchor":"set/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"input_name/1","deprecated":false,"title":"input_name(keys)","anchor":"input_name/1"},{"id":"maybe_assign_input_value_from_keys/1","deprecated":false,"title":"maybe_assign_input_value_from_keys(assigns)","anchor":"maybe_assign_input_value_from_keys/1"},{"id":"scoped/2","deprecated":false,"title":"scoped(scope, context)","anchor":"scoped/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Common.Settings.LoadInstanceConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Settings.LoadInstanceConfig","sections":[],"nested_context":"Bonfire","nested_title":".Common.Settings.LoadInstanceConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"load_config/0","deprecated":false,"title":"load_config()","anchor":"load_config/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Simulation","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Simulation","sections":[],"nested_context":"Bonfire","nested_title":".Common.Simulation","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_url_base/0","deprecated":false,"title":"ap_url_base()","anchor":"ap_url_base/0"},{"id":"base64/0","deprecated":false,"title":"base64()","anchor":"base64/0"},{"id":"bool/0","deprecated":false,"title":"bool()","anchor":"bool/0"},{"id":"canonical_url/0","deprecated":false,"title":"canonical_url()","anchor":"canonical_url/0"},{"id":"content_type/0","deprecated":false,"title":"content_type()","anchor":"content_type/0"},{"id":"content_url/0","deprecated":false,"title":"content_url()","anchor":"content_url/0"},{"id":"date_of_birth/0","deprecated":false,"title":"date_of_birth()","anchor":"date_of_birth/0"},{"id":"domain/0","deprecated":false,"title":"domain()","anchor":"domain/0"},{"id":"email/0","deprecated":false,"title":"email()","anchor":"email/0"},{"id":"email_user/0","deprecated":false,"title":"email_user()","anchor":"email_user/0"},{"id":"falsehood/0","deprecated":false,"title":"falsehood()","anchor":"falsehood/0"},{"id":"float/0","deprecated":false,"title":"float()","anchor":"float/0"},{"id":"future_date/0","deprecated":false,"title":"future_date()","anchor":"future_date/0"},{"id":"future_datetime/0","deprecated":false,"title":"future_datetime()","anchor":"future_datetime/0"},{"id":"future_datetime_iso/0","deprecated":false,"title":"future_datetime_iso()","anchor":"future_datetime_iso/0"},{"id":"icon/0","deprecated":false,"title":"icon()","anchor":"icon/0"},{"id":"image/0","deprecated":false,"title":"image()","anchor":"image/0"},{"id":"integer/0","deprecated":false,"title":"integer()","anchor":"integer/0"},{"id":"license/0","deprecated":false,"title":"license()","anchor":"license/0"},{"id":"location/0","deprecated":false,"title":"location()","anchor":"location/0"},{"id":"long_count/0","deprecated":false,"title":"long_count()","anchor":"long_count/0"},{"id":"long_list/1","deprecated":false,"title":"long_list(gen)","anchor":"long_list/1"},{"id":"markdown/0","deprecated":false,"title":"markdown()","anchor":"markdown/0"},{"id":"maybe_bool/0","deprecated":false,"title":"maybe_bool()","anchor":"maybe_bool/0"},{"id":"maybe_one_of/1","deprecated":false,"title":"maybe_one_of(list)","anchor":"maybe_one_of/1"},{"id":"med_count/0","deprecated":false,"title":"med_count()","anchor":"med_count/0"},{"id":"med_list/1","deprecated":false,"title":"med_list(gen)","anchor":"med_list/1"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"name/0"},{"id":"neg_integer/0","deprecated":false,"title":"neg_integer()","anchor":"neg_integer/0"},{"id":"one_of/1","deprecated":false,"title":"one_of(gens)","anchor":"one_of/1"},{"id":"paragraph/0","deprecated":false,"title":"paragraph()","anchor":"paragraph/0"},{"id":"password/0","deprecated":false,"title":"password()","anchor":"password/0"},{"id":"past_date/0","deprecated":false,"title":"past_date()","anchor":"past_date/0"},{"id":"past_datetime/0","deprecated":false,"title":"past_datetime()","anchor":"past_datetime/0"},{"id":"past_datetime_iso/0","deprecated":false,"title":"past_datetime_iso()","anchor":"past_datetime_iso/0"},{"id":"path/0","deprecated":false,"title":"path()","anchor":"path/0"},{"id":"pos_integer/0","deprecated":false,"title":"pos_integer()","anchor":"pos_integer/0"},{"id":"preferred_username/0","deprecated":false,"title":"preferred_username()","anchor":"preferred_username/0"},{"id":"short_count/0","deprecated":false,"title":"short_count()","anchor":"short_count/0"},{"id":"short_list/1","deprecated":false,"title":"short_list(gen)","anchor":"short_list/1"},{"id":"signing_key/0","deprecated":false,"title":"signing_key()","anchor":"signing_key/0"},{"id":"some/2","deprecated":false,"title":"some(count_or_range \\\\ 1, fun)","anchor":"some/2"},{"id":"summary/0","deprecated":false,"title":"summary()","anchor":"summary/0"},{"id":"title/0","deprecated":false,"title":"title()","anchor":"title/0"},{"id":"truth/0","deprecated":false,"title":"truth()","anchor":"truth/0"},{"id":"uid/1","deprecated":false,"title":"uid(schema \\\\ nil)","anchor":"uid/1"},{"id":"ulid/0","deprecated":false,"title":"ulid()","anchor":"ulid/0"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"url/0"},{"id":"username/0","deprecated":false,"title":"username()","anchor":"username/0"},{"id":"uuid/0","deprecated":false,"title":"uuid()","anchor":"uuid/0"},{"id":"verb/0","deprecated":false,"title":"verb()","anchor":"verb/0"},{"id":"website/0","deprecated":false,"title":"website()","anchor":"website/0"}],"key":"functions"}]},{"id":"Bonfire.Common.StartupTimer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.StartupTimer","sections":[],"nested_context":"Bonfire","nested_title":".Common.StartupTimer","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(application \\\\ :bonfire)","anchor":"run/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"run_all_tests/1","deprecated":false,"title":"run_all_tests(args)","anchor":"run_all_tests/1"},{"id":"run_failed_tests/1","deprecated":false,"title":"run_failed_tests(args)","anchor":"run_failed_tests/1"},{"id":"run_stale_tests/1","deprecated":false,"title":"run_stale_tests(args)","anchor":"run_stale_tests/1"},{"id":"setup_test_repo/1","deprecated":false,"title":"setup_test_repo(tags)","anchor":"setup_test_repo/1"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"unlock/0","deprecated":false,"title":"unlock()","anchor":"unlock/0"},{"id":"unwatch_tests/0","deprecated":false,"title":"unwatch_tests()","anchor":"unwatch_tests/0"},{"id":"watch_tests/1","deprecated":false,"title":"watch_tests(args)","anchor":"watch_tests/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive.Helpers","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"f/1","deprecated":false,"title":"f(args \\\\ nil)","anchor":"f/1"},{"id":"ready/0","deprecated":false,"title":"ready()","anchor":"ready/0"},{"id":"s/1","deprecated":false,"title":"s(args \\\\ nil)","anchor":"s/1"},{"id":"ta/1","deprecated":false,"title":"ta(args \\\\ nil)","anchor":"ta/1"},{"id":"uw/0","deprecated":false,"title":"uw()","anchor":"uw/0"},{"id":"w/1","deprecated":false,"title":"w(args \\\\ nil)","anchor":"w/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Test.Interactive.Observer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Test.Interactive.Observer","sections":[],"nested_context":"Bonfire","nested_title":".Common.Test.Interactive.Observer","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Bonfire.Common.TestInstanceRepo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.TestInstanceRepo","sections":[],"nested_context":"Bonfire","nested_title":".Common.TestInstanceRepo","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":"apply/1","deprecated":false,"title":"apply(fun)","anchor":"apply/1"},{"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_endpoint/0","deprecated":false,"title":"default_endpoint()","anchor":"default_endpoint/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"default_repo/0","deprecated":false,"title":"default_repo()","anchor":"default_repo/0"},{"id":"default_repo_opts/0","deprecated":false,"title":"default_repo_opts()","anchor":"default_repo_opts/0"},{"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":"delete_many/1","deprecated":false,"title":"delete_many(query)","anchor":"delete_many/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":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"fetch/2","deprecated":false,"title":"fetch(queryable, id)","anchor":"fetch/2"},{"id":"fetch_all/2","deprecated":false,"title":"fetch_all(queryable, id_or_ids)","anchor":"fetch_all/2"},{"id":"fetch_by/2","deprecated":false,"title":"fetch_by(queryable, term)","anchor":"fetch_by/2"},{"id":"find/3","deprecated":false,"title":"find(q, changeset, field \\\\ :form)","anchor":"find/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_all_or_ignore/2","deprecated":false,"title":"insert_all_or_ignore(schema, data)","anchor":"insert_all_or_ignore/2"},{"id":"insert_or_ignore/1","deprecated":false,"title":"insert_or_ignore(cs_or_struct)","anchor":"insert_or_ignore/1"},{"id":"insert_or_ignore/2","deprecated":false,"title":"insert_or_ignore(schema, object)","anchor":"insert_or_ignore/2"},{"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":"make_subquery/1","deprecated":false,"title":"make_subquery(query)","anchor":"make_subquery/1"},{"id":"many/2","deprecated":false,"title":"many(query, opts \\\\ [])","anchor":"many/2"},{"id":"many_paginated/3","deprecated":false,"title":"many_paginated(queryable, opts \\\\ [], repo_opts \\\\ default_repo_opts())","anchor":"many_paginated/3"},{"id":"maybe_declare_test_instance/1","deprecated":false,"title":"maybe_declare_test_instance(v)","anchor":"maybe_declare_test_instance/1"},{"id":"maybe_one/2","deprecated":false,"title":"maybe_one(q, fallback \\\\ nil)","anchor":"maybe_one/2"},{"id":"maybe_preload/3","deprecated":false,"title":"maybe_preload(obj, preloads, opts \\\\ [])","anchor":"maybe_preload/3"},{"id":"maybe_where_ilike/5","deprecated":false,"title":"maybe_where_ilike(query, field, user_query, system_prefix \\\\ \"\", system_suffix \\\\ \"\")","anchor":"maybe_where_ilike/5"},{"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":"pluck/3","deprecated":false,"title":"pluck(query, fields, opts \\\\ [])","anchor":"pluck/3"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"preload_all/2","deprecated":false,"title":"preload_all(obj, opts \\\\ [])","anchor":"preload_all/2"},{"id":"preload_mixins/2","deprecated":false,"title":"preload_mixins(obj, opts \\\\ [])","anchor":"preload_mixins/2"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"process_put/1","deprecated":false,"title":"process_put(enum)","anchor":"process_put/1"},{"id":"put/1","deprecated":false,"title":"put(changeset)","anchor":"put/1"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"put_many/1","deprecated":false,"title":"put_many(things)","anchor":"put_many/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":"single/1","deprecated":false,"title":"single(q)","anchor":"single/1"},{"id":"sql/3","deprecated":false,"title":"sql(raw_sql, data \\\\ [], opts \\\\ [])","anchor":"sql/3"},{"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":"trace/1","deprecated":false,"title":"trace(fun)","anchor":"trace/1"},{"id":"transact_many/1","deprecated":false,"title":"transact_many(queries)","anchor":"transact_many/1"},{"id":"transact_with/2","deprecated":false,"title":"transact_with(fun, opts \\\\ [])","anchor":"transact_with/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"},{"id":"upsert/3","deprecated":false,"title":"upsert(cs, keys_or_attrs_to_update \\\\ nil, conflict_target \\\\ [:id])","anchor":"upsert/3"},{"id":"upsert_all/3","deprecated":false,"title":"upsert_all(schema, data, conflict_target \\\\ [:id])","anchor":"upsert_all/3"}],"key":"functions"}]},{"id":"Bonfire.Common.Text","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Text","sections":[],"nested_context":"Bonfire","nested_title":".Common.Text","nodeGroups":[{"name":"Functions","nodes":[{"id":"blank?/1","deprecated":false,"title":"blank?(str_or_nil)","anchor":"blank?/1"},{"id":"camelise/1","deprecated":false,"title":"camelise(str)","anchor":"camelise/1"},{"id":"code_syntax/2","deprecated":false,"title":"code_syntax(text, filename)","anchor":"code_syntax/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(string, substring)","anchor":"contains?/2"},{"id":"contains_html?/1","deprecated":false,"title":"contains_html?(string)","anchor":"contains_html?/1"},{"id":"hash/2","deprecated":false,"title":"hash(seed, opts \\\\ [])","anchor":"hash/2"},{"id":"list_checkboxes/1","deprecated":false,"title":"list_checkboxes(text)","anchor":"list_checkboxes/1"},{"id":"list_checked_boxes/1","deprecated":false,"title":"list_checked_boxes(text)","anchor":"list_checked_boxes/1"},{"id":"list_unchecked_boxes/1","deprecated":false,"title":"list_unchecked_boxes(text)","anchor":"list_unchecked_boxes/1"},{"id":"make_local_links_live/1","deprecated":false,"title":"make_local_links_live(content)","anchor":"make_local_links_live/1"},{"id":"markdown_checkboxes/1","deprecated":false,"title":"markdown_checkboxes(text)","anchor":"markdown_checkboxes/1"},{"id":"maybe_emote/3","deprecated":false,"title":"maybe_emote(content, user \\\\ nil, custom_emoji \\\\ [])","anchor":"maybe_emote/3"},{"id":"maybe_markdown_to_html/2","deprecated":false,"title":"maybe_markdown_to_html(nothing, opts \\\\ [])","anchor":"maybe_markdown_to_html/2"},{"id":"maybe_normalize_html/1","deprecated":false,"title":"maybe_normalize_html(html_string)","anchor":"maybe_normalize_html/1"},{"id":"maybe_other_custom_emoji/2","deprecated":false,"title":"maybe_other_custom_emoji(text, user)","anchor":"maybe_other_custom_emoji/2"},{"id":"maybe_render_templated/2","deprecated":false,"title":"maybe_render_templated(templated_content, data)","anchor":"maybe_render_templated/2"},{"id":"maybe_sane_html/1","deprecated":false,"title":"maybe_sane_html(content)","anchor":"maybe_sane_html/1"},{"id":"maybe_to_snake/1","deprecated":false,"title":"maybe_to_snake(string)","anchor":"maybe_to_snake/1"},{"id":"normalise_links/2","deprecated":false,"title":"normalise_links(content, format \\\\ :markdown)","anchor":"normalise_links/2"},{"id":"random_string/1","deprecated":false,"title":"random_string(length \\\\ 10)","anchor":"random_string/1"},{"id":"regex_list/2","deprecated":false,"title":"regex_list(regex, text)","anchor":"regex_list/2"},{"id":"sentence_truncate/3","deprecated":false,"title":"sentence_truncate(input, length \\\\ 250, add_to_end \\\\ \"\")","anchor":"sentence_truncate/3"},{"id":"slug/1","deprecated":false,"title":"slug(text)","anchor":"slug/1"},{"id":"split_lines/1","deprecated":false,"title":"split_lines(string)","anchor":"split_lines/1"},{"id":"strlen/1","deprecated":false,"title":"strlen(x)","anchor":"strlen/1"},{"id":"text_only/1","deprecated":false,"title":"text_only(content)","anchor":"text_only/1"},{"id":"truncate/3","deprecated":false,"title":"truncate(text, max_length \\\\ 250, add_to_end \\\\ nil)","anchor":"truncate/3"},{"id":"underscore_truncate/2","deprecated":false,"title":"underscore_truncate(input, length \\\\ 250)","anchor":"underscore_truncate/2"},{"id":"upcase_first/1","deprecated":false,"title":"upcase_first(arg)","anchor":"upcase_first/1"},{"id":"verb_infinitive/1","deprecated":false,"title":"verb_infinitive(verb_conjugated)","anchor":"verb_infinitive/1"}],"key":"functions"}]},{"id":"Bonfire.Common.TextExtended","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.TextExtended","sections":[],"nested_context":"Bonfire","nested_title":".Common.TextExtended","nodeGroups":[{"name":"Functions","nodes":[{"id":"blank?/1","deprecated":false,"title":"blank?(xA)","anchor":"blank?/1"},{"id":"camelise/1","deprecated":false,"title":"camelise(xA)","anchor":"camelise/1"},{"id":"code_syntax/2","deprecated":false,"title":"code_syntax(xA, xB)","anchor":"code_syntax/2"},{"id":"contains?/2","deprecated":false,"title":"contains?(xA, xB)","anchor":"contains?/2"},{"id":"contains_html?/1","deprecated":false,"title":"contains_html?(xA)","anchor":"contains_html?/1"},{"id":"hash/1","deprecated":false,"title":"hash(xA)","anchor":"hash/1"},{"id":"hash/2","deprecated":false,"title":"hash(xA, xB)","anchor":"hash/2"},{"id":"list_checkboxes/1","deprecated":false,"title":"list_checkboxes(xA)","anchor":"list_checkboxes/1"},{"id":"list_checked_boxes/1","deprecated":false,"title":"list_checked_boxes(xA)","anchor":"list_checked_boxes/1"},{"id":"list_unchecked_boxes/1","deprecated":false,"title":"list_unchecked_boxes(xA)","anchor":"list_unchecked_boxes/1"},{"id":"make_local_links_live/1","deprecated":false,"title":"make_local_links_live(xA)","anchor":"make_local_links_live/1"},{"id":"markdown_checkboxes/1","deprecated":false,"title":"markdown_checkboxes(xA)","anchor":"markdown_checkboxes/1"},{"id":"maybe_emote/1","deprecated":false,"title":"maybe_emote(xA)","anchor":"maybe_emote/1"},{"id":"maybe_emote/2","deprecated":false,"title":"maybe_emote(xA, xB)","anchor":"maybe_emote/2"},{"id":"maybe_emote/3","deprecated":false,"title":"maybe_emote(xA, xB, xC)","anchor":"maybe_emote/3"},{"id":"maybe_markdown_to_html/1","deprecated":false,"title":"maybe_markdown_to_html(xA)","anchor":"maybe_markdown_to_html/1"},{"id":"maybe_markdown_to_html/2","deprecated":false,"title":"maybe_markdown_to_html(xA, xB)","anchor":"maybe_markdown_to_html/2"},{"id":"maybe_normalize_html/1","deprecated":false,"title":"maybe_normalize_html(xA)","anchor":"maybe_normalize_html/1"},{"id":"maybe_other_custom_emoji/2","deprecated":false,"title":"maybe_other_custom_emoji(xA, xB)","anchor":"maybe_other_custom_emoji/2"},{"id":"maybe_render_templated/2","deprecated":false,"title":"maybe_render_templated(xA, xB)","anchor":"maybe_render_templated/2"},{"id":"maybe_sane_html/1","deprecated":false,"title":"maybe_sane_html(xA)","anchor":"maybe_sane_html/1"},{"id":"maybe_to_snake/1","deprecated":false,"title":"maybe_to_snake(xA)","anchor":"maybe_to_snake/1"},{"id":"normalise_links/1","deprecated":false,"title":"normalise_links(xA)","anchor":"normalise_links/1"},{"id":"normalise_links/2","deprecated":false,"title":"normalise_links(xA, xB)","anchor":"normalise_links/2"},{"id":"random_string/0","deprecated":false,"title":"random_string()","anchor":"random_string/0"},{"id":"random_string/1","deprecated":false,"title":"random_string(xA)","anchor":"random_string/1"},{"id":"regex_list/2","deprecated":false,"title":"regex_list(xA, xB)","anchor":"regex_list/2"},{"id":"sentence_truncate/1","deprecated":false,"title":"sentence_truncate(xA)","anchor":"sentence_truncate/1"},{"id":"sentence_truncate/2","deprecated":false,"title":"sentence_truncate(xA, xB)","anchor":"sentence_truncate/2"},{"id":"sentence_truncate/3","deprecated":false,"title":"sentence_truncate(xA, xB, xC)","anchor":"sentence_truncate/3"},{"id":"slug/1","deprecated":false,"title":"slug(xA)","anchor":"slug/1"},{"id":"split_lines/1","deprecated":false,"title":"split_lines(xA)","anchor":"split_lines/1"},{"id":"strlen/1","deprecated":false,"title":"strlen(xA)","anchor":"strlen/1"},{"id":"text_only/1","deprecated":false,"title":"text_only(xA)","anchor":"text_only/1"},{"id":"truncate/1","deprecated":false,"title":"truncate(xA)","anchor":"truncate/1"},{"id":"truncate/2","deprecated":false,"title":"truncate(xA, xB)","anchor":"truncate/2"},{"id":"truncate/3","deprecated":false,"title":"truncate(xA, xB, xC)","anchor":"truncate/3"},{"id":"underscore_truncate/1","deprecated":false,"title":"underscore_truncate(xA)","anchor":"underscore_truncate/1"},{"id":"underscore_truncate/2","deprecated":false,"title":"underscore_truncate(xA, xB)","anchor":"underscore_truncate/2"},{"id":"upcase_first/1","deprecated":false,"title":"upcase_first(xA)","anchor":"upcase_first/1"},{"id":"verb_infinitive/1","deprecated":false,"title":"verb_infinitive(xA)","anchor":"verb_infinitive/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Types","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Types","sections":[],"nested_context":"Bonfire","nested_title":".Common.Types","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_object_type_names/0","deprecated":false,"title":"all_object_type_names()","anchor":"all_object_type_names/0"},{"id":"defines_struct?/1","deprecated":false,"title":"defines_struct?(module)","anchor":"defines_struct?/1"},{"id":"is_numeric/1","deprecated":false,"title":"is_numeric(num)","anchor":"is_numeric/1"},{"id":"is_uid?/2","deprecated":false,"title":"is_uid?(str, params \\\\ nil)","anchor":"is_uid?/2"},{"id":"maybe_convert_ulids/1","deprecated":false,"title":"maybe_convert_ulids(list)","anchor":"maybe_convert_ulids/1"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"},{"id":"maybe_to_atom!/1","deprecated":false,"title":"maybe_to_atom!(str)","anchor":"maybe_to_atom!/1"},{"id":"maybe_to_atom_or_module/3","deprecated":false,"title":"maybe_to_atom_or_module(k, force, to_snake)","anchor":"maybe_to_atom_or_module/3"},{"id":"maybe_to_float/2","deprecated":false,"title":"maybe_to_float(val, fallback \\\\ 0)","anchor":"maybe_to_float/2"},{"id":"maybe_to_integer/2","deprecated":false,"title":"maybe_to_integer(val, fallback \\\\ 0)","anchor":"maybe_to_integer/2"},{"id":"maybe_to_module/2","deprecated":false,"title":"maybe_to_module(str, force \\\\ true)","anchor":"maybe_to_module/2"},{"id":"maybe_to_snake_atom/1","deprecated":false,"title":"maybe_to_snake_atom(string)","anchor":"maybe_to_snake_atom/1"},{"id":"maybe_to_string/1","deprecated":false,"title":"maybe_to_string(atom)","anchor":"maybe_to_string/1"},{"id":"module_to_human_readable/1","deprecated":false,"title":"module_to_human_readable(module)","anchor":"module_to_human_readable/1"},{"id":"module_to_str/1","deprecated":false,"title":"module_to_str(str)","anchor":"module_to_str/1"},{"id":"object_type/2","deprecated":false,"title":"object_type(object, opts \\\\ [])","anchor":"object_type/2"},{"id":"object_type_display/1","deprecated":false,"title":"object_type_display(object_type)","anchor":"object_type_display/1"},{"id":"sanitise_name/1","deprecated":false,"title":"sanitise_name(type)","anchor":"sanitise_name/1"},{"id":"table_id/1","deprecated":false,"title":"table_id(schema)","anchor":"table_id/1"},{"id":"table_type/1","deprecated":false,"title":"table_type(type)","anchor":"table_type/1"},{"id":"table_types/1","deprecated":false,"title":"table_types(types)","anchor":"table_types/1"},{"id":"typeof/1","deprecated":false,"title":"typeof(exception)","anchor":"typeof/1"},{"id":"uid/2","deprecated":false,"title":"uid(input, fallback \\\\ nil)","anchor":"uid/2"},{"id":"uid!/1","deprecated":false,"title":"uid!(object)","anchor":"uid!/1"},{"id":"uid_or_uids/1","deprecated":false,"title":"uid_or_uids(objects)","anchor":"uid_or_uids/1"},{"id":"uids/1","deprecated":false,"title":"uids(objects)","anchor":"uids/1"},{"id":"uids_or/2","deprecated":false,"title":"uids_or(objects, fallback_or_fun)","anchor":"uids_or/2"}],"key":"functions"}]},{"id":"Bonfire.Common.URIs","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.URIs","sections":[],"nested_context":"Bonfire","nested_title":".Common.URIs","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_domain/1","deprecated":false,"title":"base_domain(uri_or_endpoint_or_conn \\\\ nil)","anchor":"base_domain/1"},{"id":"base_uri/1","deprecated":false,"title":"base_uri(conn_or_socket \\\\ nil)","anchor":"base_uri/1"},{"id":"base_url/1","deprecated":false,"title":"base_url(conn_or_socket_or_uri \\\\ nil)","anchor":"base_url/1"},{"id":"based_url/2","deprecated":false,"title":"based_url(url, conn \\\\ nil)","anchor":"based_url/2"},{"id":"canonical_url/1","deprecated":false,"title":"canonical_url(object)","anchor":"canonical_url/1"},{"id":"display_url/1","deprecated":false,"title":"display_url(url)","anchor":"display_url/1"},{"id":"fallback/1","deprecated":false,"title":"fallback(args)","anchor":"fallback/1"},{"id":"fallback/2","deprecated":false,"title":"fallback(id, args)","anchor":"fallback/2"},{"id":"fallback/3","deprecated":false,"title":"fallback(id, type, args)","anchor":"fallback/3"},{"id":"is_uri?/1","deprecated":false,"title":"is_uri?(str)","anchor":"is_uri?/1"},{"id":"maybe_generate_canonical_url/1","deprecated":false,"title":"maybe_generate_canonical_url(thing)","anchor":"maybe_generate_canonical_url/1"},{"id":"path/3","deprecated":false,"title":"path(view_module_or_path_name_or_object, args \\\\ [], opts \\\\ [])","anchor":"path/3"},{"id":"path_by_id/4","deprecated":false,"title":"path_by_id(id, args, object, opts)","anchor":"path_by_id/4"},{"id":"remote_canonical_url/1","deprecated":false,"title":"remote_canonical_url(object)","anchor":"remote_canonical_url/1"},{"id":"static_path/2","deprecated":false,"title":"static_path(path, endpoint_module \\\\ Bonfire.Common.Config.endpoint_module())","anchor":"static_path/2"},{"id":"url_path/2","deprecated":false,"title":"url_path(view_module_or_path_name_or_object, args \\\\ [])","anchor":"url_path/2"},{"id":"validate_uri/1","deprecated":false,"title":"validate_uri(str)","anchor":"validate_uri/1"}],"key":"functions"}]},{"id":"Bonfire.Common.Utils","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Common.Utils","sections":[],"nested_context":"Bonfire","nested_title":".Common.Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_error/3","deprecated":false,"title":"apply_error(error, args, opts)","anchor":"apply_error/3"},{"id":"apply_task/3","deprecated":false,"title":"apply_task(function \\\\ :async, fun, opts \\\\ [])","anchor":"apply_task/3"},{"id":"apply_task_supervised/3","deprecated":false,"title":"apply_task_supervised(supervisor, fun, opts \\\\ [])","anchor":"apply_task_supervised/3"},{"id":"current_account/2","deprecated":false,"title":"current_account(current_account_or_socket_or_opts, recursing \\\\ false)","anchor":"current_account/2"},{"id":"current_account_and_or_user_ids/1","deprecated":false,"title":"current_account_and_or_user_ids(assigns)","anchor":"current_account_and_or_user_ids/1"},{"id":"current_account_auth!/2","deprecated":false,"title":"current_account_auth!(context, password)","anchor":"current_account_auth!/2"},{"id":"current_account_id/2","deprecated":false,"title":"current_account_id(current_account_or_socket_or_opts, recursing \\\\ false)","anchor":"current_account_id/2"},{"id":"current_user/2","deprecated":false,"title":"current_user(current_user_or_socket_or_opts, recursing \\\\ false)","anchor":"current_user/2"},{"id":"current_user_auth!/2","deprecated":false,"title":"current_user_auth!(context, password)","anchor":"current_user_auth!/2"},{"id":"current_user_id/2","deprecated":false,"title":"current_user_id(current_user_or_socket_or_opts, recursing \\\\ false)","anchor":"current_user_id/2"},{"id":"current_user_required!/1","deprecated":false,"title":"current_user_required!(context)","anchor":"current_user_required!/1"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"empty?/1","deprecated":false,"title":"empty?(v)","anchor":"empty?/1"},{"id":"maybe/2","deprecated":false,"title":"maybe(val, change_fn)","anchor":"maybe/2"},{"id":"maybe_apply/4","deprecated":false,"title":"maybe_apply(module, fun, args \\\\ [], opts \\\\ [])","anchor":"maybe_apply/4"},{"id":"maybe_apply_fallback/3","deprecated":false,"title":"maybe_apply_fallback(error, args, opts)","anchor":"maybe_apply_fallback/3"},{"id":"maybe_from_opts/3","deprecated":false,"title":"maybe_from_opts(opts, key, fallback \\\\ nil)","anchor":"maybe_from_opts/3"},{"id":"nothing?/1","deprecated":false,"title":"nothing?(v)","anchor":"nothing?/1"},{"id":"ok_unwrap/2","deprecated":false,"title":"ok_unwrap(val, fallback \\\\ nil)","anchor":"ok_unwrap/2"},{"id":"round_nearest/1","deprecated":false,"title":"round_nearest(num)","anchor":"round_nearest/1"},{"id":"round_nearest/2","deprecated":false,"title":"round_nearest(num, target)","anchor":"round_nearest/2"},{"id":"to_options/1","deprecated":false,"title":"to_options(user_or_socket_or_opts)","anchor":"to_options/1"}],"key":"functions"}]},{"id":"Bonfire.Ecto","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto","sections":[{"id":"Introduction","anchor":"module-introduction"}],"nested_context":"Bonfire","nested_title":".Ecto"},{"id":"Bonfire.Ecto.Acts.Begin","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Begin","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Begin","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Commit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Commit","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Commit","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Delete","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_delete/2","deprecated":false,"title":"maybe_delete(objects, repo)","anchor":"maybe_delete/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Ecto.Acts.Work","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Ecto.Acts.Work","sections":[],"nested_context":"Bonfire","nested_title":".Ecto.Acts.Work","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/2","deprecated":false,"title":"add(epic, key)","anchor":"add/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Epics","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics","sections":[{"id":"Key components and concepts:","anchor":"module-key-components-and-concepts"},{"id":"How it works","anchor":"module-how-it-works"},{"id":"1. How to write an Act","anchor":"module-1-how-to-write-an-act"},{"id":"2. How to define an Epic","anchor":"module-2-how-to-define-an-epic"},{"id":"3. How to run an Epic","anchor":"module-3-how-to-run-an-epic"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Epics","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_debug/3","deprecated":false,"title":"maybe_debug(act_or_epic, thing, label \\\\ nil)","anchor":"maybe_debug/3"},{"id":"maybe_debug/4","deprecated":false,"title":"maybe_debug(epic, act, thing, label)","anchor":"maybe_debug/4"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(config_key, type, options \\\\ [])","anchor":"run_epic/3"},{"id":"smart/4","deprecated":false,"title":"smart(epic, act, thing, label \\\\ \"\")","anchor":"smart/4"}],"key":"functions"}]},{"id":"Bonfire.Epics.Act","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Act","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Act","nodeGroups":[{"name":"Types","nodes":[{"id":"ret/0","deprecated":false,"title":"ret()","anchor":"t:ret/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"run/2","deprecated":false,"title":"run(t, t)","anchor":"c:run/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"debug/3","deprecated":false,"title":"debug(act, thing, label \\\\ \"\")","anchor":"debug/3"},{"id":"new/1","deprecated":false,"title":"new(module)","anchor":"new/1"},{"id":"new/2","deprecated":false,"title":"new(module, options)","anchor":"new/2"},{"id":"new/3","deprecated":false,"title":"new(module, options, meta)","anchor":"new/3"}],"key":"functions"}]},{"id":"Bonfire.Epics.Debug","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Debug","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Debug","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_maybe_debug/4","deprecated":false,"title":"do_maybe_debug(epic, act, thing, label)","anchor":"do_maybe_debug/4"},{"id":"opts/2","deprecated":false,"title":"opts(epic, act)","anchor":"opts/2"}],"key":"functions"}]},{"id":"Bonfire.Epics.Epic","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Epic","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Epic","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"add_error/2","deprecated":false,"title":"add_error(epic, error)","anchor":"add_error/2"},{"id":"add_error/5","deprecated":false,"title":"add_error(epic, act, error, source \\\\ nil, stacktrace \\\\ nil)","anchor":"add_error/5"},{"id":"append/2","deprecated":false,"title":"append(self, acts)","anchor":"append/2"},{"id":"assign/3","deprecated":false,"title":"assign(self, name, value)","anchor":"assign/3"},{"id":"debug/3","deprecated":false,"title":"debug(epic, thing, label \\\\ \"\")","anchor":"debug/3"},{"id":"from_config!/2","deprecated":false,"title":"from_config!(config_key, name)","anchor":"from_config!/2"},{"id":"from_spec!/1","deprecated":false,"title":"from_spec!(acts)","anchor":"from_spec!/1"},{"id":"maybe_debug/3","deprecated":false,"title":"maybe_debug(epic, thing, label \\\\ \"\")","anchor":"maybe_debug/3"},{"id":"new/1","deprecated":false,"title":"new(next \\\\ [])","anchor":"new/1"},{"id":"prepend/2","deprecated":false,"title":"prepend(self, acts)","anchor":"prepend/2"},{"id":"render_errors/1","deprecated":false,"title":"render_errors(epic)","anchor":"render_errors/1"},{"id":"run/1","deprecated":false,"title":"run(epic)","anchor":"run/1"},{"id":"update/4","deprecated":false,"title":"update(self, name, default, fun)","anchor":"update/4"}],"key":"functions"}]},{"id":"Bonfire.Epics.Error","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Error","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Error","nodeGroups":[{"name":"Functions","nodes":[{"id":"message/1","deprecated":false,"title":"message(self)","anchor":"message/1"}],"key":"functions"}]},{"id":"Bonfire.Epics.Test","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Epics.Test","sections":[],"nested_context":"Bonfire","nested_title":".Epics.Test","nodeGroups":[{"name":"Functions","nodes":[{"id":"assert_epic_ok/1","deprecated":false,"title":"assert_epic_ok(expr)","anchor":"assert_epic_ok/1"},{"id":"debug_error/1","deprecated":false,"title":"debug_error(epic)","anchor":"debug_error/1"}],"key":"functions"}]},{"id":"Bonfire.Files","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files","sections":[{"id":"Configuration","anchor":"module-configuration"},{"id":"TODO's","anchor":"module-todo-s"}],"nested_context":"Bonfire","nested_title":".Files","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/1","deprecated":false,"title":"ap_publish_activity(medias)","anchor":"ap_publish_activity/1"},{"id":"ap_receive_attachments/2","deprecated":false,"title":"ap_receive_attachments(creator, attachments)","anchor":"ap_receive_attachments/2"},{"id":"data_url/2","deprecated":false,"title":"data_url(content, mime_type)","anchor":"data_url/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"delete_files/3","deprecated":false,"title":"delete_files(module \\\\ nil, media, opts \\\\ [])","anchor":"delete_files/3"},{"id":"extract_metadata/1","deprecated":false,"title":"extract_metadata(path)","anchor":"extract_metadata/1"},{"id":"file_extension/1","deprecated":false,"title":"file_extension(path)","anchor":"file_extension/1"},{"id":"file_extension_only/1","deprecated":false,"title":"file_extension_only(path)","anchor":"file_extension_only/1"},{"id":"full_url/3","deprecated":false,"title":"full_url(module, media, version \\\\ nil)","anchor":"full_url/3"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"local_path/3","deprecated":false,"title":"local_path(module \\\\ nil, media, version \\\\ :default)","anchor":"local_path/3"},{"id":"normalise_size/2","deprecated":false,"title":"normalise_size(size, default \\\\ 8)","anchor":"normalise_size/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"remote_url/3","deprecated":false,"title":"remote_url(module \\\\ nil, media, version \\\\ :default)","anchor":"remote_url/3"},{"id":"upload/5","deprecated":false,"title":"upload(module, creator_or_context, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/5"},{"id":"validate/3","deprecated":false,"title":"validate(other, allowed_media_types, max_file_size)","anchor":"validate/3"}],"key":"functions"}]},{"id":"Bonfire.Files.Acts.AttachMedia","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.AttachMedia","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.AttachMedia","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(changeset, uploaded_media)","anchor":"cast/2"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Acts.Delete","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.Delete"},{"id":"Bonfire.Files.Acts.URLPreviews","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Acts.URLPreviews","sections":[],"nested_context":"Bonfire","nested_title":".Files.Acts.URLPreviews","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_fetch_and_save/3","deprecated":false,"title":"maybe_fetch_and_save(current_user, url, opts \\\\ [])","anchor":"maybe_fetch_and_save/3"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Files.BannerUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.BannerUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.BannerUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_height/0","deprecated":false,"title":"max_height()","anchor":"max_height/0"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.Blurred","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Blurred","sections":[],"nested_context":"Bonfire","nested_title":".Files.Blurred","nodeGroups":[{"name":"Functions","nodes":[{"id":"blurhash/2","deprecated":false,"title":"blurhash(media, opts \\\\ [])","anchor":"blurhash/2"},{"id":"blurhash_cached/1","deprecated":false,"title":"blurhash_cached(arg1)","anchor":"blurhash_cached/1"},{"id":"blurred/2","deprecated":false,"title":"blurred(media_or_path, opts \\\\ [])","anchor":"blurred/2"},{"id":"make_blurhash/1","deprecated":false,"title":"make_blurhash(path)","anchor":"make_blurhash/1"}],"key":"functions"}]},{"id":"Bonfire.Files.CapsuleIntegration.Attacher","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.CapsuleIntegration.Attacher","sections":[],"nested_context":"Bonfire","nested_title":".Files.CapsuleIntegration.Attacher","nodeGroups":[{"name":"Functions","nodes":[{"id":"attach/3","deprecated":false,"title":"attach(upload, changeset, module \\\\ nil)","anchor":"attach/3"},{"id":"storages/2","deprecated":false,"title":"storages(upload, module)","anchor":"storages/2"},{"id":"store/3","deprecated":false,"title":"store(module, upload, changeset)","anchor":"store/3"},{"id":"upload/3","deprecated":false,"title":"upload(changeset, field, attrs)","anchor":"upload/3"}],"key":"functions"}]},{"id":"Bonfire.Files.DOI","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.DOI","sections":[],"nested_context":"Bonfire","nested_title":".Files.DOI","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","deprecated":false,"title":"fetch(url, opts \\\\ [])","anchor":"fetch/2"},{"id":"fetch_crossref/1","deprecated":false,"title":"fetch_crossref(url)","anchor":"fetch_crossref/1"},{"id":"is_doi?/1","deprecated":false,"title":"is_doi?(url)","anchor":"is_doi?/1"},{"id":"is_pub_id_or_uri_match?/1","deprecated":false,"title":"is_pub_id_or_uri_match?(url)","anchor":"is_pub_id_or_uri_match?/1"},{"id":"maybe_fetch/1","deprecated":false,"title":"maybe_fetch(url)","anchor":"maybe_fetch/1"},{"id":"pub_id_and_uri_matchers/0","deprecated":false,"title":"pub_id_and_uri_matchers()","anchor":"pub_id_and_uri_matchers/0"},{"id":"pub_id_matcher/1","deprecated":false,"title":"pub_id_matcher(type)","anchor":"pub_id_matcher/1"},{"id":"pub_id_matchers/0","deprecated":false,"title":"pub_id_matchers()","anchor":"pub_id_matchers/0"},{"id":"pub_uri_matchers/0","deprecated":false,"title":"pub_uri_matchers()","anchor":"pub_uri_matchers/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Definition","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Definition","sections":[],"nested_context":"Bonfire","nested_title":".Files.Definition","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"allowed_media_types/0","deprecated":false,"title":"allowed_media_types()","anchor":"c:allowed_media_types/0"},{"id":"max_file_size/0","deprecated":false,"title":"max_file_size()","anchor":"c:max_file_size/0"}],"key":"callbacks"}]},{"id":"Bonfire.Files.DocumentUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.DocumentUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.DocumentUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.EmojiUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.EmojiUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.EmojiUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"add_emoji/4","deprecated":false,"title":"add_emoji(user, file, label, shortcode)","anchor":"add_emoji/4"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"list/1","deprecated":false,"title":"list(scope)","anchor":"list/1"},{"id":"media_put_setting/3","deprecated":false,"title":"media_put_setting(media, metadata, opts)","anchor":"media_put_setting/3"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"prepare_meta/2","deprecated":false,"title":"prepare_meta(label, shortcode)","anchor":"prepare_meta/2"},{"id":"prepare_setting/1","deprecated":false,"title":"prepare_setting(map)","anchor":"prepare_setting/1"},{"id":"put_setting/3","deprecated":false,"title":"put_setting(metadata, setting, opts)","anchor":"put_setting/3"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(_, _)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.FaviconStore","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.FaviconStore","sections":[],"nested_context":"Bonfire","nested_title":".Files.FaviconStore","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"cached_or_async_fetch_url/2","deprecated":false,"title":"cached_or_async_fetch_url(url, opts \\\\ [])","anchor":"cached_or_async_fetch_url/2"},{"id":"cached_or_fetch/2","deprecated":false,"title":"cached_or_fetch(url, opts \\\\ [])","anchor":"cached_or_fetch/2"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"favicon_url/2","deprecated":false,"title":"favicon_url(url, opts \\\\ [])","anchor":"favicon_url/2"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(_, _)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.FileDenied","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.FileDenied","sections":[],"nested_context":"Bonfire","nested_title":".Files.FileDenied","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(size)","anchor":"new/1"}],"key":"functions"}]},{"id":"Bonfire.Files.IconUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.IconUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.IconUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.ImageUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.ImageUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.ImageUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Files.LiveHandler","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Files.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"handle_progress/3","deprecated":false,"title":"handle_progress(type, entry, socket)","anchor":"handle_progress/3"},{"id":"set_fallback/5","deprecated":false,"title":"set_fallback(_, _, _, _, socket)","anchor":"set_fallback/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Media","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Media","sections":[],"nested_context":"Bonfire","nested_title":".Files.Media","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, media)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, ap_object)","anchor":"ap_receive_activity/3"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"description/1","deprecated":false,"title":"description(media)","anchor":"description/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"get_by_path/1","deprecated":false,"title":"get_by_path(url)","anchor":"get_by_path/1"},{"id":"hard_delete/2","deprecated":false,"title":"hard_delete(module \\\\ nil, media)","anchor":"hard_delete/2"},{"id":"insert/4","deprecated":false,"title":"insert(creator, file, file_info, attrs)","anchor":"insert/4"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"media_label/1","deprecated":false,"title":"media_label(media)","anchor":"media_label/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(media)","anchor":"soft_delete/1"},{"id":"unwrap/1","deprecated":false,"title":"unwrap(list)","anchor":"unwrap/1"},{"id":"update/3","deprecated":false,"title":"update(user \\\\ nil, media, updates)","anchor":"update/3"},{"id":"update_by/2","deprecated":false,"title":"update_by(filters, updates)","anchor":"update_by/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Media.Queries","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Media.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Files.Media.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(query, filter_or_filters)","anchor":"filter/2"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Files.MediaEdit","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.MediaEdit","sections":[],"nested_context":"Bonfire","nested_title":".Files.MediaEdit","nodeGroups":[{"name":"Functions","nodes":[{"id":"banner/3","deprecated":false,"title":"banner(filename, max_width, max_height)","anchor":"banner/3"},{"id":"blur/2","deprecated":false,"title":"blur(path, final_path)","anchor":"blur/2"},{"id":"dominant_color/3","deprecated":false,"title":"dominant_color(file_path_or_binary_or_stream, bins \\\\ 15, fallback \\\\ \"#FFF8E7\")","anchor":"dominant_color/3"},{"id":"frame_to_scrub/3","deprecated":false,"title":"frame_to_scrub(fps, frame_count, scrub_opts)","anchor":"frame_to_scrub/3"},{"id":"image/3","deprecated":false,"title":"image(filename, max_width, max_height)","anchor":"image/3"},{"id":"image_resize_thumbnail/4","deprecated":false,"title":"image_resize_thumbnail(image, max_size, waffle_file \\\\ %Waffle.File{}, tmp_path \\\\ nil)","anchor":"image_resize_thumbnail/4"},{"id":"image_save_temp_file/3","deprecated":false,"title":"image_save_temp_file(image, waffle_file \\\\ %Waffle.File{}, tmp_path \\\\ nil)","anchor":"image_save_temp_file/3"},{"id":"thumbnail/2","deprecated":false,"title":"thumbnail(filename, max_size)","anchor":"thumbnail/2"},{"id":"thumbnail_pdf/1","deprecated":false,"title":"thumbnail_pdf(filename)","anchor":"thumbnail_pdf/1"},{"id":"thumbnail_video/3","deprecated":false,"title":"thumbnail_video(filename, max_size, scrub_opts)","anchor":"thumbnail_video/3"},{"id":"video_convert/1","deprecated":false,"title":"video_convert(filename)","anchor":"video_convert/1"},{"id":"video_image_thumbnail/4","deprecated":false,"title":"video_image_thumbnail(filename, max_size, scrub_opts, waffle_file \\\\ %Waffle.File{})","anchor":"video_image_thumbnail/4"}],"key":"functions"}]},{"id":"Bonfire.Files.MimeTypes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.MimeTypes","sections":[],"nested_context":"Bonfire","nested_title":".Files.MimeTypes","nodeGroups":[{"name":"Functions","nodes":[{"id":"extra_media/0","deprecated":false,"title":"extra_media()","anchor":"extra_media/0"},{"id":"image_media/0","deprecated":false,"title":"image_media()","anchor":"image_media/0"},{"id":"supported_media/0","deprecated":false,"title":"supported_media()","anchor":"supported_media/0"},{"id":"unique_extension_for_mime/0","deprecated":false,"title":"unique_extension_for_mime()","anchor":"unique_extension_for_mime/0"},{"id":"video_media/0","deprecated":false,"title":"video_media()","anchor":"video_media/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Prepare","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Prepare","sections":[],"nested_context":"Bonfire","nested_title":".Files.Prepare","nodeGroups":[{"name":"Functions","nodes":[{"id":"prepare/2","deprecated":false,"title":"prepare(definition, filepath)","anchor":"prepare/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Queues.VideoTranscode","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Queues.VideoTranscode","sections":[],"nested_context":"Bonfire","nested_title":".Files.Queues.VideoTranscode","nodeGroups":[{"name":"Functions","nodes":[{"id":"transcode/1","deprecated":false,"title":"transcode(job)","anchor":"transcode/1"}],"key":"functions"}]},{"id":"Bonfire.Files.ResponsiveImage","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.ResponsiveImage","sections":[],"nested_context":"Bonfire","nested_title":".Files.ResponsiveImage","nodeGroups":[{"name":"Functions","nodes":[{"id":"compile_src/2","deprecated":false,"title":"compile_src(path, width)","anchor":"compile_src/2"},{"id":"compile_srcset/2","deprecated":false,"title":"compile_srcset(path, widths)","anchor":"compile_srcset/2"},{"id":"resize/1","deprecated":false,"title":"resize(attr)","anchor":"resize/1"},{"id":"resize/2","deprecated":false,"title":"resize(path, width)","anchor":"resize/2"},{"id":"resize_timed/1","deprecated":false,"title":"resize_timed(images)","anchor":"resize_timed/1"},{"id":"src/2","deprecated":false,"title":"src(path, width)","anchor":"src/2"},{"id":"srcset/2","deprecated":false,"title":"srcset(path, widths)","anchor":"srcset/2"}],"key":"functions"}]},{"id":"Bonfire.Files.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Files.Routes"},{"id":"Bonfire.Files.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Files.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Simulation","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Simulation","sections":[],"nested_context":"Bonfire","nested_title":".Files.Simulation","nodeGroups":[{"name":"Functions","nodes":[{"id":"cleanup/1","deprecated":false,"title":"cleanup(path)","anchor":"cleanup/1"},{"id":"fake_upload/2","deprecated":false,"title":"fake_upload(file, upload_def \\\\ nil)","anchor":"fake_upload/2"},{"id":"geometry/1","deprecated":false,"title":"geometry(path)","anchor":"geometry/1"},{"id":"icon_file/0","deprecated":false,"title":"icon_file()","anchor":"icon_file/0"},{"id":"image_file/0","deprecated":false,"title":"image_file()","anchor":"image_file/0"},{"id":"pdf_file/0","deprecated":false,"title":"pdf_file()","anchor":"pdf_file/0"},{"id":"text_file/0","deprecated":false,"title":"text_file()","anchor":"text_file/0"}],"key":"functions"}]},{"id":"Bonfire.Files.Versions","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.Versions","sections":[],"nested_context":"Bonfire","nested_title":".Files.Versions"},{"id":"Bonfire.Files.VideoUploader","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Files.VideoUploader","sections":[],"nested_context":"Bonfire","nested_title":".Files.VideoUploader","nodeGroups":[{"name":"Functions","nodes":[{"id":"acl/2","deprecated":false,"title":"acl(_, _)","anchor":"acl/2"},{"id":"asset_host/0","deprecated":false,"title":"asset_host()","anchor":"asset_host/0"},{"id":"async/0","deprecated":false,"title":"async()","anchor":"async/0"},{"id":"attach/2","deprecated":false,"title":"attach(tuple, changeset)","anchor":"attach/2"},{"id":"blurhash/1","deprecated":false,"title":"blurhash(media)","anchor":"blurhash/1"},{"id":"blurred/1","deprecated":false,"title":"blurred(media)","anchor":"blurred/1"},{"id":"bucket/0","deprecated":false,"title":"bucket()","anchor":"bucket/0"},{"id":"bucket/1","deprecated":false,"title":"bucket(arg)","anchor":"bucket/1"},{"id":"default_url/1","deprecated":false,"title":"default_url(_)","anchor":"default_url/1"},{"id":"default_url/2","deprecated":false,"title":"default_url(version, _)","anchor":"default_url/2"},{"id":"delete/1","deprecated":false,"title":"delete(args)","anchor":"delete/1"},{"id":"filename/2","deprecated":false,"title":"filename(_, arg)","anchor":"filename/2"},{"id":"max_height/0","deprecated":false,"title":"max_height()","anchor":"max_height/0"},{"id":"max_width/0","deprecated":false,"title":"max_width()","anchor":"max_width/0"},{"id":"prefix_dir/0","deprecated":false,"title":"prefix_dir()","anchor":"prefix_dir/0"},{"id":"prepare/1","deprecated":false,"title":"prepare(args)","anchor":"prepare/1"},{"id":"remote_file_headers/1","deprecated":false,"title":"remote_file_headers(_)","anchor":"remote_file_headers/1"},{"id":"remote_url/2","deprecated":false,"title":"remote_url(media, version \\\\ nil)","anchor":"remote_url/2"},{"id":"s3_object_headers/2","deprecated":false,"title":"s3_object_headers(_, _)","anchor":"s3_object_headers/2"},{"id":"storage_dir/2","deprecated":false,"title":"storage_dir(_, arg2)","anchor":"storage_dir/2"},{"id":"storage_dir_prefix/0","deprecated":false,"title":"storage_dir_prefix()","anchor":"storage_dir_prefix/0"},{"id":"store/1","deprecated":false,"title":"store(args)","anchor":"store/1"},{"id":"transform/2","deprecated":false,"title":"transform(arg1, arg2)","anchor":"transform/2"},{"id":"transform_timeout/0","deprecated":false,"title":"transform_timeout()","anchor":"transform_timeout/0"},{"id":"upload/4","deprecated":false,"title":"upload(creator, file, attrs \\\\ %{}, opts \\\\ [])","anchor":"upload/4"},{"id":"url/1","deprecated":false,"title":"url(file)","anchor":"url/1"},{"id":"url/2","deprecated":false,"title":"url(file, options)","anchor":"url/2"},{"id":"url/3","deprecated":false,"title":"url(file, version, options)","anchor":"url/3"},{"id":"urls/2","deprecated":false,"title":"urls(file, options \\\\ [])","anchor":"urls/2"},{"id":"validate/1","deprecated":false,"title":"validate(media)","anchor":"validate/1"}],"key":"functions"}]},{"id":"Bonfire.Mailer","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer","sections":[{"id":"Before You Begin","anchor":"module-before-you-begin"},{"id":"Choosing an Email Delivery Method","anchor":"module-choosing-an-email-delivery-method"},{"id":"1. Default Behaviour: Direct SMTP Delivery","anchor":"module-1-default-behaviour-direct-smtp-delivery"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Mailer","nodeGroups":[{"name":"Functions","nodes":[{"id":"app_name/0","deprecated":false,"title":"app_name()","anchor":"app_name/0"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/1"},{"id":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"handle_error/2","deprecated":false,"title":"handle_error(error, stacktrace \\\\ nil)","anchor":"handle_error/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"send/4","deprecated":false,"title":"send(email, to, mode \\\\ :async, opts \\\\ [])","anchor":"send/4"},{"id":"send_app_feedback/3","deprecated":false,"title":"send_app_feedback(subject, body, opts \\\\ [])","anchor":"send_app_feedback/3"},{"id":"send_async/3","deprecated":false,"title":"send_async(email, to, opts \\\\ [])","anchor":"send_async/3"},{"id":"send_now/3","deprecated":false,"title":"send_now(email, to, opts \\\\ [])","anchor":"send_now/3"},{"id":"start/2","deprecated":false,"title":"start(_, _)","anchor":"start/2"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Bamboo","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Bamboo","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Bamboo","nodeGroups":[{"name":"Functions","nodes":[{"id":"deliver/1","deprecated":false,"title":"deliver(email)","anchor":"deliver/1"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/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":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Behaviour","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Behaviour","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Behaviour","nodeGroups":[{"name":"Types","nodes":[{"id":"email/0","deprecated":false,"title":"email()","anchor":"t:email/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"c:deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"c:deliver_inline/1"},{"id":"from/2","deprecated":false,"title":"from(email, arg2)","anchor":"c:from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, t)","anchor":"c:html_body/2"},{"id":"new/0","deprecated":false,"title":"new()","anchor":"c:new/0"},{"id":"new/1","deprecated":false,"title":"new(term)","anchor":"c:new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, t)","anchor":"c:subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, t)","anchor":"c:text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, arg2)","anchor":"c:to/2"}],"key":"callbacks"}]},{"id":"Bonfire.Mailer.Checker","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Checker","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Checker","nodeGroups":[{"name":"Types","nodes":[{"id":"error_reason/0","deprecated":false,"title":"error_reason()","anchor":"t:error_reason/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"validate_domain/1","deprecated":false,"title":"validate_domain(domain)","anchor":"validate_domain/1"},{"id":"validate_email/1","deprecated":false,"title":"validate_email(email)","anchor":"validate_email/1"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Render","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Render","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Render","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_layout/0","deprecated":false,"title":"default_layout()","anchor":"default_layout/0"},{"id":"maybe_with_layout/4","deprecated":false,"title":"maybe_with_layout(format, inner_content, assigns, layout)","anchor":"maybe_with_layout/4"},{"id":"new_templated/3","deprecated":false,"title":"new_templated(mod, assigns, opts \\\\ [])","anchor":"new_templated/3"},{"id":"render_templated/6","deprecated":false,"title":"render_templated(format, mod, assigns, template \\\\ nil, layout \\\\ nil, opts \\\\ [])","anchor":"render_templated/6"},{"id":"render_to_string/3","deprecated":false,"title":"render_to_string(mod, format, assigns)","anchor":"render_to_string/3"},{"id":"render_to_string/4","deprecated":false,"title":"render_to_string(mod, template, format, assigns)","anchor":"render_to_string/4"},{"id":"templated/4","deprecated":false,"title":"templated(email, mod, assigns, opts \\\\ [])","anchor":"templated/4"}],"key":"functions"}]},{"id":"Bonfire.Mailer.RuntimeConfig","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"bamboo_service/2","deprecated":false,"title":"bamboo_service(adapter, extra \\\\ [])","anchor":"bamboo_service/2"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"},{"id":"mail_blackhole/1","deprecated":false,"title":"mail_blackhole(var)","anchor":"mail_blackhole/1"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"swoosh_service/2","deprecated":false,"title":"swoosh_service(adapter, extra \\\\ [])","anchor":"swoosh_service/2"}],"key":"functions"}]},{"id":"Bonfire.Mailer.Swoosh","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Mailer.Swoosh","sections":[],"nested_context":"Bonfire","nested_title":".Mailer.Swoosh","nodeGroups":[{"name":"Functions","nodes":[{"id":"deliver/2","deprecated":false,"title":"deliver(email, config \\\\ [])","anchor":"deliver/2"},{"id":"deliver!/2","deprecated":false,"title":"deliver!(email, config \\\\ [])","anchor":"deliver!/2"},{"id":"deliver_async/1","deprecated":false,"title":"deliver_async(email)","anchor":"deliver_async/1"},{"id":"deliver_inline/1","deprecated":false,"title":"deliver_inline(email)","anchor":"deliver_inline/1"},{"id":"deliver_many/2","deprecated":false,"title":"deliver_many(emails, config \\\\ [])","anchor":"deliver_many/2"},{"id":"from/2","deprecated":false,"title":"from(email, address)","anchor":"from/2"},{"id":"html_body/2","deprecated":false,"title":"html_body(email, body)","anchor":"html_body/2"},{"id":"new/1","deprecated":false,"title":"new(data \\\\ [])","anchor":"new/1"},{"id":"subject/2","deprecated":false,"title":"subject(email, subject)","anchor":"subject/2"},{"id":"text_body/2","deprecated":false,"title":"text_body(email, body)","anchor":"text_body/2"},{"id":"to/2","deprecated":false,"title":"to(email, address)","anchor":"to/2"}],"key":"functions"}]},{"id":"Bonfire.Web.Endpoint","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Endpoint","sections":[],"nested_context":"Bonfire","nested_title":".Web.Endpoint","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":"generate_reverse_router!/1","deprecated":false,"title":"generate_reverse_router!(app \\\\ :bonfire)","anchor":"generate_reverse_router!/1"},{"id":"halt_live_reload/2","deprecated":false,"title":"halt_live_reload(conn, _)","anchor":"halt_live_reload/2"},{"id":"host/0","deprecated":false,"title":"host()","anchor":"host/0"},{"id":"include_assets/1","deprecated":false,"title":"include_assets(conn)","anchor":"include_assets/1"},{"id":"include_assets/2","deprecated":false,"title":"include_assets(conn, atom)","anchor":"include_assets/2"},{"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":"log_ip/2","deprecated":false,"title":"log_ip(conn, _)","anchor":"log_ip/2"},{"id":"node_name/0","deprecated":false,"title":"node_name()","anchor":"node_name/0"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"publish_mutation/3","deprecated":false,"title":"publish_mutation(topic, mutation_result, subscribed_fields)","anchor":"publish_mutation/3"},{"id":"publish_subscription/2","deprecated":false,"title":"publish_subscription(topic, data)","anchor":"publish_subscription/2"},{"id":"reload!/1","deprecated":false,"title":"reload!(opts \\\\ [\"--no-all-warnings\"])","anchor":"reload!/1"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"Bonfire.Web.FakeRemoteEndpoint","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.FakeRemoteEndpoint","sections":[],"nested_context":"Bonfire","nested_title":".Web.FakeRemoteEndpoint","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":"log_ip/2","deprecated":false,"title":"log_ip(conn, _)","anchor":"log_ip/2"},{"id":"node_name/0","deprecated":false,"title":"node_name()","anchor":"node_name/0"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"publish_mutation/3","deprecated":false,"title":"publish_mutation(topic, mutation_result, subscribed_fields)","anchor":"publish_mutation/3"},{"id":"publish_subscription/2","deprecated":false,"title":"publish_subscription(topic, data)","anchor":"publish_subscription/2"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"Bonfire.Web.Router","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router","nodeGroups":[{"name":"Functions","nodes":[{"id":"account_required/2","deprecated":false,"title":"account_required(conn, _)","anchor":"account_required/2"},{"id":"activity_json/2","deprecated":false,"title":"activity_json(conn, _)","anchor":"activity_json/2"},{"id":"activity_json_or_html/2","deprecated":false,"title":"activity_json_or_html(conn, _)","anchor":"activity_json_or_html/2"},{"id":"admin_required/2","deprecated":false,"title":"admin_required(conn, _)","anchor":"admin_required/2"},{"id":"basic/2","deprecated":false,"title":"basic(conn, _)","anchor":"basic/2"},{"id":"basic_html/2","deprecated":false,"title":"basic_html(conn, _)","anchor":"basic_html/2"},{"id":"basic_json/2","deprecated":false,"title":"basic_json(conn, _)","anchor":"basic_json/2"},{"id":"browser/2","deprecated":false,"title":"browser(conn, _)","anchor":"browser/2"},{"id":"browser_unsafe/2","deprecated":false,"title":"browser_unsafe(conn, _)","anchor":"browser_unsafe/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"early_hints_authed/2","deprecated":false,"title":"early_hints_authed(conn, _)","anchor":"early_hints_authed/2"},{"id":"guest_only/2","deprecated":false,"title":"guest_only(conn, _)","anchor":"guest_only/2"},{"id":"html_only/2","deprecated":false,"title":"html_only(conn, _)","anchor":"html_only/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"load_current_auth/2","deprecated":false,"title":"load_current_auth(conn, _)","anchor":"load_current_auth/2"},{"id":"require_authenticated_user/2","deprecated":false,"title":"require_authenticated_user(conn, _)","anchor":"require_authenticated_user/2"},{"id":"signed_activity_pub_fetch/2","deprecated":false,"title":"signed_activity_pub_fetch(conn, _)","anchor":"signed_activity_pub_fetch/2"},{"id":"signed_activity_pub_incoming/2","deprecated":false,"title":"signed_activity_pub_incoming(conn, _)","anchor":"signed_activity_pub_incoming/2"},{"id":"static_generator/2","deprecated":false,"title":"static_generator(conn, _)","anchor":"static_generator/2"},{"id":"throttle_plug_attacks/2","deprecated":false,"title":"throttle_plug_attacks(conn, _)","anchor":"throttle_plug_attacks/2"},{"id":"user_required/2","deprecated":false,"title":"user_required(conn, _)","anchor":"user_required/2"},{"id":"webfinger/2","deprecated":false,"title":"webfinger(conn, _)","anchor":"webfinger/2"},{"id":"well_known_nodeinfo/2","deprecated":false,"title":"well_known_nodeinfo(conn, _)","anchor":"well_known_nodeinfo/2"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.CORS","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.CORS","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.CORS","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"},{"id":"local_origin?/3","deprecated":false,"title":"local_origin?(conn, origin, scope)","anchor":"local_origin?/3"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.Reverse","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.Reverse","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.Reverse","nodeGroups":[{"name":"Functions","nodes":[{"id":"path/2","deprecated":false,"title":"path(conn_or_socket_or_endpoint, atom)","anchor":"path/2"},{"id":"path/3","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, qs)","anchor":"path/3"},{"id":"path/4","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1)","anchor":"path/4"},{"id":"path/5","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, qs)","anchor":"path/5"},{"id":"path/6","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, arg2, qs)","anchor":"path/6"},{"id":"path/7","deprecated":false,"title":"path(conn_or_socket_or_endpoint, arg2, arg1, arg1, arg2, arg3, qs)","anchor":"path/7"}],"key":"functions"}]},{"id":"Bonfire.Web.Router.Routes","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.Router.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Web.Router.Routes"},{"id":"Bonfire.Web.ViewInventoryLive.GraphQL","deprecated":false,"group":"Bonfire utilities","title":"Bonfire.Web.ViewInventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Web.ViewInventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"ValueFlows","deprecated":false,"group":"Feature extensions","title":"ValueFlows","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}]},{"id":"ValueFlows.Agent.Agents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.Agents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_type/1","deprecated":false,"title":"add_type(a)","anchor":"add_type/1"},{"id":"agent/2","deprecated":false,"title":"agent(id, signed_in_user)","anchor":"agent/2"},{"id":"agent_location/1","deprecated":false,"title":"agent_location(a)","anchor":"agent_location/1"},{"id":"agent_to_character/1","deprecated":false,"title":"agent_to_character(a)","anchor":"agent_to_character/1"},{"id":"agents/1","deprecated":false,"title":"agents(signed_in_user)","anchor":"agents/1"},{"id":"character_to_agent/1","deprecated":false,"title":"character_to_agent(a)","anchor":"character_to_agent/1"}],"key":"functions"}]},{"id":"ValueFlows.Agent.Organizations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.Organizations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"organization/2","deprecated":false,"title":"organization(id, current_user)","anchor":"organization/2"},{"id":"organizations/1","deprecated":false,"title":"organizations(signed_in_user)","anchor":"organizations/1"}],"key":"functions"}]},{"id":"ValueFlows.Agent.People","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agent.People","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"people/1","deprecated":false,"title":"people(signed_in_user)","anchor":"people/1"},{"id":"person/2","deprecated":false,"title":"person(id, current_user)","anchor":"person/2"}],"key":"functions"}]},{"id":"ValueFlows.Agreement","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Agreement","sections":[]},{"id":"ValueFlows.AllMigrations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.AllMigrations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"down/0","deprecated":false,"title":"down()","anchor":"down/0"},{"id":"up/0","deprecated":false,"title":"up()","anchor":"up/0"}],"key":"functions"}]},{"id":"ValueFlows.Claim","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/4","deprecated":false,"title":"create_changeset(creator, provider, receiver, attrs)","anchor":"create_changeset/4"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(claim, attrs)","anchor":"update_changeset/2"},{"id":"validate_required/1","deprecated":false,"title":"validate_required(changeset)","anchor":"validate_required/1"}],"key":"functions"}]},{"id":"ValueFlows.Claim.Claims","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.Claims","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/4","deprecated":false,"title":"create(creator, provider, receiver, attrs)","anchor":"create/4"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(claim)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(claim)","anchor":"soft_delete/1"},{"id":"update/2","deprecated":false,"title":"update(claim, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Claim.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"claim/2","deprecated":false,"title":"claim(map, info)","anchor":"claim/2"},{"id":"claims/2","deprecated":false,"title":"claims(page_opts, info)","anchor":"claims/2"},{"id":"create_claim/2","deprecated":false,"title":"create_claim(map, info)","anchor":"create_claim/2"},{"id":"delete_claim/2","deprecated":false,"title":"delete_claim(map, info)","anchor":"delete_claim/2"},{"id":"fetch_claim/2","deprecated":false,"title":"fetch_claim(info, id)","anchor":"fetch_claim/2"},{"id":"fetch_events/2","deprecated":false,"title":"fetch_events(page_opts, info)","anchor":"fetch_events/2"},{"id":"fetch_triggered_by_edge/3","deprecated":false,"title":"fetch_triggered_by_edge(thing, _, _)","anchor":"fetch_triggered_by_edge/3"},{"id":"update_claim/2","deprecated":false,"title":"update_claim(map, info)","anchor":"update_claim/2"}],"key":"functions"}]},{"id":"ValueFlows.Claim.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Claim.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(event, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"},{"id":"validate_create_changeset/1","deprecated":false,"title":"validate_create_changeset(cs)","anchor":"validate_create_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.EconomicEvents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.EconomicEvents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/3","deprecated":false,"title":"create(creator, event_attrs, extra_attrs \\\\ %{})","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs_of/2","deprecated":false,"title":"inputs_of(attrs, action_id \\\\ nil)","anchor":"inputs_of/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs_of/2","deprecated":false,"title":"outputs_of(attrs, action_id \\\\ nil)","anchor":"outputs_of/2"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(event)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(event)","anchor":"preload_all/1"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator \\\\ nil)","anchor":"prepare_attrs/2"},{"id":"prepare_create_attrs/2","deprecated":false,"title":"prepare_create_attrs(attrs, creator \\\\ nil)","anchor":"prepare_create_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(event)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/3","deprecated":false,"title":"update(user, event, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.EventSideEffects","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.EventSideEffects","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_side_effects/1","deprecated":false,"title":"event_side_effects(event)","anchor":"event_side_effects/1"},{"id":"measurement_effect/3","deprecated":false,"title":"measurement_effect(arg1, measurement, amount)","anchor":"measurement_effect/3"},{"id":"quantity_effect/4","deprecated":false,"title":"quantity_effect(field, resource, by_quantity, operation)","anchor":"quantity_effect/4"},{"id":"return_updated_event/2","deprecated":false,"title":"return_updated_event(event, resource)","anchor":"return_updated_event/2"},{"id":"return_updated_event/3","deprecated":false,"title":"return_updated_event(event, resource, to_resource)","anchor":"return_updated_event/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_events/3","deprecated":false,"title":"agent_events(arg1, page_opts, info)","anchor":"agent_events/3"},{"id":"agent_events_edge/3","deprecated":false,"title":"agent_events_edge(map, page_opts, info)","anchor":"agent_events_edge/3"},{"id":"all_events/2","deprecated":false,"title":"all_events(_, _)","anchor":"all_events/2"},{"id":"create_event/2","deprecated":false,"title":"create_event(params, info)","anchor":"create_event/2"},{"id":"delete_event/2","deprecated":false,"title":"delete_event(map, info)","anchor":"delete_event/2"},{"id":"event/2","deprecated":false,"title":"event(map, info)","anchor":"event/2"},{"id":"events/2","deprecated":false,"title":"events(page_opts, info)","anchor":"events/2"},{"id":"events_filtered/2","deprecated":false,"title":"events_filtered(page_opts, _ \\\\ nil)","anchor":"events_filtered/2"},{"id":"fetch_agent_events_edge/3","deprecated":false,"title":"fetch_agent_events_edge(page_opts, info, ids)","anchor":"fetch_agent_events_edge/3"},{"id":"fetch_event/2","deprecated":false,"title":"fetch_event(info, id)","anchor":"fetch_event/2"},{"id":"fetch_events/2","deprecated":false,"title":"fetch_events(page_opts, info)","anchor":"fetch_events/2"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(thing, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(thing, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_to_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_to_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_to_resource_inventoried_as_edge/3"},{"id":"fetch_trace/2","deprecated":false,"title":"fetch_trace(_, event)","anchor":"fetch_trace/2"},{"id":"fetch_track/2","deprecated":false,"title":"fetch_track(_, event)","anchor":"fetch_track/2"},{"id":"fetch_triggered_by_edge/3","deprecated":false,"title":"fetch_triggered_by_edge(thing, _, _)","anchor":"fetch_triggered_by_edge/3"},{"id":"list_events/4","deprecated":false,"title":"list_events(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_events/4"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"trace/3","deprecated":false,"title":"trace(event, _, info)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, _, info)","anchor":"track/3"},{"id":"update_event/2","deprecated":false,"title":"update_event(map, info)","anchor":"update_event/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator)","anchor":"prepare_attrs/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Trace","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Trace","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/3","deprecated":false,"title":"event(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"event/3"},{"id":"process/3","deprecated":false,"title":"process(process, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"process/3"},{"id":"resource/3","deprecated":false,"title":"resource(resource_or_id, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"resource/3"},{"id":"trace/3","deprecated":false,"title":"trace(obj, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicEvent.Track","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicEvent.Track","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event/3","deprecated":false,"title":"event(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"event/3"},{"id":"process/3","deprecated":false,"title":"process(process, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"process/3"},{"id":"resource/3","deprecated":false,"title":"resource(id, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"resource/3"},{"id":"track/3","deprecated":false,"title":"track(obj, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(resource, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.EconomicResources","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.EconomicResources","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs_of/1","deprecated":false,"title":"inputs_of(process)","anchor":"inputs_of/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs_of/1","deprecated":false,"title":"outputs_of(process)","anchor":"outputs_of/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(resource)","anchor":"preload_all/1"},{"id":"preload_state/1","deprecated":false,"title":"preload_state(resource)","anchor":"preload_state/1"},{"id":"search/1","deprecated":false,"title":"search(search)","anchor":"search/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(resource)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/2","deprecated":false,"title":"update(resource, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, search, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(resource_spec)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"ValueFlows.EconomicResource.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.EconomicResource.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.Action","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.Action","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"ValueFlows.Knowledge.Action.Actions","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.Action.Actions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"action/1","deprecated":false,"title":"action(label)","anchor":"action/1"},{"id":"action!/1","deprecated":false,"title":"action!(label)","anchor":"action!/1"},{"id":"actions_list/0","deprecated":false,"title":"actions_list()","anchor":"actions_list/0"},{"id":"actions_map/0","deprecated":false,"title":"actions_map()","anchor":"actions_map/0"},{"id":"default_actions/0","deprecated":false,"title":"default_actions()","anchor":"default_actions/0"},{"id":"id/1","deprecated":false,"title":"id(label)","anchor":"id/1"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(process_spec, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_process_specs/2","deprecated":false,"title":"all_process_specs(_, _)","anchor":"all_process_specs/2"},{"id":"create_process_spec/2","deprecated":false,"title":"create_process_spec(map, info)","anchor":"create_process_spec/2"},{"id":"creator_process_specs_edge/3","deprecated":false,"title":"creator_process_specs_edge(map, page_opts, info)","anchor":"creator_process_specs_edge/3"},{"id":"delete_process_spec/2","deprecated":false,"title":"delete_process_spec(map, info)","anchor":"delete_process_spec/2"},{"id":"fetch_creator_process_specs_edge/3","deprecated":false,"title":"fetch_creator_process_specs_edge(page_opts, info, ids)","anchor":"fetch_creator_process_specs_edge/3"},{"id":"fetch_process_spec/2","deprecated":false,"title":"fetch_process_spec(info, id)","anchor":"fetch_process_spec/2"},{"id":"fetch_process_specs/2","deprecated":false,"title":"fetch_process_specs(page_opts, info)","anchor":"fetch_process_specs/2"},{"id":"list_process_specs/4","deprecated":false,"title":"list_process_specs(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_process_specs/4"},{"id":"process_spec/2","deprecated":false,"title":"process_spec(map, info)","anchor":"process_spec/2"},{"id":"process_specs/2","deprecated":false,"title":"process_specs(page_opts, info)","anchor":"process_specs/2"},{"id":"process_specs_filtered/2","deprecated":false,"title":"process_specs_filtered(page_opts, _)","anchor":"process_specs_filtered/2"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"update_process_spec/2","deprecated":false,"title":"update_process_spec(map, info)","anchor":"update_process_spec/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.ProcessSpecifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(process_spec)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(process_spec, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ProcessSpecification.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ProcessSpecification.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, context, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(resource_spec, attrs)","anchor":"update_changeset/2"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(resource_spec, context, attrs)","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_resource_specs/2","deprecated":false,"title":"all_resource_specs(_, _)","anchor":"all_resource_specs/2"},{"id":"create_resource_spec/2","deprecated":false,"title":"create_resource_spec(map, info)","anchor":"create_resource_spec/2"},{"id":"creator_resource_specs_edge/3","deprecated":false,"title":"creator_resource_specs_edge(map, page_opts, info)","anchor":"creator_resource_specs_edge/3"},{"id":"delete_resource_spec/2","deprecated":false,"title":"delete_resource_spec(map, info)","anchor":"delete_resource_spec/2"},{"id":"fetch_conforming_resources_edge/3","deprecated":false,"title":"fetch_conforming_resources_edge(map, page_opts, info)","anchor":"fetch_conforming_resources_edge/3"},{"id":"fetch_creator_resource_specs_edge/3","deprecated":false,"title":"fetch_creator_resource_specs_edge(page_opts, info, ids)","anchor":"fetch_creator_resource_specs_edge/3"},{"id":"fetch_default_unit_of_effort_edge/3","deprecated":false,"title":"fetch_default_unit_of_effort_edge(thing, _, _)","anchor":"fetch_default_unit_of_effort_edge/3"},{"id":"fetch_resource_spec/2","deprecated":false,"title":"fetch_resource_spec(info, id)","anchor":"fetch_resource_spec/2"},{"id":"fetch_resource_specs/2","deprecated":false,"title":"fetch_resource_specs(page_opts, info)","anchor":"fetch_resource_specs/2"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"list_resource_specs/4","deprecated":false,"title":"list_resource_specs(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_resource_specs/4"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"resource_spec/2","deprecated":false,"title":"resource_spec(map, info)","anchor":"resource_spec/2"},{"id":"resource_specs/2","deprecated":false,"title":"resource_specs(page_opts, info)","anchor":"resource_specs/2"},{"id":"simulate/2","deprecated":false,"title":"simulate(arg1, _)","anchor":"simulate/2"},{"id":"update_resource_spec/2","deprecated":false,"title":"update_resource_spec(map, info)","anchor":"update_resource_spec/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"create_in_autocomplete/2","deprecated":false,"title":"create_in_autocomplete(creator, name)","anchor":"create_in_autocomplete/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(resource_spec)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Knowledge.ResourceSpecification.ResourceSpecifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"maybe_get/1","deprecated":false,"title":"maybe_get(arg1)","anchor":"maybe_get/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"prepare_attrs/1","deprecated":false,"title":"prepare_attrs(attrs)","anchor":"prepare_attrs/1"},{"id":"search/1","deprecated":false,"title":"search(search)","anchor":"search/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(resource_spec)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(resource_spec, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Classifications","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Classifications","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/4","deprecated":false,"title":"create(user, attrs, facet, extra_info \\\\ nil)","anchor":"create/4"},{"id":"flatten/1","deprecated":false,"title":"flatten(obj)","anchor":"flatten/1"},{"id":"from_classification/1","deprecated":false,"title":"from_classification(attrs)","anchor":"from_classification/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"preload/2","deprecated":false,"title":"preload(thing, fields)","anchor":"preload/2"},{"id":"to_classification/2","deprecated":false,"title":"to_classification(attrs, facet \\\\ nil)","anchor":"to_classification/2"},{"id":"to_ecto_struct/2","deprecated":false,"title":"to_ecto_struct(module, map)","anchor":"to_ecto_struct/2"},{"id":"update/4","deprecated":false,"title":"update(user, id, attrs, facet)","anchor":"update/4"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Hydration","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Hydration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Integration","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Integration","sections":[]},{"id":"ValueFlows.Observe.ObservablePhenomenons","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePhenomenons","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/3","deprecated":false,"title":"create(user, observable_property_id, attrs)","anchor":"create/3"},{"id":"facet/0","deprecated":false,"title":"facet()","anchor":"facet/0"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"update/3","deprecated":false,"title":"update(user, obj, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePhenomenonsGraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"choice_of_edge/3","deprecated":false,"title":"choice_of_edge(thing, _, _)","anchor":"choice_of_edge/3"},{"id":"create_observable_phenomenon/2","deprecated":false,"title":"create_observable_phenomenon(map, info)","anchor":"create_observable_phenomenon/2"},{"id":"delete_observable_phenomenon/2","deprecated":false,"title":"delete_observable_phenomenon(map, info)","anchor":"delete_observable_phenomenon/2"},{"id":"formula_quantifier_edge/3","deprecated":false,"title":"formula_quantifier_edge(thing, _, _)","anchor":"formula_quantifier_edge/3"},{"id":"get/2","deprecated":false,"title":"get(map, info)","anchor":"get/2"},{"id":"observable_phenomenons/2","deprecated":false,"title":"observable_phenomenons(page_opts, info)","anchor":"observable_phenomenons/2"},{"id":"update_observable_phenomenon/2","deprecated":false,"title":"update_observable_phenomenon(map, info)","anchor":"update_observable_phenomenon/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservableProperties","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservableProperties","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"facet/0","deprecated":false,"title":"facet()","anchor":"facet/0"},{"id":"id/0","deprecated":false,"title":"id()","anchor":"id/0"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"update/3","deprecated":false,"title":"update(user, obj, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.ObservablePropertiesGraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.ObservablePropertiesGraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_observable_property/2","deprecated":false,"title":"create_observable_property(map, info)","anchor":"create_observable_property/2"},{"id":"delete_observable_property/2","deprecated":false,"title":"delete_observable_property(map, info)","anchor":"delete_observable_property/2"},{"id":"observable_properties/2","deprecated":false,"title":"observable_properties(page_opts, info)","anchor":"observable_properties/2"},{"id":"observable_property/2","deprecated":false,"title":"observable_property(map, info)","anchor":"observable_property/2"},{"id":"phenomenons_edge/3","deprecated":false,"title":"phenomenons_edge(thing, page_info, info)","anchor":"phenomenons_edge/3"},{"id":"update_observable_property/2","deprecated":false,"title":"update_observable_property(map, info)","anchor":"update_observable_property/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset_validate/1","deprecated":false,"title":"create_changeset_validate(cs)","anchor":"create_changeset_validate/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(event, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observation.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observation.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, map, observation_attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(observation)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(observation)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/3","deprecated":false,"title":"update(user, observation, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Observations.ObservationsResolvers","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Observations.ObservationsResolvers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_observations/2","deprecated":false,"title":"all_observations(_, _)","anchor":"all_observations/2"},{"id":"create_observation/2","deprecated":false,"title":"create_observation(params, info)","anchor":"create_observation/2"},{"id":"delete_observation/2","deprecated":false,"title":"delete_observation(map, info)","anchor":"delete_observation/2"},{"id":"fetch_observation/2","deprecated":false,"title":"fetch_observation(info, id)","anchor":"fetch_observation/2"},{"id":"fetch_observations/2","deprecated":false,"title":"fetch_observations(page_opts, info)","anchor":"fetch_observations/2"},{"id":"has_feature_of_interest/3","deprecated":false,"title":"has_feature_of_interest(thing, _, _)","anchor":"has_feature_of_interest/3"},{"id":"has_result_edge/3","deprecated":false,"title":"has_result_edge(thing, _, _)","anchor":"has_result_edge/3"},{"id":"list_observations/4","deprecated":false,"title":"list_observations(page_opts, base_filters, data_filters, cursor_type)","anchor":"list_observations/4"},{"id":"made_by_edge/3","deprecated":false,"title":"made_by_edge(thing, _, _)","anchor":"made_by_edge/3"},{"id":"name_as_label/3","deprecated":false,"title":"name_as_label(obj, _, _)","anchor":"name_as_label/3"},{"id":"observation/2","deprecated":false,"title":"observation(map, info)","anchor":"observation/2"},{"id":"observations/2","deprecated":false,"title":"observations(page_opts, info)","anchor":"observations/2"},{"id":"resolve_observable_object_type/2","deprecated":false,"title":"resolve_observable_object_type(_, _)","anchor":"resolve_observable_object_type/2"},{"id":"resolve_observable_result_type/2","deprecated":false,"title":"resolve_observable_result_type(arg1, _)","anchor":"resolve_observable_result_type/2"},{"id":"resolve_observer_type/2","deprecated":false,"title":"resolve_observer_type(_, _)","anchor":"resolve_observer_type/2"},{"id":"update_observation/2","deprecated":false,"title":"update_observation(map, info)","anchor":"update_observation/2"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Seeds","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Seeds","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"down/1","deprecated":false,"title":"down(repo)","anchor":"down/1"},{"id":"up/1","deprecated":false,"title":"up(repo)","anchor":"up/1"}],"key":"functions"}]},{"id":"ValueFlows.Observe.Simulate","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Observe.Simulate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_observable_phenomenon!/3","deprecated":false,"title":"fake_observable_phenomenon!(user, observable_property \\\\ nil, overrides \\\\ %{})","anchor":"fake_observable_phenomenon!/3"},{"id":"fake_observable_property!/2","deprecated":false,"title":"fake_observable_property!(user, overrides \\\\ %{})","anchor":"fake_observable_property!/2"},{"id":"fake_observation!/3","deprecated":false,"title":"fake_observation!(user, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_observation!/3"},{"id":"observable_phenomenon/1","deprecated":false,"title":"observable_phenomenon(overrides \\\\ %{})","anchor":"observable_phenomenon/1"},{"id":"observable_phenomenon_input/2","deprecated":false,"title":"observable_phenomenon_input(observable_property \\\\ nil, overrides \\\\ %{})","anchor":"observable_phenomenon_input/2"},{"id":"observable_property/1","deprecated":false,"title":"observable_property(overrides \\\\ %{})","anchor":"observable_property/1"},{"id":"observable_property_input/1","deprecated":false,"title":"observable_property_input(overrides \\\\ %{})","anchor":"observable_property_input/1"},{"id":"observation/4","deprecated":false,"title":"observation(base \\\\ %{}, has_feature_of_interest \\\\ nil, observed_property \\\\ nil, has_result \\\\ nil)","anchor":"observation/4"},{"id":"observation_input/2","deprecated":false,"title":"observation_input(user, base \\\\ %{})","anchor":"observation_input/2"},{"id":"observation_with_req_fields/2","deprecated":false,"title":"observation_with_req_fields(user, overrides \\\\ %{})","anchor":"observation_with_req_fields/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"attrs/0","deprecated":false,"title":"attrs()","anchor":"t:attrs/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(comm, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.Commitments","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.Commitments","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_id/2","deprecated":false,"title":"by_id(id, user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(comm)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(comm)","anchor":"preload_all/1"},{"id":"prep_attrs/2","deprecated":false,"title":"prep_attrs(attrs, creator \\\\ nil)","anchor":"prep_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(id)","anchor":"soft_delete/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(comm, user)","anchor":"soft_delete/2"},{"id":"update/3","deprecated":false,"title":"update(user, id, changes)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"commitment/2","deprecated":false,"title":"commitment(map, info)","anchor":"commitment/2"},{"id":"commitments_filtered/2","deprecated":false,"title":"commitments_filtered(args, arg2)","anchor":"commitments_filtered/2"},{"id":"create_commitment/2","deprecated":false,"title":"create_commitment(map, info)","anchor":"create_commitment/2"},{"id":"delete_commitment/2","deprecated":false,"title":"delete_commitment(map, info)","anchor":"delete_commitment/2"},{"id":"fetch_commitment/2","deprecated":false,"title":"fetch_commitment(info, id)","anchor":"fetch_commitment/2"},{"id":"fetch_created/3","deprecated":false,"title":"fetch_created(arg1, _, _)","anchor":"fetch_created/3"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(comm, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(comm, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(comm, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_satisfies_edge/3","deprecated":false,"title":"fetch_satisfies_edge(arg1, _, _)","anchor":"fetch_satisfies_edge/3"},{"id":"update_commitment/2","deprecated":false,"title":"update_commitment(map, info)","anchor":"update_commitment/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Commitment.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Commitment.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(intent, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_intents/3","deprecated":false,"title":"agent_intents(arg1, page_opts, info)","anchor":"agent_intents/3"},{"id":"agent_intents_edge/3","deprecated":false,"title":"agent_intents_edge(map, page_opts, info)","anchor":"agent_intents_edge/3"},{"id":"create_intent/2","deprecated":false,"title":"create_intent(map, info)","anchor":"create_intent/2"},{"id":"create_need/2","deprecated":false,"title":"create_need(map, info)","anchor":"create_need/2"},{"id":"create_offer/2","deprecated":false,"title":"create_offer(map, info)","anchor":"create_offer/2"},{"id":"delete_intent/2","deprecated":false,"title":"delete_intent(map, info)","anchor":"delete_intent/2"},{"id":"fetch_agent_intents_edge/3","deprecated":false,"title":"fetch_agent_intents_edge(page_opts, info, ids)","anchor":"fetch_agent_intents_edge/3"},{"id":"fetch_input_of_edge/3","deprecated":false,"title":"fetch_input_of_edge(thing, _, _)","anchor":"fetch_input_of_edge/3"},{"id":"fetch_intent/2","deprecated":false,"title":"fetch_intent(info, id)","anchor":"fetch_intent/2"},{"id":"fetch_intents/2","deprecated":false,"title":"fetch_intents(page_opts, info)","anchor":"fetch_intents/2"},{"id":"fetch_needs/2","deprecated":false,"title":"fetch_needs(page_opts, info)","anchor":"fetch_needs/2"},{"id":"fetch_offers/2","deprecated":false,"title":"fetch_offers(page_opts, info)","anchor":"fetch_offers/2"},{"id":"fetch_output_of_edge/3","deprecated":false,"title":"fetch_output_of_edge(thing, _, _)","anchor":"fetch_output_of_edge/3"},{"id":"fetch_provider_intents_edge/3","deprecated":false,"title":"fetch_provider_intents_edge(page_opts, info, ids)","anchor":"fetch_provider_intents_edge/3"},{"id":"fetch_resource_inventoried_as_edge/3","deprecated":false,"title":"fetch_resource_inventoried_as_edge(thing, _, _)","anchor":"fetch_resource_inventoried_as_edge/3"},{"id":"fetch_satisfied_by_edge/3","deprecated":false,"title":"fetch_satisfied_by_edge(arg1, _, _)","anchor":"fetch_satisfied_by_edge/3"},{"id":"intent/2","deprecated":false,"title":"intent(map, info)","anchor":"intent/2"},{"id":"intents/2","deprecated":false,"title":"intents(page_opts, info)","anchor":"intents/2"},{"id":"intents_filtered/2","deprecated":false,"title":"intents_filtered(args, info)","anchor":"intents_filtered/2"},{"id":"list_intents/2","deprecated":false,"title":"list_intents(page_opts, base_filters)","anchor":"list_intents/2"},{"id":"needs/2","deprecated":false,"title":"needs(page_opts, info)","anchor":"needs/2"},{"id":"offers/2","deprecated":false,"title":"offers(page_opts, info)","anchor":"offers/2"},{"id":"provider_intents/3","deprecated":false,"title":"provider_intents(arg1, page_opts, info)","anchor":"provider_intents/3"},{"id":"provider_intents_edge/3","deprecated":false,"title":"provider_intents_edge(map, page_opts, info)","anchor":"provider_intents_edge/3"},{"id":"update_intent/2","deprecated":false,"title":"update_intent(map, info)","anchor":"update_intent/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.Intents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.Intents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, current_user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, inputs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_action/1","deprecated":false,"title":"preload_action(intent)","anchor":"preload_action/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(intent)","anchor":"preload_all/1"},{"id":"prepare_attrs/2","deprecated":false,"title":"prepare_attrs(attrs, creator \\\\ nil)","anchor":"prepare_attrs/2"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(intent)","anchor":"soft_delete/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(id, current_user)","anchor":"soft_delete/2"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/4","deprecated":false,"title":"update(current_user, id, changes, verb \\\\ :update)","anchor":"update/4"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assign_to/4","deprecated":false,"title":"assign_to(assign_to, intent, socket, field \\\\ :provider)","anchor":"assign_to/4"},{"id":"create_from_list/6","deprecated":false,"title":"create_from_list(current_user, obj_attrs, list, tree_of_parent_ids, previous_indentation \\\\ \"\", latest_intent_id \\\\ nil)","anchor":"create_from_list/6"},{"id":"create_from_list/7","deprecated":false,"title":"create_from_list(_, _, list, _, _, _, _)","anchor":"create_from_list/7"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(arg1, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_param/3","deprecated":false,"title":"handle_param(binary, attrs, socket)","anchor":"handle_param/3"},{"id":"input_date/1","deprecated":false,"title":"input_date(date)","anchor":"input_date/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_verb/1","deprecated":false,"title":"update_verb(verb)","anchor":"update_verb/1"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Intent.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Intent.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(schema \\\\ Intent)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"attrs/0","deprecated":false,"title":"attrs()","anchor":"t:attrs/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"measure_fields/0","deprecated":false,"title":"measure_fields()","anchor":"measure_fields/0"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(satis, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(map, info)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(map, info)","anchor":"delete/2"},{"id":"event_or_commitment_resolve_type/2","deprecated":false,"title":"event_or_commitment_resolve_type(arg1, _)","anchor":"event_or_commitment_resolve_type/2"},{"id":"fetch_satisfaction/2","deprecated":false,"title":"fetch_satisfaction(info, id)","anchor":"fetch_satisfaction/2"},{"id":"fetch_satisfied_by_edge/3","deprecated":false,"title":"fetch_satisfied_by_edge(satis, _, _)","anchor":"fetch_satisfied_by_edge/3"},{"id":"fetch_satisfies_edge/3","deprecated":false,"title":"fetch_satisfies_edge(satis, _, _)","anchor":"fetch_satisfies_edge/3"},{"id":"satisfaction/2","deprecated":false,"title":"satisfaction(map, info)","anchor":"satisfaction/2"},{"id":"satisfactions_filtered/2","deprecated":false,"title":"satisfactions_filtered(args, info)","anchor":"satisfactions_filtered/2"},{"id":"update/2","deprecated":false,"title":"update(map, info)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(q, atom, bool)","anchor":"filter/3"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Planning.Satisfaction.Satisfactions","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Planning.Satisfaction.Satisfactions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_id/2","deprecated":false,"title":"by_id(id, user \\\\ nil)","anchor":"by_id/2"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(map)","anchor":"preload_all/1"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(id, user)","anchor":"soft_delete/2"},{"id":"update/3","deprecated":false,"title":"update(user, id, changes)","anchor":"update/3"}],"key":"functions"}]},{"id":"ValueFlows.Process","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(process, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/1","deprecated":false,"title":"validate_changeset(attrs \\\\ %{})","anchor":"validate_changeset/1"}],"key":"functions"}]},{"id":"ValueFlows.Process.LiveHandler","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.LiveHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/1","deprecated":false,"title":"changeset(attrs \\\\ %{})","anchor":"changeset/1"},{"id":"do_update/3","deprecated":false,"title":"do_update(id, attrs, socket)","anchor":"do_update/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"ValueFlows.Process.Processes","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.Processes","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, inputs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"inputs/2","deprecated":false,"title":"inputs(attrs, action_id \\\\ nil)","anchor":"inputs/2"},{"id":"intended_inputs/2","deprecated":false,"title":"intended_inputs(map, filters \\\\ [])","anchor":"intended_inputs/2"},{"id":"intended_outputs/2","deprecated":false,"title":"intended_outputs(map, filters \\\\ [])","anchor":"intended_outputs/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"outputs/2","deprecated":false,"title":"outputs(attrs, action_id \\\\ nil)","anchor":"outputs/2"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(process)","anchor":"preload_all/1"},{"id":"prepare_attrs/1","deprecated":false,"title":"prepare_attrs(attrs)","anchor":"prepare_attrs/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(process)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"trace/3","deprecated":false,"title":"trace(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"trace/3"},{"id":"track/3","deprecated":false,"title":"track(event, recurse_limit \\\\ Util.default_recurse_limit(), recurse_counter \\\\ 0)","anchor":"track/3"},{"id":"update/2","deprecated":false,"title":"update(process, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Process.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Process.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(proposal, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"agent_proposals/3","deprecated":false,"title":"agent_proposals(arg1, page_opts, info)","anchor":"agent_proposals/3"},{"id":"all_proposals/2","deprecated":false,"title":"all_proposals(page_opts, info)","anchor":"all_proposals/2"},{"id":"create_proposal/2","deprecated":false,"title":"create_proposal(map, info)","anchor":"create_proposal/2"},{"id":"delete_proposal/2","deprecated":false,"title":"delete_proposal(map, info)","anchor":"delete_proposal/2"},{"id":"eligible_location_edge/3","deprecated":false,"title":"eligible_location_edge(proposal, _, _)","anchor":"eligible_location_edge/3"},{"id":"fetch_proposal/2","deprecated":false,"title":"fetch_proposal(info, id)","anchor":"fetch_proposal/2"},{"id":"fetch_proposals/2","deprecated":false,"title":"fetch_proposals(page_opts, info)","anchor":"fetch_proposals/2"},{"id":"proposal/2","deprecated":false,"title":"proposal(map, info)","anchor":"proposal/2"},{"id":"proposals/2","deprecated":false,"title":"proposals(page_opts, info)","anchor":"proposals/2"},{"id":"proposals_filtered/2","deprecated":false,"title":"proposals_filtered(page_opts, _ \\\\ nil)","anchor":"proposals_filtered/2"},{"id":"update_proposal/2","deprecated":false,"title":"update_proposal(map, info)","anchor":"update_proposal/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.Proposals","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.Proposals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fields/2","deprecated":false,"title":"fields(group_fn, filters \\\\ [])","anchor":"fields/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"page/5","deprecated":false,"title":"page(cursor_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"page/5"},{"id":"pages/6","deprecated":false,"title":"pages(cursor_fn, group_fn, page_opts, base_filters \\\\ [], data_filters \\\\ [], count_filters \\\\ [])","anchor":"pages/6"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(proposal)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(proposal)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(proposal, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntent","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntent","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(published_in, publishes, attrs)","anchor":"changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntentQueries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntentQueries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedIntents","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedIntents","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"delete/1","deprecated":false,"title":"delete(proposed_intent)","anchor":"delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"propose_intent/3","deprecated":false,"title":"propose_intent(proposal, intent, attrs)","anchor":"propose_intent/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedTo","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedTo","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(proposed_to, proposed)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedToQueries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedToQueries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.ProposedTos","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.ProposedTos","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"delete/1","deprecated":false,"title":"delete(proposed_to)","anchor":"delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"propose_to/2","deprecated":false,"title":"propose_to(proposed_to, proposed)","anchor":"propose_to/2"}],"key":"functions"}]},{"id":"ValueFlows.Proposal.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Proposal.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.Util","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Util","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"attr_get_agent/3","deprecated":false,"title":"attr_get_agent(attrs, field, creator)","anchor":"attr_get_agent/3"},{"id":"can?/3","deprecated":false,"title":"can?(current_user, verb \\\\ :update, object)","anchor":"can?/3"},{"id":"change_measures/3","deprecated":false,"title":"change_measures(changeset, attrs, measure_fields)","anchor":"change_measures/3"},{"id":"common_filters/2","deprecated":false,"title":"common_filters(q, unknown_filter)","anchor":"common_filters/2"},{"id":"content_url_or_path/1","deprecated":false,"title":"content_url_or_path(content)","anchor":"content_url_or_path/1"},{"id":"default_recurse_limit/0","deprecated":false,"title":"default_recurse_limit()","anchor":"default_recurse_limit/0"},{"id":"handle_changeset_errors/3","deprecated":false,"title":"handle_changeset_errors(cs, attrs, fn_list)","anchor":"handle_changeset_errors/3"},{"id":"image_schema/0","deprecated":false,"title":"image_schema()","anchor":"image_schema/0"},{"id":"image_url/1","deprecated":false,"title":"image_url(thing)","anchor":"image_url/1"},{"id":"index_for_search/1","deprecated":false,"title":"index_for_search(object)","anchor":"index_for_search/1"},{"id":"indexing_format_creator/1","deprecated":false,"title":"indexing_format_creator(obj)","anchor":"indexing_format_creator/1"},{"id":"indexing_format_tags/1","deprecated":false,"title":"indexing_format_tags(obj)","anchor":"indexing_format_tags/1"},{"id":"map_values/2","deprecated":false,"title":"map_values(map, func)","anchor":"map_values/2"},{"id":"max_recurse_limit/0","deprecated":false,"title":"max_recurse_limit()","anchor":"max_recurse_limit/0"},{"id":"maybe_classification/2","deprecated":false,"title":"maybe_classification(user, tags)","anchor":"maybe_classification/2"},{"id":"maybe_classification_id/2","deprecated":false,"title":"maybe_classification_id(user, tags)","anchor":"maybe_classification_id/2"},{"id":"maybe_search/2","deprecated":false,"title":"maybe_search(search, facets)","anchor":"maybe_search/2"},{"id":"org_schema/0","deprecated":false,"title":"org_schema()","anchor":"org_schema/0"},{"id":"parse_measurement_attrs/2","deprecated":false,"title":"parse_measurement_attrs(attrs, user \\\\ nil)","anchor":"parse_measurement_attrs/2"},{"id":"prepare_opts_and_maybe_set_boundaries/3","deprecated":false,"title":"prepare_opts_and_maybe_set_boundaries(creator, thing, opts \\\\ [])","anchor":"prepare_opts_and_maybe_set_boundaries/3"},{"id":"publish/2","deprecated":false,"title":"publish(thing, verb)","anchor":"publish/2"},{"id":"publish/4","deprecated":false,"title":"publish(creator, verb, thing, opts \\\\ [])","anchor":"publish/4"},{"id":"search_for_matches/1","deprecated":false,"title":"search_for_matches(map)","anchor":"search_for_matches/1"},{"id":"try_tag_thing/3","deprecated":false,"title":"try_tag_thing(user, thing, attrs)","anchor":"try_tag_thing/3"},{"id":"user_or_org_schema/0","deprecated":false,"title":"user_or_org_schema()","anchor":"user_or_org_schema/0"},{"id":"user_schema/0","deprecated":false,"title":"user_schema()","anchor":"user_schema/0"}],"key":"functions"}]},{"id":"ValueFlows.Util.Federation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.Util.Federation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_object_id/1","deprecated":false,"title":"activity_object_id(map)","anchor":"activity_object_id/1"},{"id":"ap_graphql_fields/2","deprecated":false,"title":"ap_graphql_fields(e, field_filters \\\\ [])","anchor":"ap_graphql_fields/2"},{"id":"ap_prepare_object/1","deprecated":false,"title":"ap_prepare_object(obj)","anchor":"ap_prepare_object/1"},{"id":"ap_publish/3","deprecated":false,"title":"ap_publish(user, verb, thing)","anchor":"ap_publish/3"},{"id":"ap_publish_activity/6","deprecated":false,"title":"ap_publish_activity(subject, activity_type, schema_type, thing, query_depth \\\\ 2, extra_field_filters \\\\ [])","anchor":"ap_publish_activity/6"},{"id":"ap_receive_activity/4","deprecated":false,"title":"ap_receive_activity(creator, activity, attrs, fun)","anchor":"ap_receive_activity/4"},{"id":"fetch_api_object/4","deprecated":false,"title":"fetch_api_object(id, schema_type, query_depth \\\\ 2, extra_field_filters \\\\ [])","anchor":"fetch_api_object/4"},{"id":"maybe_create_nested_object/3","deprecated":false,"title":"maybe_create_nested_object(creator, object_or_id, parent_key)","anchor":"maybe_create_nested_object/3"},{"id":"maybe_id/2","deprecated":false,"title":"maybe_id(thing, key)","anchor":"maybe_id/2"},{"id":"struct_to_json/1","deprecated":false,"title":"struct_to_json(struct)","anchor":"struct_to_json/1"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(calculation, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.GraphQL","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.GraphQL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_value_calculation/2","deprecated":false,"title":"create_value_calculation(map, info)","anchor":"create_value_calculation/2"},{"id":"delete_value_calculation/2","deprecated":false,"title":"delete_value_calculation(map, info)","anchor":"delete_value_calculation/2"},{"id":"fetch_value_calculation/2","deprecated":false,"title":"fetch_value_calculation(info, id)","anchor":"fetch_value_calculation/2"},{"id":"fetch_value_calculations/2","deprecated":false,"title":"fetch_value_calculations(page_opts, info)","anchor":"fetch_value_calculations/2"},{"id":"resource_conforms_to_edge/3","deprecated":false,"title":"resource_conforms_to_edge(thing, _, _)","anchor":"resource_conforms_to_edge/3"},{"id":"update_value_calculation/2","deprecated":false,"title":"update_value_calculation(map, info)","anchor":"update_value_calculation/2"},{"id":"value_action_edge/3","deprecated":false,"title":"value_action_edge(thing, opts, info)","anchor":"value_action_edge/3"},{"id":"value_calculation/2","deprecated":false,"title":"value_calculation(map, info)","anchor":"value_calculation/2"},{"id":"value_calculations/2","deprecated":false,"title":"value_calculations(page_opts, info)","anchor":"value_calculations/2"},{"id":"value_resource_conforms_to_edge/3","deprecated":false,"title":"value_resource_conforms_to_edge(thing, _, _)","anchor":"value_resource_conforms_to_edge/3"},{"id":"value_unit_edge/3","deprecated":false,"title":"value_unit_edge(thing, _, _)","anchor":"value_unit_edge/3"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.Queries","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.Queries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"ValueFlows.ValueCalculation.ValueCalculations","deprecated":false,"group":"Feature extensions","title":"ValueFlows.ValueCalculation.ValueCalculations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_to/2","deprecated":false,"title":"apply_to(event, calc)","anchor":"apply_to/2"},{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"preload_all/1","deprecated":false,"title":"preload_all(calculation)","anchor":"preload_all/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(calculation)","anchor":"soft_delete/1"},{"id":"update/2","deprecated":false,"title":"update(calculation, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Breadpub","nodeGroups":[{"name":"Functions","nodes":[{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.IntentLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.IntentLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.IntentLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.MapLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.MapLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.MapLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.Web.HomeLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.Web.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.Web.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Breadpub.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Breadpub.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Breadpub.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Classify","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Classify","nodeGroups":[{"name":"Functions","nodes":[{"id":"arrange_categories_tree/1","deprecated":false,"title":"arrange_categories_tree(categories)","anchor":"arrange_categories_tree/1"},{"id":"ensure_update_allowed/2","deprecated":false,"title":"ensure_update_allowed(user, c)","anchor":"ensure_update_allowed/2"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"maybe_unindex/1","deprecated":false,"title":"maybe_unindex(object)","anchor":"maybe_unindex/1"},{"id":"my_followed_tree/2","deprecated":false,"title":"my_followed_tree(current_user, opts)","anchor":"my_followed_tree/2"},{"id":"publish/5","deprecated":false,"title":"publish(creator, verb, item, attrs, for_module \\\\ __MODULE__)","anchor":"publish/5"}],"key":"functions"}]},{"id":"Bonfire.Classify.Categories","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Categories","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Categories","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, category)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"attrs_prepare_tree/2","deprecated":false,"title":"attrs_prepare_tree(creator, attrs)","anchor":"attrs_prepare_tree/2"},{"id":"attrs_with_username/1","deprecated":false,"title":"attrs_with_username(attrs)","anchor":"attrs_with_username/1"},{"id":"by_username/2","deprecated":false,"title":"by_username(u, opts \\\\ [])","anchor":"by_username/2"},{"id":"clean_username/1","deprecated":false,"title":"clean_username(input)","anchor":"clean_username/1"},{"id":"create/3","deprecated":false,"title":"create(creator, attrs, is_local? \\\\ true)","anchor":"create/3"},{"id":"create_remote/1","deprecated":false,"title":"create_remote(attrs)","anchor":"create_remote/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"format_actor/1","deprecated":false,"title":"format_actor(cat)","anchor":"format_actor/1"},{"id":"get/2","deprecated":false,"title":"get(id, filters_and_or_opts \\\\ [:default])","anchor":"get/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"indexing_object_format_name/1","deprecated":false,"title":"indexing_object_format_name(object)","anchor":"indexing_object_format_name/1"},{"id":"indexing_object_format_parent/1","deprecated":false,"title":"indexing_object_format_parent(obj)","anchor":"indexing_object_format_parent/1"},{"id":"list/2","deprecated":false,"title":"list(filters \\\\ [:default], opts \\\\ [])","anchor":"list/2"},{"id":"list_tree/2","deprecated":false,"title":"list_tree(filters \\\\ [:default, tree_max_depth: 2], opts \\\\ [limit: 100])","anchor":"list_tree/2"},{"id":"moderators/1","deprecated":false,"title":"moderators(category)","anchor":"moderators/1"},{"id":"name_already_taken?/1","deprecated":false,"title":"name_already_taken?(changeset)","anchor":"name_already_taken?/1"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put_attrs_with_parent_category/2","deprecated":false,"title":"put_attrs_with_parent_category(attrs, parent_category)","anchor":"put_attrs_with_parent_category/2"},{"id":"put_generated_username/2","deprecated":false,"title":"put_generated_username(attrs, username)","anchor":"put_generated_username/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(c, user)","anchor":"soft_delete/2"},{"id":"try_several_usernames/4","deprecated":false,"title":"try_several_usernames(attrs, original_username, try_username, attempt \\\\ 1)","anchor":"try_several_usernames/4"},{"id":"update/4","deprecated":false,"title":"update(user \\\\ nil, category, attrs, is_local? \\\\ true)","anchor":"update/4"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(cat, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(cat, params)","anchor":"update_remote_actor/2"},{"id":"username_with_parent/2","deprecated":false,"title":"username_with_parent(arg1, name)","anchor":"username_with_parent/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.Category","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Category","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Category","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"base_create_changeset/2","deprecated":false,"title":"base_create_changeset(attrs, is_local?)","anchor":"base_create_changeset/2"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, attrs, is_local? \\\\ true)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(category, attrs, is_local? \\\\ true)","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"Bonfire.Classify.Category.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Category.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Category.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, table_or_tables, jq \\\\ :left)","anchor":"join_to/3"},{"id":"queries/4","deprecated":false,"title":"queries(query, base_filters, data_filters, count_filters)","anchor":"queries/4"},{"id":"query/1","deprecated":false,"title":"query(q \\\\ Category)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Classify.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, url, socket)","anchor":"handle_params/3"},{"id":"mounted/3","deprecated":false,"title":"mounted(params, session, socket)","anchor":"mounted/3"},{"id":"new/3","deprecated":false,"title":"new(type \\\\ :topic, attrs, socket)","anchor":"new/3"},{"id":"set_image/5","deprecated":false,"title":"set_image(atom, object, uploaded_media, assign_field, socket)","anchor":"set_image/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Classify.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Classify.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Classify.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"category/1","deprecated":false,"title":"category(base \\\\ %{})","anchor":"category/1"},{"id":"fake_category!/3","deprecated":false,"title":"fake_category!(user, parent_category \\\\ nil, overrides \\\\ %{})","anchor":"fake_category!/3"}],"key":"functions"}]},{"id":"Bonfire.Classify.Tree","deprecated":false,"group":"Feature extensions","title":"Bonfire.Classify.Tree","sections":[],"nested_context":"Bonfire","nested_title":".Classify.Tree","nodeGroups":[{"name":"Functions","nodes":[{"id":"ancestor_ids/1","deprecated":false,"title":"ancestor_ids(schema)","anchor":"ancestor_ids/1"},{"id":"ancestors/1","deprecated":false,"title":"ancestors(schema)","anchor":"ancestors/1"},{"id":"arrange/2","deprecated":false,"title":"arrange(structs_list, opts \\\\ [])","anchor":"arrange/2"},{"id":"build_child/1","deprecated":false,"title":"build_child(schema)","anchor":"build_child/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(tree \\\\ %Tree{}, attrs)","anchor":"changeset/2"},{"id":"children/1","deprecated":false,"title":"children(schema)","anchor":"children/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"depth/1","deprecated":false,"title":"depth(schema)","anchor":"depth/1"},{"id":"descendants/1","deprecated":false,"title":"descendants(schema)","anchor":"descendants/1"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"make_child_of/2","deprecated":false,"title":"make_child_of(changeset, parent)","anchor":"make_child_of/2"},{"id":"parent/1","deprecated":false,"title":"parent(schema)","anchor":"parent/1"},{"id":"parent_id/1","deprecated":false,"title":"parent_id(schema)","anchor":"parent_id/1"},{"id":"path/1","deprecated":false,"title":"path(schema)","anchor":"path/1"},{"id":"path_ids/1","deprecated":false,"title":"path_ids(schema)","anchor":"path_ids/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"put_tree/3","deprecated":false,"title":"put_tree(changeset, custodian, parent)","anchor":"put_tree/3"},{"id":"root/1","deprecated":false,"title":"root(schema)","anchor":"root/1"},{"id":"root?/1","deprecated":false,"title":"root?(schema)","anchor":"root?/1"},{"id":"root_id/1","deprecated":false,"title":"root_id(schema)","anchor":"root_id/1"},{"id":"siblings/1","deprecated":false,"title":"siblings(schema)","anchor":"siblings/1"},{"id":"subtree/1","deprecated":false,"title":"subtree(schema)","anchor":"subtree/1"},{"id":"where_depth/2","deprecated":false,"title":"where_depth(query \\\\ __MODULE__, depth_params)","anchor":"where_depth/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub","sections":[{"id":"Testing","anchor":"module-testing"},{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub","nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/1","deprecated":false,"title":"disable(scope \\\\ :instance)","anchor":"disable/1"},{"id":"federating?/1","deprecated":false,"title":"federating?(subject \\\\ nil)","anchor":"federating?/1"},{"id":"federating_default?/0","deprecated":false,"title":"federating_default?()","anchor":"federating_default?/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"set_federating/2","deprecated":false,"title":"set_federating(subject, set)","anchor":"set_federating/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Adapter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Adapter","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Adapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(actor, activity_data)","anchor":"external_followers_for_activity/2"},{"id":"federate_actor?/3","deprecated":false,"title":"federate_actor?(actor, direction \\\\ nil, by_actor \\\\ nil)","anchor":"federate_actor?/3"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(ap_id)","anchor":"get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(actor)","anchor":"get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(actor)","anchor":"get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(id_or_username_or_object)","anchor":"get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(activity)","anchor":"handle_activity/1"},{"id":"local_actor_updated/2","deprecated":false,"title":"local_actor_updated(character, is_local?)","anchor":"local_actor_updated/2"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(actor)","anchor":"maybe_create_remote_actor/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(pointer_id, manually_fetching?)","anchor":"maybe_publish_object/2"},{"id":"redirect_to_actor/1","deprecated":false,"title":"redirect_to_actor(username)","anchor":"redirect_to_actor/1"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(actor, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(actor)","anchor":"update_remote_actor/1"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(character, data)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.AdapterUtils","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.AdapterUtils","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.AdapterUtils","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_actors/1","deprecated":false,"title":"all_actors(activity)","anchor":"all_actors/1"},{"id":"all_recipients/2","deprecated":false,"title":"all_recipients(activity, fields \\\\ [:to, :bto, :cc, :bcc, :audience])","anchor":"all_recipients/2"},{"id":"ap_base_url/0","deprecated":false,"title":"ap_base_url()","anchor":"ap_base_url/0"},{"id":"apply_fun_style/3","deprecated":false,"title":"apply_fun_style(fallback_module \\\\ __MODULE__, fun, args)","anchor":"apply_fun_style/3"},{"id":"character_module/1","deprecated":false,"title":"character_module(struct)","anchor":"character_module/1"},{"id":"character_to_actor/1","deprecated":false,"title":"character_to_actor(character)","anchor":"character_to_actor/1"},{"id":"create_author_object/1","deprecated":false,"title":"create_author_object(map)","anchor":"create_author_object/1"},{"id":"create_remote_actor/1","deprecated":false,"title":"create_remote_actor(actor)","anchor":"create_remote_actor/1"},{"id":"determine_recipients/2","deprecated":false,"title":"determine_recipients(actor, comment)","anchor":"determine_recipients/2"},{"id":"determine_recipients/3","deprecated":false,"title":"determine_recipients(actor, comment, parent)","anchor":"determine_recipients/3"},{"id":"determine_recipients/4","deprecated":false,"title":"determine_recipients(actor, comment, to, cc)","anchor":"determine_recipients/4"},{"id":"format_actor/2","deprecated":false,"title":"format_actor(user_etc, type \\\\ \"Person\")","anchor":"format_actor/2"},{"id":"get_actor_by_ap_id/2","deprecated":false,"title":"get_actor_by_ap_id(ap_id, local_instance \\\\ nil)","anchor":"get_actor_by_ap_id/2"},{"id":"get_actor_username/1","deprecated":false,"title":"get_actor_username(obj)","anchor":"get_actor_username/1"},{"id":"get_author/1","deprecated":false,"title":"get_author(author)","anchor":"get_author/1"},{"id":"get_by_url_ap_id_or_username/2","deprecated":false,"title":"get_by_url_ap_id_or_username(q, opts \\\\ [])","anchor":"get_by_url_ap_id_or_username/2"},{"id":"get_character/2","deprecated":false,"title":"get_character(q, opts \\\\ [])","anchor":"get_character/2"},{"id":"get_character_by_ap_id/1","deprecated":false,"title":"get_character_by_ap_id(ap_id)","anchor":"get_character_by_ap_id/1"},{"id":"get_character_by_ap_id!/1","deprecated":false,"title":"get_character_by_ap_id!(ap_id)","anchor":"get_character_by_ap_id!/1"},{"id":"get_character_by_id/2","deprecated":false,"title":"get_character_by_id(id, opts \\\\ [skip_boundary_check: true])","anchor":"get_character_by_id/2"},{"id":"get_character_by_username/1","deprecated":false,"title":"get_character_by_username(username)","anchor":"get_character_by_username/1"},{"id":"get_context_ap_id/1","deprecated":false,"title":"get_context_ap_id(arg1)","anchor":"get_context_ap_id/1"},{"id":"get_creator_ap_id/1","deprecated":false,"title":"get_creator_ap_id(arg1)","anchor":"get_creator_ap_id/1"},{"id":"get_different_creator_ap_id/1","deprecated":false,"title":"get_different_creator_ap_id(character)","anchor":"get_different_creator_ap_id/1"},{"id":"get_in_reply_to/1","deprecated":false,"title":"get_in_reply_to(comment)","anchor":"get_in_reply_to/1"},{"id":"get_local_actor_by_ap_id/1","deprecated":false,"title":"get_local_actor_by_ap_id(ap_id)","anchor":"get_local_actor_by_ap_id/1"},{"id":"get_local_character_by_ap_id/2","deprecated":false,"title":"get_local_character_by_ap_id(ap_id, local_instance \\\\ nil)","anchor":"get_local_character_by_ap_id/2"},{"id":"get_object_ap_id/1","deprecated":false,"title":"get_object_ap_id(arg1)","anchor":"get_object_ap_id/1"},{"id":"get_object_ap_id!/1","deprecated":false,"title":"get_object_ap_id!(object)","anchor":"get_object_ap_id!/1"},{"id":"get_object_or_actor_by_ap_id!/1","deprecated":false,"title":"get_object_or_actor_by_ap_id!(ap_id)","anchor":"get_object_or_actor_by_ap_id!/1"},{"id":"get_or_create_service_character/2","deprecated":false,"title":"get_or_create_service_character(service_character_id \\\\ service_character_id(), service_character_username \\\\ service_character_username())","anchor":"get_or_create_service_character/2"},{"id":"get_or_fetch_and_create_by_uri/2","deprecated":false,"title":"get_or_fetch_and_create_by_uri(q, opts \\\\ [])","anchor":"get_or_fetch_and_create_by_uri/2"},{"id":"get_or_fetch_and_create_by_username/2","deprecated":false,"title":"get_or_fetch_and_create_by_username(q, opts \\\\ [])","anchor":"get_or_fetch_and_create_by_username/2"},{"id":"get_or_fetch_character_by_ap_id/1","deprecated":false,"title":"get_or_fetch_character_by_ap_id(actor_or_ap_id)","anchor":"get_or_fetch_character_by_ap_id/1"},{"id":"get_pointer_id_by_ap_id/1","deprecated":false,"title":"get_pointer_id_by_ap_id(ap_id)","anchor":"get_pointer_id_by_ap_id/1"},{"id":"id_or_object_id/1","deprecated":false,"title":"id_or_object_id(id)","anchor":"id_or_object_id/1"},{"id":"is_follow?/1","deprecated":false,"title":"is_follow?(arg1)","anchor":"is_follow?/1"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"is_local_collection?/1","deprecated":false,"title":"is_local_collection?(ap_id)","anchor":"is_local_collection?/1"},{"id":"is_local_collection_or_built_in?/1","deprecated":false,"title":"is_local_collection_or_built_in?(ap_id)","anchor":"is_local_collection_or_built_in?/1"},{"id":"local_actor_ids/1","deprecated":false,"title":"local_actor_ids(actors)","anchor":"local_actor_ids/1"},{"id":"log/1","deprecated":false,"title":"log(l)","anchor":"log/1"},{"id":"maybe_add_aliases/2","deprecated":false,"title":"maybe_add_aliases(user_etc, aliases)","anchor":"maybe_add_aliases/2"},{"id":"maybe_attach_property_value/2","deprecated":false,"title":"maybe_attach_property_value(key, url)","anchor":"maybe_attach_property_value/2"},{"id":"maybe_create_banner_object/2","deprecated":false,"title":"maybe_create_banner_object(url, actor)","anchor":"maybe_create_banner_object/2"},{"id":"maybe_create_icon_object/2","deprecated":false,"title":"maybe_create_icon_object(url, actor)","anchor":"maybe_create_icon_object/2"},{"id":"maybe_create_image_object/2","deprecated":false,"title":"maybe_create_image_object(url, actor)","anchor":"maybe_create_image_object/2"},{"id":"maybe_fix_image_object/1","deprecated":false,"title":"maybe_fix_image_object(url)","anchor":"maybe_fix_image_object/1"},{"id":"maybe_format_image_object_from_path/1","deprecated":false,"title":"maybe_format_image_object_from_path(url)","anchor":"maybe_format_image_object_from_path/1"},{"id":"maybe_pointer_id_for_ap_id/1","deprecated":false,"title":"maybe_pointer_id_for_ap_id(ap_id)","anchor":"maybe_pointer_id_for_ap_id/1"},{"id":"preload_peered/1","deprecated":false,"title":"preload_peered(object)","anchor":"preload_peered/1"},{"id":"public_uri/0","deprecated":false,"title":"public_uri()","anchor":"public_uri/0"},{"id":"return_pointable/2","deprecated":false,"title":"return_pointable(f, opts \\\\ [skip_boundary_check: true])","anchor":"return_pointable/2"},{"id":"return_pointer/2","deprecated":false,"title":"return_pointer(id, opts)","anchor":"return_pointer/2"},{"id":"service_character_id/0","deprecated":false,"title":"service_character_id()","anchor":"service_character_id/0"},{"id":"service_character_username/0","deprecated":false,"title":"service_character_username()","anchor":"service_character_username/0"},{"id":"the_ap_id/1","deprecated":false,"title":"the_ap_id(ap_id)","anchor":"the_ap_id/1"},{"id":"validate_url/1","deprecated":false,"title":"validate_url(str)","anchor":"validate_url/1"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.BoundariesMRF","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.BoundariesMRF","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.BoundariesMRF","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_blocked?/3","deprecated":false,"title":"actor_blocked?(actor, direction \\\\ nil, by_user \\\\ nil)","anchor":"actor_blocked?/3"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.FederationModules","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.FederationModules","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.FederationModules","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"c:federation_module/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"app_modules/0","deprecated":false,"title":"app_modules()","anchor":"app_modules/0"},{"id":"federation_module/2","deprecated":false,"title":"federation_module(query, modules \\\\ federation_modules_data_types())","anchor":"federation_module/2"},{"id":"federation_module!/2","deprecated":false,"title":"federation_module!(query, modules \\\\ federation_modules_data_types())","anchor":"federation_module!/2"},{"id":"federation_modules/1","deprecated":false,"title":"federation_modules(queries)","anchor":"federation_modules/1"},{"id":"federation_modules_data_types/0","deprecated":false,"title":"federation_modules_data_types()","anchor":"federation_modules_data_types/0"},{"id":"maybe_federation_module/2","deprecated":false,"title":"maybe_federation_module(query, fallback \\\\ nil)","anchor":"maybe_federation_module/2"},{"id":"modules/0","deprecated":false,"title":"modules()","anchor":"modules/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Incoming","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Incoming","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Incoming","nodeGroups":[{"name":"Functions","nodes":[{"id":"no_federation_module_match/2","deprecated":false,"title":"no_federation_module_match(error, attrs \\\\ nil)","anchor":"no_federation_module_match/2"},{"id":"receive_activity/1","deprecated":false,"title":"receive_activity(activity_id)","anchor":"receive_activity/1"},{"id":"receive_activity/2","deprecated":false,"title":"receive_activity(activity, object)","anchor":"receive_activity/2"},{"id":"receive_object/2","deprecated":false,"title":"receive_object(creator, object_uri)","anchor":"receive_object/2"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Instances","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Instances","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Instances","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(canonical_uri)","anchor":"get/1"},{"id":"get_by_domain/1","deprecated":false,"title":"get_by_domain(canonical_uri)","anchor":"get_by_domain/1"},{"id":"get_by_id/1","deprecated":false,"title":"get_by_id(id)","anchor":"get_by_id/1"},{"id":"get_or_create/1","deprecated":false,"title":"get_or_create(canonical_uri)","anchor":"get_or_create/1"},{"id":"get_or_create_instance_circle/1","deprecated":false,"title":"get_or_create_instance_circle(host)","anchor":"get_or_create_instance_circle/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(peered, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"list_paginated/1","deprecated":false,"title":"list_paginated(opts)","anchor":"list_paginated/1"},{"id":"list_query/0","deprecated":false,"title":"list_query()","anchor":"list_query/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.LoadTesting","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.LoadTesting","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.LoadTesting","nodeGroups":[{"name":"Functions","nodes":[{"id":"cases/0","deprecated":false,"title":"cases()","anchor":"cases/0"},{"id":"run_bench/0","deprecated":false,"title":"run_bench()","anchor":"run_bench/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.NodeinfoAdapter","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.NodeinfoAdapter","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"gather_nodeinfo_data/0","deprecated":false,"title":"gather_nodeinfo_data()","anchor":"gather_nodeinfo_data/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Outgoing","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Outgoing","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Outgoing","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_activity!/1","deprecated":false,"title":"ap_activity!(activity)","anchor":"ap_activity!/1"},{"id":"federate_outgoing?/1","deprecated":false,"title":"federate_outgoing?(subject \\\\ nil)","anchor":"federate_outgoing?/1"},{"id":"maybe_federate/4","deprecated":false,"title":"maybe_federate(subject, verb, thing, opts \\\\ [])","anchor":"maybe_federate/4"},{"id":"preparation_error/2","deprecated":false,"title":"preparation_error(error, object)","anchor":"preparation_error/2"},{"id":"push_actor_update/1","deprecated":false,"title":"push_actor_update(actor)","anchor":"push_actor_update/1"},{"id":"push_now!/1","deprecated":false,"title":"push_now!(activity)","anchor":"push_now!/1"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Peered","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Peered","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Peered","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(id)","anchor":"get/1"},{"id":"get_canonical_uri/1","deprecated":false,"title":"get_canonical_uri(obj_or_id)","anchor":"get_canonical_uri/1"},{"id":"is_blocked?/3","deprecated":false,"title":"is_blocked?(peered, block_type \\\\ :any, opts \\\\ [])","anchor":"is_blocked?/3"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"save_canonical_uri/3","deprecated":false,"title":"save_canonical_uri(object_or_actor, canonical_uri, opts \\\\ [])","anchor":"save_canonical_uri/3"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Federate.ActivityPub.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Federate.ActivityPub.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Federate.ActivityPub.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_json/1","deprecated":false,"title":"actor_json(binary)","anchor":"actor_json/1"},{"id":"fake_remote_user/1","deprecated":false,"title":"fake_remote_user(actor_id \\\\ \"https://mocked.local/users/karen\")","anchor":"fake_remote_user/1"},{"id":"webfingered/0","deprecated":false,"title":"webfingered()","anchor":"webfingered/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Geolocate","nodeGroups":[{"name":"Functions","nodes":[{"id":"start/2","deprecated":false,"title":"start(type, args)","anchor":"start/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geocode","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geocode","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geocode","nodeGroups":[{"name":"Functions","nodes":[{"id":"coordinates/1","deprecated":false,"title":"coordinates(query)","anchor":"coordinates/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geolocation","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geolocation","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geolocation","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, attrs, opts \\\\ [])","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"follow_filters/0","deprecated":false,"title":"follow_filters()","anchor":"follow_filters/0"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(geolocation, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Geolocations","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Geolocations","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Geolocations","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, context, attrs)","anchor":"create/3"},{"id":"cursor/1","deprecated":false,"title":"cursor(atom)","anchor":"cursor/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(u)","anchor":"indexing_object_format/1"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"many!/1","deprecated":false,"title":"many!(filters \\\\ [])","anchor":"many!/1"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"populate_coordinates/1","deprecated":false,"title":"populate_coordinates(objects)","anchor":"populate_coordinates/1"},{"id":"populate_result/1","deprecated":false,"title":"populate_result(geo)","anchor":"populate_result/1"},{"id":"resolve_mappable_address/1","deprecated":false,"title":"resolve_mappable_address(attrs)","anchor":"resolve_mappable_address/1"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"soft_delete/2","deprecated":false,"title":"soft_delete(geo, opts)","anchor":"soft_delete/2"},{"id":"test_cursor/1","deprecated":false,"title":"test_cursor(atom)","anchor":"test_cursor/1"},{"id":"thing_add_location/3","deprecated":false,"title":"thing_add_location(user, thing, mappable_address)","anchor":"thing_add_location/3"},{"id":"update/3","deprecated":false,"title":"update(user, geolocation, attrs)","anchor":"update/3"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.GraphQL.Hydration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.GraphQL.Hydration","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.GraphQL.Hydration","nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"create_in_autocomplete/2","deprecated":false,"title":"create_in_autocomplete(creator, name)","anchor":"create_in_autocomplete/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(geolocation)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Places","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Places","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Places","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_place/2","deprecated":false,"title":"fetch_place(id, opts)","anchor":"fetch_place/2"},{"id":"fetch_place_things/2","deprecated":false,"title":"fetch_place_things(filters, opts)","anchor":"fetch_place_things/2"},{"id":"fetch_places/1","deprecated":false,"title":"fetch_places(opts)","anchor":"fetch_places/1"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"address/0","deprecated":false,"title":"address()","anchor":"address/0"},{"id":"fake_geolocation!/3","deprecated":false,"title":"fake_geolocation!(user \\\\ nil, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_geolocation!/3"},{"id":"geolocation/1","deprecated":false,"title":"geolocation(base \\\\ %{})","anchor":"geolocation/1"},{"id":"geolocation_input/1","deprecated":false,"title":"geolocation_input(base \\\\ %{})","anchor":"geolocation_input/1"},{"id":"mappable_address/0","deprecated":false,"title":"mappable_address()","anchor":"mappable_address/0"}],"key":"functions"}]},{"id":"Bonfire.Geolocate.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Geolocate.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Geolocate.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Invite.Links","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, attrs)","anchor":"create/2"},{"id":"date_expires/1","deprecated":false,"title":"date_expires(invite)","anchor":"date_expires/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(invite)","anchor":"expired?/1"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"redeem/1","deprecated":false,"title":"redeem(invite)","anchor":"redeem/1"},{"id":"redeemable?/1","deprecated":false,"title":"redeemable?(invite)","anchor":"redeemable?/1"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Fake"},{"id":"Bonfire.Invite.Links.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Invite.Links.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Invite.Links.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Invite.Links.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.InviteLink","deprecated":false,"group":"Feature extensions","title":"Bonfire.InviteLink","sections":[],"nested_context":"Bonfire","nested_title":".InviteLink","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(obj \\\\ %InviteLink{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Label","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label","sections":[{"id":"Features","anchor":"module-features"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Label","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(label \\\\ %Label{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Label.Acts.LabelObject","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Acts.LabelObject","sections":[],"nested_context":"Bonfire","nested_title":".Label.Acts.LabelObject"},{"id":"Bonfire.Label.ContentLabels","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.ContentLabels","sections":[],"nested_context":"Bonfire","nested_title":".Label.ContentLabels","nodeGroups":[{"name":"Functions","nodes":[{"id":"built_in_ids/0","deprecated":false,"title":"built_in_ids()","anchor":"built_in_ids/0"},{"id":"built_ins/0","deprecated":false,"title":"built_ins()","anchor":"built_ins/0"},{"id":"can_label?/3","deprecated":false,"title":"can_label?(context, object, object_boundary \\\\ nil)","anchor":"can_label?/3"},{"id":"labels/0","deprecated":false,"title":"labels()","anchor":"labels/0"},{"id":"labels_under/1","deprecated":false,"title":"labels_under(parent_label \\\\ parent_label_id())","anchor":"labels_under/1"},{"id":"parent_label_id/0","deprecated":false,"title":"parent_label_id()","anchor":"parent_label_id/0"}],"key":"functions"}]},{"id":"Bonfire.Label.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Label.Fake"},{"id":"Bonfire.Label.Labelling","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Labelling","sections":[],"nested_context":"Bonfire","nested_title":".Label.Labelling","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, label)","anchor":"ap_publish_activity/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"date_last_labelled/2","deprecated":false,"title":"date_last_labelled(user, object)","anchor":"date_last_labelled/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"label_object/3","deprecated":false,"title":"label_object(label, object, opts \\\\ [])","anchor":"label_object/3"},{"id":"labelled?/2","deprecated":false,"title":"labelled?(user, object)","anchor":"labelled?/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(id, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :page)","anchor":"run_epic/4"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unlabel/3","deprecated":false,"title":"unlabel(labeler, labelled, opts \\\\ [])","anchor":"unlabel/3"}],"key":"functions"}]},{"id":"Bonfire.Label.Labels","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Labels","sections":[],"nested_context":"Bonfire","nested_title":".Label.Labels","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/4","deprecated":false,"title":"create(id, name, parent_id \\\\ nil, username \\\\ nil)","anchor":"create/4"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_or_create/4","deprecated":false,"title":"get_or_create(id, name, parent_id \\\\ nil, username \\\\ nil)","anchor":"get_or_create/4"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"top_label_id/0","deprecated":false,"title":"top_label_id()","anchor":"top_label_id/0"}],"key":"functions"}]},{"id":"Bonfire.Label.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Label.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(current_user, object, tags, params)","anchor":"maybe_tag/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Label.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Label.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Label.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Label.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Label.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Localise","deprecated":false,"group":"Feature extensions","title":"Bonfire.Localise","sections":[],"nested_context":"Bonfire","nested_title":".Localise"},{"id":"Bonfire.Me","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Me","nodeGroups":[{"name":"Functions","nodes":[{"id":"make_account_and_user/4","deprecated":false,"title":"make_account_and_user(name, email, password, opts \\\\ [])","anchor":"make_account_and_user/4"},{"id":"make_account_only/3","deprecated":false,"title":"make_account_only(email, password, opts \\\\ [])","anchor":"make_account_only/3"},{"id":"make_admin/1","deprecated":false,"title":"make_admin(username)","anchor":"make_admin/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts","nodeGroups":[{"name":"Types","nodes":[{"id":"changeset_name/0","deprecated":false,"title":"changeset_name()","anchor":"t:changeset_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allow_signup?/1","deprecated":false,"title":"allow_signup?(opts)","anchor":"allow_signup?/1"},{"id":"change_email/3","deprecated":false,"title":"change_email(current_account, params_or_changeset, opts \\\\ [])","anchor":"change_email/3"},{"id":"change_password/3","deprecated":false,"title":"change_password(current_account, params_or_changeset, opts \\\\ [])","anchor":"change_password/3"},{"id":"change_password/4","deprecated":false,"title":"change_password(current_account, cs, params, opts)","anchor":"change_password/4"},{"id":"changeset/3","deprecated":false,"title":"changeset(changeset_name, params, opts \\\\ [])","anchor":"changeset/3"},{"id":"confirm_email/2","deprecated":false,"title":"confirm_email(account_or_token, opts \\\\ [])","anchor":"confirm_email/2"},{"id":"confirm_email_manually/1","deprecated":false,"title":"confirm_email_manually(email)","anchor":"confirm_email_manually/1"},{"id":"count/0","deprecated":false,"title":"count()","anchor":"count/0"},{"id":"delete/2","deprecated":false,"title":"delete(account, opts \\\\ [])","anchor":"delete/2"},{"id":"do_signup/2","deprecated":false,"title":"do_signup(cs_or_params, opts)","anchor":"do_signup/2"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(account)","anchor":"enqueue_delete/1"},{"id":"fetch_current/1","deprecated":false,"title":"fetch_current(id)","anchor":"fetch_current/1"},{"id":"get_by_email/1","deprecated":false,"title":"get_by_email(email)","anchor":"get_by_email/1"},{"id":"get_current/1","deprecated":false,"title":"get_current(id)","anchor":"get_current/1"},{"id":"instance_is_invite_only?/0","deprecated":false,"title":"instance_is_invite_only?()","anchor":"instance_is_invite_only?/0"},{"id":"is_admin?/1","deprecated":false,"title":"is_admin?(assigns)","anchor":"is_admin?/1"},{"id":"is_first_account?/0","deprecated":false,"title":"is_first_account?()","anchor":"is_first_account?/0"},{"id":"login/2","deprecated":false,"title":"login(params_or_changeset, opts \\\\ [])","anchor":"login/2"},{"id":"login_valid?/2","deprecated":false,"title":"login_valid?(user, password)","anchor":"login_valid?/2"},{"id":"make_account/2","deprecated":false,"title":"make_account(attrs \\\\ %{}, opts \\\\ [])","anchor":"make_account/2"},{"id":"maybe_redeem_invite/2","deprecated":false,"title":"maybe_redeem_invite(data, opts)","anchor":"maybe_redeem_invite/2"},{"id":"prepare_signup_opts/1","deprecated":false,"title":"prepare_signup_opts(opts)","anchor":"prepare_signup_opts/1"},{"id":"redeemable_invite?/1","deprecated":false,"title":"redeemable_invite?(invite)","anchor":"redeemable_invite?/1"},{"id":"request_confirm_email/2","deprecated":false,"title":"request_confirm_email(params_or_changeset_or_form_or_account, opts \\\\ [])","anchor":"request_confirm_email/2"},{"id":"request_forgot_password/1","deprecated":false,"title":"request_forgot_password(params)","anchor":"request_forgot_password/1"},{"id":"signup/2","deprecated":false,"title":"signup(params_or_changeset, opts \\\\ [])","anchor":"signup/2"},{"id":"update_is_admin/3","deprecated":false,"title":"update_is_admin(user_or_account, make_admin_or_revoke, user \\\\ nil)","anchor":"update_is_admin/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ChangeEmailFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ChangeEmailFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ChangeEmailFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ChangeEmailFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ChangePasswordFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ChangePasswordFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ChangePasswordFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(form \\\\ %ChangePasswordFields{}, attrs, resetting_password? \\\\ false)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ConfirmEmailFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ConfirmEmailFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ConfirmEmailFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ConfirmEmailFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.ForgotPasswordFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.ForgotPasswordFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.ForgotPasswordFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %ForgotPasswordFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.LoginFields","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.LoginFields","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.LoginFields","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(form \\\\ %LoginFields{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_confirm_token/1","deprecated":false,"title":"by_confirm_token(token)","anchor":"by_confirm_token/1"},{"id":"by_email/1","deprecated":false,"title":"by_email(email)","anchor":"by_email/1"},{"id":"count/1","deprecated":false,"title":"count(q \\\\ Account)","anchor":"count/1"},{"id":"current/1","deprecated":false,"title":"current(id)","anchor":"current/1"},{"id":"login_by_account_id/1","deprecated":false,"title":"login_by_account_id(id)","anchor":"login_by_account_id/1"},{"id":"login_by_email/1","deprecated":false,"title":"login_by_email(email)","anchor":"login_by_email/1"},{"id":"login_by_username/1","deprecated":false,"title":"login_by_username(username)","anchor":"login_by_username/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Accounts.SecondFactors","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Accounts.SecondFactors","sections":[],"nested_context":"Bonfire","nested_title":".Me.Accounts.SecondFactors","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(totp \\\\ %AuthSecondFactor{}, attrs, opts \\\\ [])","anchor":"changeset/3"},{"id":"delete_account_totp/1","deprecated":false,"title":"delete_account_totp(account_totp)","anchor":"delete_account_totp/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"format_secret/1","deprecated":false,"title":"format_secret(secret \\\\ new())","anchor":"format_secret/1"},{"id":"get_account_totp/1","deprecated":false,"title":"get_account_totp(account)","anchor":"get_account_totp/1"},{"id":"maybe_authenticate/2","deprecated":false,"title":"maybe_authenticate(account, params)","anchor":"maybe_authenticate/2"},{"id":"maybe_cast_totp_changeset/3","deprecated":false,"title":"maybe_cast_totp_changeset(changeset, params, opts)","anchor":"maybe_cast_totp_changeset/3"},{"id":"new/0","deprecated":false,"title":"new()","anchor":"new/0"},{"id":"new_qrcode/1","deprecated":false,"title":"new_qrcode(opts \\\\ [])","anchor":"new_qrcode/1"},{"id":"new_struct/1","deprecated":false,"title":"new_struct(secret \\\\ nil)","anchor":"new_struct/1"},{"id":"new_uri/1","deprecated":false,"title":"new_uri(secret \\\\ nil)","anchor":"new_uri/1"},{"id":"validate_account_totp/2","deprecated":false,"title":"validate_account_totp(totp, code)","anchor":"validate_account_totp/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Acts.Caretaker","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Acts.Caretaker","sections":[],"nested_context":"Bonfire","nested_title":".Me.Acts.Caretaker","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Acts.Creator","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Acts.Creator","sections":[],"nested_context":"Bonfire","nested_title":".Me.Acts.Creator"},{"id":"Bonfire.Me.Archive.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Archive.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Archive.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Characters","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Characters","sections":[],"nested_context":"Bonfire","nested_title":".Me.Characters","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_username/1","deprecated":false,"title":"by_username(username)","anchor":"by_username/1"},{"id":"by_username!/1","deprecated":false,"title":"by_username!(username)","anchor":"by_username!/1"},{"id":"by_username_q/1","deprecated":false,"title":"by_username_q(username)","anchor":"by_username_q/1"},{"id":"changeset/3","deprecated":false,"title":"changeset(char \\\\ %Character{}, params, profile \\\\ :local)","anchor":"changeset/3"},{"id":"character_mention_prefix/1","deprecated":false,"title":"character_mention_prefix(object)","anchor":"character_mention_prefix/1"},{"id":"character_url/1","deprecated":false,"title":"character_url(character)","anchor":"character_url/1"},{"id":"clean_username/1","deprecated":false,"title":"clean_username(username)","anchor":"clean_username/1"},{"id":"display_username/4","deprecated":false,"title":"display_username(user, always_include_domain \\\\ false, is_local? \\\\ nil, prefix \\\\ nil)","anchor":"display_username/4"},{"id":"get/1","deprecated":false,"title":"get(ids)","anchor":"get/1"},{"id":"hash_available?/1","deprecated":false,"title":"hash_available?(hash)","anchor":"hash_available?/1"},{"id":"hash_delete/1","deprecated":false,"title":"hash_delete(hash)","anchor":"hash_delete/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"q_by_id/1","deprecated":false,"title":"q_by_id(ids)","anchor":"q_by_id/1"},{"id":"remote_changeset/2","deprecated":false,"title":"remote_changeset(changeset, params)","anchor":"remote_changeset/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"update/2","deprecated":false,"title":"update(character, attrs)","anchor":"update/2"},{"id":"username_available?/1","deprecated":false,"title":"username_available?(username)","anchor":"username_available?/1"}],"key":"functions"}]},{"id":"Bonfire.Me.DeleteWorker","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.DeleteWorker","sections":[],"nested_context":"Bonfire","nested_title":".Me.DeleteWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(ids, opts)","anchor":"delete/2"},{"id":"delete_now/1","deprecated":false,"title":"delete_now(ids)","anchor":"delete_now/1"},{"id":"delete_structs_now/1","deprecated":false,"title":"delete_structs_now(structs)","anchor":"delete_structs_now/1"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(ids)","anchor":"enqueue_delete/1"},{"id":"perform/1","deprecated":false,"title":"perform(map)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Me.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_user!/3","deprecated":false,"title":"fake_user!(account \\\\ %{}, attrs \\\\ %{}, opts_or_extra \\\\ [])","anchor":"fake_user!/3"}],"key":"functions"}]},{"id":"Bonfire.Me.Fake.Helpers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Fake.Helpers","sections":[],"nested_context":"Bonfire","nested_title":".Me.Fake.Helpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"atusername/0","deprecated":false,"title":"atusername()","anchor":"atusername/0"},{"id":"avatar_url/0","deprecated":false,"title":"avatar_url()","anchor":"avatar_url/0"},{"id":"avatar_url/1","deprecated":false,"title":"avatar_url(slug)","anchor":"avatar_url/1"},{"id":"character_subform/1","deprecated":false,"title":"character_subform(base \\\\ %{})","anchor":"character_subform/1"},{"id":"confirm_token/0","deprecated":false,"title":"confirm_token()","anchor":"confirm_token/0"},{"id":"create_user_form/1","deprecated":false,"title":"create_user_form(base \\\\ %{})","anchor":"create_user_form/1"},{"id":"credential_subform/1","deprecated":false,"title":"credential_subform(base \\\\ %{})","anchor":"credential_subform/1"},{"id":"email_subform/1","deprecated":false,"title":"email_subform(base \\\\ %{})","anchor":"email_subform/1"},{"id":"icon_url/1","deprecated":false,"title":"icon_url(slug \\\\ nil)","anchor":"icon_url/1"},{"id":"image/1","deprecated":false,"title":"image(arg1)","anchor":"image/1"},{"id":"image_url/1","deprecated":false,"title":"image_url(slug \\\\ nil)","anchor":"image_url/1"},{"id":"profile_subform/1","deprecated":false,"title":"profile_subform(base \\\\ %{})","anchor":"profile_subform/1"},{"id":"signup_form/1","deprecated":false,"title":"signup_form(base \\\\ %{})","anchor":"signup_form/1"},{"id":"user_live/1","deprecated":false,"title":"user_live(base \\\\ %{})","anchor":"user_live/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Me.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"indexing_format_created/2","deprecated":false,"title":"indexing_format_created(profile, character)","anchor":"indexing_format_created/2"},{"id":"indexing_format_creator/2","deprecated":false,"title":"indexing_format_creator(profile, character)","anchor":"indexing_format_creator/2"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"maybe_index/1","deprecated":false,"title":"maybe_index(object)","anchor":"maybe_index/1"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Me.Mails","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Mails","sections":[],"nested_context":"Bonfire","nested_title":".Me.Mails","nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm_email/2","deprecated":false,"title":"confirm_email(account, opts \\\\ [])","anchor":"confirm_email/2"},{"id":"forgot_password/1","deprecated":false,"title":"forgot_password(account)","anchor":"forgot_password/1"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"render/3","deprecated":false,"title":"render(email, template, assigns \\\\ [])","anchor":"render/3"},{"id":"signup_confirm_email/1","deprecated":false,"title":"signup_confirm_email(account)","anchor":"signup_confirm_email/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Mails.EmailView","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Mails.EmailView","sections":[],"nested_context":"Bonfire","nested_title":".Me.Mails.EmailView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render_template/2","deprecated":false,"title":"render_template(template, assigns)","anchor":"render_template/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Profiles","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Profiles","sections":[],"nested_context":"Bonfire","nested_title":".Me.Profiles","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(profile \\\\ %Profile{}, params)","anchor":"changeset/2"},{"id":"changeset_simple/2","deprecated":false,"title":"changeset_simple(profile \\\\ %Profile{}, params)","anchor":"changeset_simple/2"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"set_profile_image/3","deprecated":false,"title":"set_profile_image(atom, user, uploaded_media)","anchor":"set_profile_image/3"},{"id":"spam?/2","deprecated":false,"title":"spam?(text, context)","anchor":"spam?/2"},{"id":"spam_check!/2","deprecated":false,"title":"spam_check!(text, context)","anchor":"spam_check!/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Profiles.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Profiles.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Profiles.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"default_assigns/1","deprecated":false,"title":"default_assigns(is_guest?)","anchor":"default_assigns/1"},{"id":"get/1","deprecated":false,"title":"get(username)","anchor":"get/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"init/2","deprecated":false,"title":"init(params, socket)","anchor":"init/2"},{"id":"maybe_assign_aliases/2","deprecated":false,"title":"maybe_assign_aliases(socket, user)","anchor":"maybe_assign_aliases/2"},{"id":"set_image_setting/5","deprecated":false,"title":"set_image_setting(atom, scope, uploaded_media, settings_key, socket)","anchor":"set_image_setting/5"},{"id":"set_profile_image/5","deprecated":false,"title":"set_profile_image(atom, user, uploaded_media, assign_field, socket)","anchor":"set_profile_image/5"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"user_assigns/3","deprecated":false,"title":"user_assigns(user, current_user, follows_me \\\\ false)","anchor":"user_assigns/3"}],"key":"functions"}]},{"id":"Bonfire.Me.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Me.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Me.SharedUsers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.SharedUsers","sections":[],"nested_context":"Bonfire","nested_title":".Me.SharedUsers","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_account/3","deprecated":false,"title":"add_account(shared_user_or_username, email_or_username, params \\\\ %{})","anchor":"add_account/3"},{"id":"add_accounts/3","deprecated":false,"title":"add_accounts(shared_user_or_username, emails_or_usernames, params \\\\ %{})","anchor":"add_accounts/3"},{"id":"by_account/1","deprecated":false,"title":"by_account(account)","anchor":"by_account/1"},{"id":"by_username_and_account_query/2","deprecated":false,"title":"by_username_and_account_query(username, account)","anchor":"by_username_and_account_query/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"init_shared_user/2","deprecated":false,"title":"init_shared_user(user, params \\\\ %{})","anchor":"init_shared_user/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Users","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users","nodeGroups":[{"name":"Types","nodes":[{"id":"changeset_extra/0","deprecated":false,"title":"changeset_extra()","anchor":"t:changeset_extra/0"},{"id":"changeset_name/0","deprecated":false,"title":"changeset_name()","anchor":"t:changeset_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"automod_id/0","deprecated":false,"title":"automod_id()","anchor":"automod_id/0"},{"id":"by_account/1","deprecated":false,"title":"by_account(account)","anchor":"by_account/1"},{"id":"by_account!/1","deprecated":false,"title":"by_account!(account)","anchor":"by_account!/1"},{"id":"by_ap_id/1","deprecated":false,"title":"by_ap_id(ap_id)","anchor":"by_ap_id/1"},{"id":"by_ap_id!/1","deprecated":false,"title":"by_ap_id!(ap_id)","anchor":"by_ap_id!/1"},{"id":"by_canonical_uri/1","deprecated":false,"title":"by_canonical_uri(uri)","anchor":"by_canonical_uri/1"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, opts \\\\ [])","anchor":"by_id/2"},{"id":"by_user_and_account/2","deprecated":false,"title":"by_user_and_account(username_or_user_id, account_id)","anchor":"by_user_and_account/2"},{"id":"by_username/2","deprecated":false,"title":"by_username(username, opts \\\\ [])","anchor":"by_username/2"},{"id":"by_username!/1","deprecated":false,"title":"by_username!(username)","anchor":"by_username!/1"},{"id":"changeset/4","deprecated":false,"title":"changeset(name, user \\\\ %User{}, params, extra)","anchor":"changeset/4"},{"id":"check_active/1","deprecated":false,"title":"check_active(users)","anchor":"check_active/1"},{"id":"check_active!/1","deprecated":false,"title":"check_active!(users)","anchor":"check_active!/1"},{"id":"count/1","deprecated":false,"title":"count(show \\\\ :local)","anchor":"count/1"},{"id":"create/2","deprecated":false,"title":"create(params_or_changeset, opts \\\\ [])","anchor":"create/2"},{"id":"create_remote/1","deprecated":false,"title":"create_remote(params)","anchor":"create_remote/1"},{"id":"enqueue_delete/1","deprecated":false,"title":"enqueue_delete(user)","anchor":"enqueue_delete/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"fetch_current/1","deprecated":false,"title":"fetch_current(id)","anchor":"fetch_current/1"},{"id":"flatten/1","deprecated":false,"title":"flatten(user)","anchor":"flatten/1"},{"id":"format_actor/1","deprecated":false,"title":"format_actor(user)","anchor":"format_actor/1"},{"id":"get_current/1","deprecated":false,"title":"get_current(id)","anchor":"get_current/1"},{"id":"get_current/2","deprecated":false,"title":"get_current(id, account_id)","anchor":"get_current/2"},{"id":"get_only_in_account/1","deprecated":false,"title":"get_only_in_account(account)","anchor":"get_only_in_account/1"},{"id":"get_or_create_automod/0","deprecated":false,"title":"get_or_create_automod()","anchor":"get_or_create_automod/0"},{"id":"get_or_create_service_character/2","deprecated":false,"title":"get_or_create_service_character(service_character_id, service_character_username)","anchor":"get_or_create_service_character/2"},{"id":"ids_by_account/1","deprecated":false,"title":"ids_by_account(account_id)","anchor":"ids_by_account/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(u)","anchor":"indexing_object_format/1"},{"id":"is_active?/1","deprecated":false,"title":"is_active?(user)","anchor":"is_active?/1"},{"id":"is_first_user?/0","deprecated":false,"title":"is_first_user?()","anchor":"is_first_user?/0"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_admins/0","deprecated":false,"title":"list_admins()","anchor":"list_admins/0"},{"id":"list_boundarised_query/1","deprecated":false,"title":"list_boundarised_query(opts)","anchor":"list_boundarised_query/1"},{"id":"list_paginated/1","deprecated":false,"title":"list_paginated(opts \\\\ [])","anchor":"list_paginated/1"},{"id":"make_admin/1","deprecated":false,"title":"make_admin(username)","anchor":"make_admin/1"},{"id":"make_user/3","deprecated":false,"title":"make_user(attrs, account, opts \\\\ [])","anchor":"make_user/3"},{"id":"maybe_count/1","deprecated":false,"title":"maybe_count(show \\\\ :local)","anchor":"maybe_count/1"},{"id":"maybe_index_user/1","deprecated":false,"title":"maybe_index_user(object)","anchor":"maybe_index_user/1"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"remote_fetcher_id/0","deprecated":false,"title":"remote_fetcher_id()","anchor":"remote_fetcher_id/0"},{"id":"revoke_admin/1","deprecated":false,"title":"revoke_admin(username)","anchor":"revoke_admin/1"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"search_query/2","deprecated":false,"title":"search_query(search, opts \\\\ [])","anchor":"search_query/2"},{"id":"update/3","deprecated":false,"title":"update(user, params, extra \\\\ [])","anchor":"update/3"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(user, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(user, params)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"Bonfire.Me.Users.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"disconnect_account_session/1","deprecated":false,"title":"disconnect_account_session(conn)","anchor":"disconnect_account_session/1"},{"id":"disconnect_sockets/1","deprecated":false,"title":"disconnect_sockets(context)","anchor":"disconnect_sockets/1"},{"id":"disconnect_user_session/1","deprecated":false,"title":"disconnect_user_session(conn)","anchor":"disconnect_user_session/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, search, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"to_tuple/1","deprecated":false,"title":"to_tuple(u)","anchor":"to_tuple/1"}],"key":"functions"}]},{"id":"Bonfire.Me.Users.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Me.Users.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Me.Users.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"admins/1","deprecated":false,"title":"admins(opts \\\\ [])","anchor":"admins/1"},{"id":"base_by_id/1","deprecated":false,"title":"base_by_id(id)","anchor":"base_by_id/1"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"by_account/1","deprecated":false,"title":"by_account(account_id)","anchor":"by_account/1"},{"id":"by_canonical_uri/2","deprecated":false,"title":"by_canonical_uri(canonical_uri, opts \\\\ [])","anchor":"by_canonical_uri/2"},{"id":"by_id/2","deprecated":false,"title":"by_id(id, opts \\\\ [])","anchor":"by_id/2"},{"id":"by_user_and_account/2","deprecated":false,"title":"by_user_and_account(username_or_user_id, account_id)","anchor":"by_user_and_account/2"},{"id":"by_username_or_id/2","deprecated":false,"title":"by_username_or_id(username_or_id, opts \\\\ [])","anchor":"by_username_or_id/2"},{"id":"by_username_query/2","deprecated":false,"title":"by_username_query(username, opts \\\\ [])","anchor":"by_username_query/2"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"count/1","deprecated":false,"title":"count(arg1)","anchor":"count/1"},{"id":"current/1","deprecated":false,"title":"current(user_id)","anchor":"current/1"},{"id":"current/2","deprecated":false,"title":"current(user_id, account_id)","anchor":"current/2"},{"id":"join_peered/1","deprecated":false,"title":"join_peered(q)","anchor":"join_peered/1"},{"id":"list/1","deprecated":false,"title":"list(arg1)","anchor":"list/1"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(text, opts \\\\ [])","anchor":"search/2"}],"key":"functions"}]},{"id":"Bonfire.Messages","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Messages","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, message)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"changeset/3","deprecated":false,"title":"changeset(atom, attrs, opts \\\\ [])","anchor":"changeset/3"},{"id":"draft/2","deprecated":false,"title":"draft(context, attrs)","anchor":"draft/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"filter/3","deprecated":false,"title":"filter(atom, arg2, query)","anchor":"filter/3"},{"id":"list/3","deprecated":false,"title":"list(current_user, with_user \\\\ nil, opts \\\\ [])","anchor":"list/3"},{"id":"list/4","deprecated":false,"title":"list(current_user, with_user, cursor_before, preloads)","anchor":"list/4"},{"id":"maybe_spam_check/3","deprecated":false,"title":"maybe_spam_check(changeset, attrs, context)","anchor":"maybe_spam_check/3"},{"id":"read/2","deprecated":false,"title":"read(message_id, opts)","anchor":"read/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"send/3","deprecated":false,"title":"send(sender_or_context, attrs, to \\\\ nil)","anchor":"send/3"}],"key":"functions"}]},{"id":"Bonfire.Messages.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Messages.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_comment!/4","deprecated":false,"title":"fake_comment!(user, reply_to, boundary \\\\ nil, attrs \\\\ nil)","anchor":"fake_comment!/4"},{"id":"fake_post!/4","deprecated":false,"title":"fake_post!(user, boundary \\\\ nil, attrs \\\\ nil, opts \\\\ [])","anchor":"fake_post!/4"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Messages.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Messages.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Messages.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Messages.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Messages.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, socket)","anchor":"handle_event/3"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(attrs, _, socket)","anchor":"handle_params/3"},{"id":"list_threads/3","deprecated":false,"title":"list_threads(current_user, user \\\\ nil, opts \\\\ [])","anchor":"list_threads/3"},{"id":"live_more/3","deprecated":false,"title":"live_more(context, opts, socket)","anchor":"live_more/3"},{"id":"send_message/2","deprecated":false,"title":"send_message(params, socket)","anchor":"send_message/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"thread_meta/4","deprecated":false,"title":"thread_meta(thread_id, activity, object, opts)","anchor":"thread_meta/4"},{"id":"thread_meta/5","deprecated":false,"title":"thread_meta(key, thread_id, activity, object, opts)","anchor":"thread_meta/5"},{"id":"thread_participants/4","deprecated":false,"title":"thread_participants(thread_id, activity, object, opts)","anchor":"thread_participants/4"},{"id":"threads_widget/3","deprecated":false,"title":"threads_widget(current_user, user \\\\ nil, opts \\\\ [])","anchor":"threads_widget/3"}],"key":"functions"}]},{"id":"Bonfire.OpenID","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".OpenID"},{"id":"Bonfire.OpenID.Client","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Client","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Client","nodeGroups":[{"name":"Functions","nodes":[{"id":"oauth2_providers/0","deprecated":false,"title":"oauth2_providers()","anchor":"oauth2_providers/0"},{"id":"open_id_connect_providers/0","deprecated":false,"title":"open_id_connect_providers()","anchor":"open_id_connect_providers/0"},{"id":"providers_authorization_urls/1","deprecated":false,"title":"providers_authorization_urls(source \\\\ :login)","anchor":"providers_authorization_urls/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Fake","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_account!/2","deprecated":false,"title":"fake_account!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_account!/2"},{"id":"fake_user!/2","deprecated":false,"title":"fake_user!(attrs \\\\ %{}, opts \\\\ [])","anchor":"fake_user!/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.AuthRequired","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.AuthRequired","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.AuthRequired","nodeGroups":[{"name":"Functions","nodes":[{"id":"require_auth/2","deprecated":false,"title":"require_auth(conn, opts)","anchor":"require_auth/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.Authorize","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.Authorize","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.Authorize","nodeGroups":[{"name":"Functions","nodes":[{"id":"authorize/2","deprecated":false,"title":"authorize(conn, required_scopes)","anchor":"authorize/2"},{"id":"load_authorization/2","deprecated":false,"title":"load_authorization(conn, opts)","anchor":"load_authorization/2"},{"id":"maybe_load_authorization/2","deprecated":false,"title":"maybe_load_authorization(conn, opts \\\\ [])","anchor":"maybe_load_authorization/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Plugs.ClientID","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Plugs.ClientID","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Plugs.ClientID","nodeGroups":[{"name":"Functions","nodes":[{"id":"validate_client_id/2","deprecated":false,"title":"validate_client_id(conn, opts)","anchor":"validate_client_id/2"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Provider.ClientApps","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Provider.ClientApps","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Provider.ClientApps","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(clauses)","anchor":"get/1"},{"id":"get/2","deprecated":false,"title":"get(name, redirect_uri)","anchor":"get/2"},{"id":"get_or_new/1","deprecated":false,"title":"get_or_new(clauses)","anchor":"get_or_new/1"},{"id":"get_or_new/2","deprecated":false,"title":"get_or_new(name, redirect_uri)","anchor":"get_or_new/2"},{"id":"init_test_client_app/0","deprecated":false,"title":"init_test_client_app()","anchor":"init_test_client_app/0"},{"id":"list_active_tokens/0","deprecated":false,"title":"list_active_tokens()","anchor":"list_active_tokens/0"},{"id":"list_clients/0","deprecated":false,"title":"list_clients()","anchor":"list_clients/0"},{"id":"list_scopes/0","deprecated":false,"title":"list_scopes()","anchor":"list_scopes/0"},{"id":"new/1","deprecated":false,"title":"new(params)","anchor":"new/1"},{"id":"new/2","deprecated":false,"title":"new(name, redirect_uris)","anchor":"new/2"},{"id":"prepare_redirect_uri/1","deprecated":false,"title":"prepare_redirect_uri(uri)","anchor":"prepare_redirect_uri/1"},{"id":"prepare_redirect_uris/1","deprecated":false,"title":"prepare_redirect_uris(other)","anchor":"prepare_redirect_uris/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Provider.OAuth","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Provider.OAuth","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Provider.OAuth","nodeGroups":[{"name":"Functions","nodes":[{"id":"redirect_uri_validate/1","deprecated":false,"title":"redirect_uri_validate(arg1)","anchor":"redirect_uri_validate/1"}],"key":"functions"}]},{"id":"Bonfire.OpenID.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.OpenID.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenID.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".OpenID.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.OpenScience","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".OpenScience","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"user_aliases/1","deprecated":false,"title":"user_aliases(user)","anchor":"user_aliases/1"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.APIs","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.APIs","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.APIs","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch/2","deprecated":false,"title":"fetch(url, opts \\\\ [])","anchor":"fetch/2"},{"id":"fetch_crossref/1","deprecated":false,"title":"fetch_crossref(url)","anchor":"fetch_crossref/1"},{"id":"fetch_orcid_for_all_known_scientists/1","deprecated":false,"title":"fetch_orcid_for_all_known_scientists(opts \\\\ [])","anchor":"fetch_orcid_for_all_known_scientists/1"},{"id":"fetch_orcid_latest/3","deprecated":false,"title":"fetch_orcid_latest(user, media, opts \\\\ [])","anchor":"fetch_orcid_latest/3"},{"id":"fetch_orcid_record/3","deprecated":false,"title":"fetch_orcid_record(user, orcid_user_media, opts \\\\ [])","anchor":"fetch_orcid_record/3"},{"id":"fetch_orcid_works/3","deprecated":false,"title":"fetch_orcid_works(user, orcid_user_media, opts \\\\ [])","anchor":"fetch_orcid_works/3"},{"id":"find_orcid_id/1","deprecated":false,"title":"find_orcid_id(aliases)","anchor":"find_orcid_id/1"},{"id":"is_doi?/1","deprecated":false,"title":"is_doi?(url)","anchor":"is_doi?/1"},{"id":"is_pub_id_or_uri_match?/1","deprecated":false,"title":"is_pub_id_or_uri_match?(url)","anchor":"is_pub_id_or_uri_match?/1"},{"id":"maybe_fetch/1","deprecated":false,"title":"maybe_fetch(url)","anchor":"maybe_fetch/1"},{"id":"open_alex_fetch_topics/1","deprecated":false,"title":"open_alex_fetch_topics(orcid_id)","anchor":"open_alex_fetch_topics/1"},{"id":"pub_id_and_uri_matchers/0","deprecated":false,"title":"pub_id_and_uri_matchers()","anchor":"pub_id_and_uri_matchers/0"},{"id":"pub_id_matcher/1","deprecated":false,"title":"pub_id_matcher(type)","anchor":"pub_id_matcher/1"},{"id":"pub_id_matchers/0","deprecated":false,"title":"pub_id_matchers()","anchor":"pub_id_matchers/0"},{"id":"pub_uri_matchers/0","deprecated":false,"title":"pub_uri_matchers()","anchor":"pub_uri_matchers/0"},{"id":"trigger/3","deprecated":false,"title":"trigger(atom, user, media)","anchor":"trigger/3"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.Fake","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.Fake"},{"id":"Bonfire.OpenScience.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.OpenScience.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.OpenScience.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".OpenScience.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"},{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"declared_nav/0","deprecated":false,"title":"declared_nav()","anchor":"declared_nav/0"}],"key":"functions"}]},{"id":"Bonfire.Pages","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Pages","nodeGroups":[{"name":"Functions","nodes":[{"id":"create/1","deprecated":false,"title":"create(options \\\\ [])","anchor":"create/1"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters \\\\ [], opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"page_path/2","deprecated":false,"title":"page_path(page, opts \\\\ [])","anchor":"page_path/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :page)","anchor":"run_epic/4"},{"id":"slug/1","deprecated":false,"title":"slug(title)","anchor":"slug/1"},{"id":"summary/1","deprecated":false,"title":"summary(page)","anchor":"summary/1"}],"key":"functions"}]},{"id":"Bonfire.Pages.Acts.Page.Create","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Acts.Page.Create","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Acts.Page.Create"},{"id":"Bonfire.Pages.Acts.Section.Upsert","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Acts.Section.Upsert","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Acts.Section.Upsert"},{"id":"Bonfire.Pages.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Pages.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Pages.Page","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Page","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Page","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(page \\\\ %Page{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Pages.Section","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Section","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Section","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(section \\\\ %Section{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Pages.Sections","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Sections","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Sections","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters \\\\ [], opts \\\\ [])","anchor":"list_paginated/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"put_in_page/3","deprecated":false,"title":"put_in_page(section_id, page_id, position \\\\ nil)","anchor":"put_in_page/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"remove_from_page/2","deprecated":false,"title":"remove_from_page(section_id, page_id)","anchor":"remove_from_page/2"},{"id":"upsert/1","deprecated":false,"title":"upsert(options \\\\ [])","anchor":"upsert/1"}],"key":"functions"}]},{"id":"Bonfire.Pages.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Pages.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Pages.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Poll","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll","sections":[{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Poll","nodeGroups":[{"name":"Functions","nodes":[{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Poll.Acts.Choices.Upsert","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Acts.Choices.Upsert","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Acts.Choices.Upsert"},{"id":"Bonfire.Poll.Choice","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Choice","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Choice","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(section \\\\ %Choice{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Choices","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Choices","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Choices","nodeGroups":[{"name":"Functions","nodes":[{"id":"put_choice/3","deprecated":false,"title":"put_choice(choice, question, position \\\\ nil)","anchor":"put_choice/3"},{"id":"simple_create_and_put/4","deprecated":false,"title":"simple_create_and_put(index \\\\ nil, choices_or_choice_attrs, question_id, opts)","anchor":"simple_create_and_put/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Fake"},{"id":"Bonfire.Poll.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Poll.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"negative_score_info/0","deprecated":false,"title":"negative_score_info()","anchor":"negative_score_info/0"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Poll.Question","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Question","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Question","nodeGroups":[{"name":"Functions","nodes":[{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Question.Create","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Question.Create","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Question.Create"},{"id":"Bonfire.Poll.Questions","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Questions","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Questions","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(question \\\\ %Bonfire.Poll.Question{}, attrs)","anchor":"changeset/2"},{"id":"create/1","deprecated":false,"title":"create(options \\\\ [])","anchor":"create/1"},{"id":"create_simple/1","deprecated":false,"title":"create_simple(question)","anchor":"create_simple/1"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ nil)","anchor":"query/2"},{"id":"query_paginated/2","deprecated":false,"title":"query_paginated(filters, opts \\\\ [])","anchor":"query_paginated/2"},{"id":"read/2","deprecated":false,"title":"read(post_id, opts_or_socket_or_current_user \\\\ [])","anchor":"read/2"},{"id":"run_epic/4","deprecated":false,"title":"run_epic(type, options, module \\\\ __MODULE__, on \\\\ :question)","anchor":"run_epic/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Poll.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Poll.Vote","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Vote","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Vote","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(vote \\\\ %Vote{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Poll.Votes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Votes","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Votes","nodeGroups":[{"name":"Functions","nodes":[{"id":"by_voter/2","deprecated":false,"title":"by_voter(subject, opts \\\\ [])","anchor":"by_voter/2"},{"id":"calculate_total/3","deprecated":false,"title":"calculate_total(votes, weighting, sum \\\\ 0)","anchor":"calculate_total/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"get_average_base_score/2","deprecated":false,"title":"get_average_base_score(total, num_voters)","anchor":"get_average_base_score/2"},{"id":"get_average_emoji/4","deprecated":false,"title":"get_average_emoji(total, num_voters, question, scores \\\\ scores())","anchor":"get_average_emoji/4"},{"id":"get_score/2","deprecated":false,"title":"get_score(value, scores \\\\ scores())","anchor":"get_score/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"register_vote_choice/4","deprecated":false,"title":"register_vote_choice(voter, question, choice, opts \\\\ [])","anchor":"register_vote_choice/4"},{"id":"scores/0","deprecated":false,"title":"scores()","anchor":"scores/0"},{"id":"send_vote_activity/4","deprecated":false,"title":"send_vote_activity(voter, question, registered_votes, opts)","anchor":"send_vote_activity/4"},{"id":"vote/4","deprecated":false,"title":"vote(voter, question, choices, opts \\\\ [])","anchor":"vote/4"}],"key":"functions"}]},{"id":"Bonfire.Poll.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Poll.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Poll.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Posts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Posts","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, post)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, ap_activity, ap_object)","anchor":"ap_receive_activity/3"},{"id":"changeset/4","deprecated":false,"title":"changeset(action, attrs, creator \\\\ nil, preset \\\\ nil)","anchor":"changeset/4"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"delete/2","deprecated":false,"title":"delete(object, opts \\\\ [])","anchor":"delete/2"},{"id":"draft/2","deprecated":false,"title":"draft(creator, attrs)","anchor":"draft/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"indexing_object_format/2","deprecated":false,"title":"indexing_object_format(post, opts \\\\ [])","anchor":"indexing_object_format/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"prepare_post_attrs/1","deprecated":false,"title":"prepare_post_attrs(attrs)","anchor":"prepare_post_attrs/1"},{"id":"publish/1","deprecated":false,"title":"publish(opts)","anchor":"publish/1"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ nil)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_paginated/2","deprecated":false,"title":"query_paginated(filters, opts \\\\ [])","anchor":"query_paginated/2"},{"id":"read/2","deprecated":false,"title":"read(post_id, opts \\\\ [])","anchor":"read/2"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(type, options \\\\ [], on \\\\ :post)","anchor":"run_epic/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"search/2","deprecated":false,"title":"search(search, opts \\\\ [])","anchor":"search/2"},{"id":"search_query/2","deprecated":false,"title":"search_query(search, opts \\\\ [])","anchor":"search_query/2"}],"key":"functions"}]},{"id":"Bonfire.Posts.Acts.Posts.Publish","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Acts.Posts.Publish","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Acts.Posts.Publish"},{"id":"Bonfire.Posts.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_comment!/4","deprecated":false,"title":"fake_comment!(user, reply_to, boundary \\\\ nil, attrs \\\\ nil)","anchor":"fake_comment!/4"},{"id":"fake_post!/4","deprecated":false,"title":"fake_post!(user, boundary \\\\ nil, attrs \\\\ nil, opts \\\\ [])","anchor":"fake_post!/4"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Posts.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Posts.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Posts.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Posts.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Posts.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"post_changeset/2","deprecated":false,"title":"post_changeset(attrs \\\\ %{}, creator)","anchor":"post_changeset/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"write_feedback/2","deprecated":false,"title":"write_feedback(text, socket)","anchor":"write_feedback/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Quantify"},{"id":"Bonfire.Quantify.GraphQL.Hydration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.GraphQL.Hydration","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.GraphQL.Hydration","nodeGroups":[{"name":"Functions","nodes":[{"id":"hydrate/0","deprecated":false,"title":"hydrate()","anchor":"hydrate/0"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measure","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measure","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measure","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"copy/1","deprecated":false,"title":"copy(measure)","anchor":"copy/1"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, unit, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(measure, attrs)","anchor":"update_changeset/2"},{"id":"validate_changeset/2","deprecated":false,"title":"validate_changeset(measure \\\\ %__MODULE__{}, attrs)","anchor":"validate_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measures","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measures","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measures","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, unit, attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(measure, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Measures.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Measures.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Measures.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"inc_quantity/2","deprecated":false,"title":"inc_quantity(id, amount)","anchor":"inc_quantity/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Simulate","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_measure!/3","deprecated":false,"title":"fake_measure!(user, unit \\\\ nil, overrides \\\\ %{})","anchor":"fake_measure!/3"},{"id":"fake_unit!/3","deprecated":false,"title":"fake_unit!(user, context \\\\ nil, overrides \\\\ %{})","anchor":"fake_unit!/3"},{"id":"measure/1","deprecated":false,"title":"measure(overrides \\\\ %{})","anchor":"measure/1"},{"id":"measure_input/2","deprecated":false,"title":"measure_input(unit \\\\ nil, overrides \\\\ %{})","anchor":"measure_input/2"},{"id":"unit/1","deprecated":false,"title":"unit(base \\\\ %{})","anchor":"unit/1"},{"id":"unit_input/1","deprecated":false,"title":"unit_input(base \\\\ %{})","anchor":"unit_input/1"},{"id":"unit_name/0","deprecated":false,"title":"unit_name()","anchor":"unit_name/0"},{"id":"unit_symbol/0","deprecated":false,"title":"unit_symbol()","anchor":"unit_symbol/0"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Unit","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Unit","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Unit","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(creator, attrs)","anchor":"create_changeset/2"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(creator, context, attrs)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(unit, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Units","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Units","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Units","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, activity_name, thing)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/2","deprecated":false,"title":"create(creator, attrs)","anchor":"create/2"},{"id":"create/3","deprecated":false,"title":"create(creator, context, attrs)","anchor":"create/3"},{"id":"cursor/0","deprecated":false,"title":"cursor()","anchor":"cursor/0"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get_or_create/2","deprecated":false,"title":"get_or_create(unit, user \\\\ nil)","anchor":"get_or_create/2"},{"id":"many/1","deprecated":false,"title":"many(filters \\\\ [])","anchor":"many/1"},{"id":"one/1","deprecated":false,"title":"one(filters)","anchor":"one/1"},{"id":"soft_delete/1","deprecated":false,"title":"soft_delete(unit)","anchor":"soft_delete/1"},{"id":"test_cursor/0","deprecated":false,"title":"test_cursor()","anchor":"test_cursor/0"},{"id":"update/2","deprecated":false,"title":"update(unit, attrs)","anchor":"update/2"}],"key":"functions"}]},{"id":"Bonfire.Quantify.Units.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Quantify.Units.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Quantify.Units.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, spec, join_qualifier \\\\ :left)","anchor":"join_to/3"},{"id":"queries/5","deprecated":false,"title":"queries(query, page_opts, base_filters, data_filters, count_filters)","anchor":"queries/5"},{"id":"query/1","deprecated":false,"title":"query(filters)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Search","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search","sections":[{"id":"Development & Deployment Documentation","anchor":"module-development-deployment-documentation"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Search","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter/0","deprecated":false,"title":"adapter()","anchor":"adapter/0"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"default_types/1","deprecated":false,"title":"default_types(opts)","anchor":"default_types/1"},{"id":"run_search_db/3","deprecated":false,"title":"run_search_db(search, types, opts)","anchor":"run_search_db/3"},{"id":"search/2","deprecated":false,"title":"search(string, opts_or_index \\\\ nil)","anchor":"search/2"},{"id":"search/4","deprecated":false,"title":"search(string, opts \\\\ %{}, calculate_facets, filter_facets)","anchor":"search/4"},{"id":"search_by_type/3","deprecated":false,"title":"search_by_type(tag_search, facets \\\\ nil, opts \\\\ [])","anchor":"search_by_type/3"}],"key":"functions"}]},{"id":"Bonfire.Search.Acts.Queue","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Acts.Queue","sections":[],"nested_context":"Bonfire","nested_title":".Search.Acts.Queue","nodeGroups":[{"name":"Functions","nodes":[{"id":"maybe_indexable_object/2","deprecated":false,"title":"maybe_indexable_object(object, current_user)","anchor":"maybe_indexable_object/2"},{"id":"maybe_unindex/1","deprecated":false,"title":"maybe_unindex(object)","anchor":"maybe_unindex/1"},{"id":"prepare_object/1","deprecated":false,"title":"prepare_object(thing)","anchor":"prepare_object/1"}],"key":"functions"}]},{"id":"Bonfire.Search.Fuzzy","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Fuzzy","sections":[],"nested_context":"Bonfire","nested_title":".Search.Fuzzy","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_search/4","deprecated":false,"title":"do_search(q, opts, calculate_facets, facet_filters)","anchor":"do_search/4"},{"id":"search/4","deprecated":false,"title":"search(q, opts \\\\ %{limit: 20}, calculate_facets \\\\ [\"index_type\"], facet_filters \\\\ nil)","anchor":"search/4"},{"id":"search_filtered/2","deprecated":false,"title":"search_filtered(q, facet_filters)","anchor":"search_filtered/2"}],"key":"functions"}]},{"id":"Bonfire.Search.HTTP","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.HTTP","sections":[],"nested_context":"Bonfire","nested_title":".Search.HTTP","nodeGroups":[{"name":"Functions","nodes":[{"id":"http_adapter/0","deprecated":false,"title":"http_adapter()","anchor":"http_adapter/0"},{"id":"http_error/5","deprecated":false,"title":"http_error(arg1, http_method, message, object, url)","anchor":"http_error/5"},{"id":"http_request/4","deprecated":false,"title":"http_request(http_method, url, headers, object \\\\ nil)","anchor":"http_request/4"}],"key":"functions"}]},{"id":"Bonfire.Search.Indexer","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Indexer","sections":[],"nested_context":"Bonfire","nested_title":".Search.Indexer","nodeGroups":[{"name":"Functions","nodes":[{"id":"host/1","deprecated":false,"title":"host(url)","anchor":"host/1"},{"id":"index_public_object/1","deprecated":false,"title":"index_public_object(object)","anchor":"index_public_object/1"},{"id":"init_index/3","deprecated":false,"title":"init_index(index_name \\\\ \"public\", fail_silently \\\\ false, adapter \\\\ adapter())","anchor":"init_index/3"},{"id":"maybe_delete_object/2","deprecated":false,"title":"maybe_delete_object(object, index_name \\\\ \"public\")","anchor":"maybe_delete_object/2"},{"id":"maybe_index_object/1","deprecated":false,"title":"maybe_index_object(object)","anchor":"maybe_index_object/1"},{"id":"maybe_indexable_and_discoverable/2","deprecated":false,"title":"maybe_indexable_and_discoverable(creator, object)","anchor":"maybe_indexable_and_discoverable/2"},{"id":"maybe_indexable_object/1","deprecated":false,"title":"maybe_indexable_object(object)","anchor":"maybe_indexable_object/1"}],"key":"functions"}]},{"id":"Bonfire.Search.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Search.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"content_live_search/6","deprecated":false,"title":"content_live_search(q, search_limit, facet_filters, extra_results, socket, opts)","anchor":"content_live_search/6"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"live_search/4","deprecated":false,"title":"live_search(q, search_limit \\\\ 20, facet_filters \\\\ nil, socket)","anchor":"live_search/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Search.Meili","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Meili","sections":[],"nested_context":"Bonfire","nested_title":".Search.Meili","nodeGroups":[{"name":"Functions","nodes":[{"id":"api/4","deprecated":false,"title":"api(http_method, object, index_path, fail_silently \\\\ false)","anchor":"api/4"},{"id":"create_index/2","deprecated":false,"title":"create_index(index_name, fail_silently \\\\ false)","anchor":"create_index/2"},{"id":"delete/3","deprecated":false,"title":"delete(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"delete/3"},{"id":"facet_from_map/1","deprecated":false,"title":"facet_from_map(arg)","anchor":"facet_from_map/1"},{"id":"get/1","deprecated":false,"title":"get(object)","anchor":"get/1"},{"id":"get/3","deprecated":false,"title":"get(object, index_path, fail_silently \\\\ false)","anchor":"get/3"},{"id":"index_exists/1","deprecated":false,"title":"index_exists(index_name)","anchor":"index_exists/1"},{"id":"list_facets/1","deprecated":false,"title":"list_facets(index_name \\\\ \"public\")","anchor":"list_facets/1"},{"id":"patch/3","deprecated":false,"title":"patch(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"patch/3"},{"id":"post/3","deprecated":false,"title":"post(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"post/3"},{"id":"public_index/0","deprecated":false,"title":"public_index()","anchor":"public_index/0"},{"id":"put/3","deprecated":false,"title":"put(object, index_path \\\\ \"\", fail_silently \\\\ false)","anchor":"put/3"},{"id":"search/2","deprecated":false,"title":"search(string, index)","anchor":"search/2"},{"id":"search/4","deprecated":false,"title":"search(string, opts, calculate_facets, filter_facets)","anchor":"search/4"},{"id":"search_by_type/2","deprecated":false,"title":"search_by_type(tag_search, facets \\\\ nil)","anchor":"search_by_type/2"},{"id":"search_execute/2","deprecated":false,"title":"search_execute(params, index)","anchor":"search_execute/2"},{"id":"set_facets/2","deprecated":false,"title":"set_facets(index_name, facets)","anchor":"set_facets/2"},{"id":"set_searchable_fields/2","deprecated":false,"title":"set_searchable_fields(index_name, fields)","anchor":"set_searchable_fields/2"},{"id":"settings/2","deprecated":false,"title":"settings(object, index)","anchor":"settings/2"}],"key":"functions"}]},{"id":"Bonfire.Search.RuntimeConfig","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.RuntimeConfig","sections":[],"nested_context":"Bonfire","nested_title":".Search.RuntimeConfig","nodeGroups":[{"name":"Functions","nodes":[{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"config_module/0","deprecated":false,"title":"config_module()","anchor":"config_module/0"}],"key":"functions"}]},{"id":"Bonfire.Search.Stopwords","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Stopwords","sections":[],"nested_context":"Bonfire","nested_title":".Search.Stopwords","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(text, language \\\\ nil)","anchor":"filter/2"},{"id":"split_sentences/1","deprecated":false,"title":"split_sentences(text)","anchor":"split_sentences/1"},{"id":"split_words/1","deprecated":false,"title":"split_words(text)","anchor":"split_words/1"},{"id":"stop_words/1","deprecated":false,"title":"stop_words(language \\\\ \"english\")","anchor":"stop_words/1"}],"key":"functions"}]},{"id":"Bonfire.Search.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Search.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Search.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Seeder","deprecated":false,"group":"Feature extensions","title":"Bonfire.Seeder","sections":[],"nested_context":"Bonfire","nested_title":".Seeder"},{"id":"Bonfire.Social","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Social","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"federate_outgoing?/1","deprecated":false,"title":"federate_outgoing?(subject \\\\ nil)","anchor":"federate_outgoing?/1"},{"id":"federating?/1","deprecated":false,"title":"federating?(subject \\\\ nil)","anchor":"federating?/1"},{"id":"is_local?/2","deprecated":false,"title":"is_local?(thing, opts \\\\ [])","anchor":"is_local?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"many/3","deprecated":false,"title":"many(query, paginate?, opts \\\\ [])","anchor":"many/3"},{"id":"maybe_federate/5","deprecated":false,"title":"maybe_federate(subject, verb, object, activity \\\\ nil, opts \\\\ [])","anchor":"maybe_federate/5"},{"id":"maybe_federate_and_gift_wrap_activity/3","deprecated":false,"title":"maybe_federate_and_gift_wrap_activity(subject, object, opts \\\\ [])","anchor":"maybe_federate_and_gift_wrap_activity/3"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Social.APActivities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.APActivities","sections":[],"nested_context":"Bonfire","nested_title":".Social.APActivities","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"create/4","deprecated":false,"title":"create(character, activity, object, public \\\\ nil)","anchor":"create/4"}],"key":"functions"}]},{"id":"Bonfire.Social.Activities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Activities","sections":[],"nested_context":"Bonfire","nested_title":".Social.Activities","nodeGroups":[{"name":"Functions","nodes":[{"id":"activity_preloads/2","deprecated":false,"title":"activity_preloads(query_or_object_or_objects, opts)","anchor":"activity_preloads/2"},{"id":"activity_preloads/3","deprecated":false,"title":"activity_preloads(query_or_object_or_objects, preloads, opts)","anchor":"activity_preloads/3"},{"id":"activity_under_object/1","deprecated":false,"title":"activity_under_object(top_object)","anchor":"activity_under_object/1"},{"id":"activity_under_object/2","deprecated":false,"title":"activity_under_object(activity, object)","anchor":"activity_under_object/2"},{"id":"activity_with_object_from_assigns/1","deprecated":false,"title":"activity_with_object_from_assigns(assigns)","anchor":"activity_with_object_from_assigns/1"},{"id":"all_verb_names/0","deprecated":false,"title":"all_verb_names()","anchor":"all_verb_names/0"},{"id":"all_verb_names_extra/0","deprecated":false,"title":"all_verb_names_extra()","anchor":"all_verb_names_extra/0"},{"id":"as_permitted_for/3","deprecated":false,"title":"as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"as_permitted_for/3"},{"id":"build_assoc/3","deprecated":false,"title":"build_assoc(thing, verb, subject)","anchor":"build_assoc/3"},{"id":"build_assoc/4","deprecated":false,"title":"build_assoc(thing, verb, subject, object)","anchor":"build_assoc/4"},{"id":"by_subject_verb_object_q/3","deprecated":false,"title":"by_subject_verb_object_q(subject, verb, object)","anchor":"by_subject_verb_object_q/3"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, verb, creator, opts)","anchor":"cast/4"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"create/4","deprecated":false,"title":"create(subject, verb, object, activity_id \\\\ nil)","anchor":"create/4"},{"id":"delete/1","deprecated":false,"title":"delete(id)","anchor":"delete/1"},{"id":"delete_by_object/1","deprecated":false,"title":"delete_by_object(id)","anchor":"delete_by_object/1"},{"id":"delete_by_subject_verb_object/3","deprecated":false,"title":"delete_by_subject_verb_object(subject, verb, object)","anchor":"delete_by_subject_verb_object/3"},{"id":"fetch_cursor_value_fun/2","deprecated":false,"title":"fetch_cursor_value_fun(replied, list)","anchor":"fetch_cursor_value_fun/2"},{"id":"get/2","deprecated":false,"title":"get(id, opts)","anchor":"get/2"},{"id":"load_object/2","deprecated":false,"title":"load_object(id_or_pointer, opts \\\\ [])","anchor":"load_object/2"},{"id":"maybe_join_creator/2","deprecated":false,"title":"maybe_join_creator(query, exclude_user_ids)","anchor":"maybe_join_creator/2"},{"id":"maybe_join_subject/2","deprecated":false,"title":"maybe_join_subject(query, exclude_user_ids)","anchor":"maybe_join_subject/2"},{"id":"maybe_remove_for_deleters_feeds/1","deprecated":false,"title":"maybe_remove_for_deleters_feeds(id)","anchor":"maybe_remove_for_deleters_feeds/1"},{"id":"maybe_with_labelled/0","deprecated":false,"title":"maybe_with_labelled()","anchor":"maybe_with_labelled/0"},{"id":"object_from_activity/1","deprecated":false,"title":"object_from_activity(activity)","anchor":"object_from_activity/1"},{"id":"object_preload_activity/2","deprecated":false,"title":"object_preload_activity(object, verb \\\\ :create)","anchor":"object_preload_activity/2"},{"id":"object_preload_create_activity/1","deprecated":false,"title":"object_preload_create_activity(object)","anchor":"object_preload_create_activity/1"},{"id":"object_under_activity/2","deprecated":false,"title":"object_under_activity(activity, object)","anchor":"object_under_activity/2"},{"id":"order_cursor_fields/2","deprecated":false,"title":"order_cursor_fields(arg1, sort_order)","anchor":"order_cursor_fields/2"},{"id":"order_pagination_opts/2","deprecated":false,"title":"order_pagination_opts(sort_by, sort_order)","anchor":"order_pagination_opts/2"},{"id":"put_assoc/3","deprecated":false,"title":"put_assoc(changeset, verb, subject)","anchor":"put_assoc/3"},{"id":"put_assoc/4","deprecated":false,"title":"put_assoc(changeset, verb, subject, object)","anchor":"put_assoc/4"},{"id":"query/2","deprecated":false,"title":"query(filters \\\\ [], opts_or_current_user \\\\ [])","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_object_preload_activity/4","deprecated":false,"title":"query_object_preload_activity(q, verb \\\\ :create, object_id_field \\\\ :id, opts \\\\ [])","anchor":"query_object_preload_activity/4"},{"id":"query_object_preload_create_activity/2","deprecated":false,"title":"query_object_preload_create_activity(q, opts \\\\ [])","anchor":"query_object_preload_create_activity/2"},{"id":"query_order/4","deprecated":false,"title":"query_order(query, sort_by, sort_order, with_pins? \\\\ false)","anchor":"query_order/4"},{"id":"read/2","deprecated":false,"title":"read(query, opts \\\\ [])","anchor":"read/2"},{"id":"read_query/2","deprecated":false,"title":"read_query(query, opts \\\\ [])","anchor":"read_query/2"},{"id":"reply_to_as_permitted_for/3","deprecated":false,"title":"reply_to_as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"reply_to_as_permitted_for/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"verb_congugate/1","deprecated":false,"title":"verb_congugate(verb)","anchor":"verb_congugate/1"},{"id":"verb_display/1","deprecated":false,"title":"verb_display(verb)","anchor":"verb_display/1"},{"id":"verb_id/1","deprecated":false,"title":"verb_id(verb)","anchor":"verb_id/1"},{"id":"verb_maybe_modify/2","deprecated":false,"title":"verb_maybe_modify(verb, activity \\\\ nil)","anchor":"verb_maybe_modify/2"},{"id":"verb_name/1","deprecated":false,"title":"verb_name(slug)","anchor":"verb_name/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Activity","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Activity","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Activity","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Activity.UnderObject","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Activity.UnderObject","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Activity.UnderObject","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.AntiSpam","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.AntiSpam","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.AntiSpam","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_text_content/2","deprecated":false,"title":"all_text_content(attrs, changeset)","anchor":"all_text_content/2"},{"id":"check!/3","deprecated":false,"title":"check!(changeset, attrs, context)","anchor":"check!/3"},{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"},{"id":"spam?/3","deprecated":false,"title":"spam?(changeset, attrs, context)","anchor":"spam?/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Federate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Federate","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Federate","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Feeds","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Feeds","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Feeds","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"},{"id":"thread_id/1","deprecated":false,"title":"thread_id(epic)","anchor":"thread_id/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.LivePush","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.LivePush","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.LivePush","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Objects.Delete","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Objects.Delete","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Objects.Delete"},{"id":"Bonfire.Social.Acts.PostContents","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.PostContents","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.PostContents","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Sensitivity","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Sensitivity","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Sensitivity","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Acts.Threaded","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Acts.Threaded","sections":[],"nested_context":"Bonfire","nested_title":".Social.Acts.Threaded","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Answers","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Answers","sections":[],"nested_context":"Bonfire","nested_title":".Social.Answers"},{"id":"Bonfire.Social.Bookmarks","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Bookmarks","sections":[],"nested_context":"Bonfire","nested_title":".Social.Bookmarks","nodeGroups":[{"name":"Functions","nodes":[{"id":"bookmark/3","deprecated":false,"title":"bookmark(bookmarker, bookmarked, opts \\\\ [])","anchor":"bookmark/3"},{"id":"bookmarked?/2","deprecated":false,"title":"bookmarked?(user, object)","anchor":"bookmarked?/2"},{"id":"by_bookmarked/2","deprecated":false,"title":"by_bookmarked(object, opts \\\\ [])","anchor":"by_bookmarked/2"},{"id":"by_bookmarker/2","deprecated":false,"title":"by_bookmarker(subject, opts \\\\ [])","anchor":"by_bookmarker/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unbookmark/3","deprecated":false,"title":"unbookmark(bookmarker, object, opts \\\\ [])","anchor":"unbookmark/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Bookmarks.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Bookmarks.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Bookmarks.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"bookmarker_count/1","deprecated":false,"title":"bookmarker_count(arg1)","anchor":"bookmarker_count/1"},{"id":"do_bookmark/3","deprecated":false,"title":"do_bookmark(object, params, socket)","anchor":"do_bookmark/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Boosts","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Boosts","sections":[],"nested_context":"Bonfire","nested_title":".Social.Boosts","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, boost)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"boost/3","deprecated":false,"title":"boost(booster, boosted, opts \\\\ [])","anchor":"boost/3"},{"id":"boosted?/2","deprecated":false,"title":"boosted?(user, object)","anchor":"boosted?/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"date_last_boosted/2","deprecated":false,"title":"date_last_boosted(user, object)","anchor":"date_last_boosted/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(id, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"maybe_boost/3","deprecated":false,"title":"maybe_boost(booster, boosted, opts \\\\ [])","anchor":"maybe_boost/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unboost/3","deprecated":false,"title":"unboost(booster, boosted, opts \\\\ [])","anchor":"unboost/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Boosts.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Boosts.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Boosts.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_boost/3","deprecated":false,"title":"do_boost(object, params, socket)","anchor":"do_boost/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Edges","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Edges","sections":[],"nested_context":"Bonfire","nested_title":".Social.Edges","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/5","deprecated":false,"title":"changeset(schema, subject, verb, object, options)","anchor":"changeset/5"},{"id":"changeset_base/4","deprecated":false,"title":"changeset_base(schema, subject, object, options)","anchor":"changeset_base/4"},{"id":"changeset_base_with_creator/4","deprecated":false,"title":"changeset_base_with_creator(schema, subject, object, options)","anchor":"changeset_base_with_creator/4"},{"id":"changeset_extra/5","deprecated":false,"title":"changeset_extra(schema, subject, verb, object, options)","anchor":"changeset_extra/5"},{"id":"changeset_without_caretaker/5","deprecated":false,"title":"changeset_without_caretaker(schema, subject, verb, object, options)","anchor":"changeset_without_caretaker/5"},{"id":"count/3","deprecated":false,"title":"count(type, filters_or_object, opts \\\\ [])","anchor":"count/3"},{"id":"count_for_subject/4","deprecated":false,"title":"count_for_subject(type, subject, object, opts)","anchor":"count_for_subject/4"},{"id":"delete_by_both/3","deprecated":false,"title":"delete_by_both(me, schema, object)","anchor":"delete_by_both/3"},{"id":"delete_by_object/1","deprecated":false,"title":"delete_by_object(user)","anchor":"delete_by_object/1"},{"id":"delete_by_subject/1","deprecated":false,"title":"delete_by_subject(user)","anchor":"delete_by_subject/1"},{"id":"edge_module_query/2","deprecated":false,"title":"edge_module_query(schema_or_context, args)","anchor":"edge_module_query/2"},{"id":"exists?/4","deprecated":false,"title":"exists?(schema_or_context, subject, object, opts)","anchor":"exists?/4"},{"id":"filters_from_opts/1","deprecated":false,"title":"filters_from_opts(assigns)","anchor":"filters_from_opts/1"},{"id":"get/4","deprecated":false,"title":"get(schema_or_context, subject, object, opts \\\\ [])","anchor":"get/4"},{"id":"get!/4","deprecated":false,"title":"get!(schema_or_context, subject, objects, opts \\\\ [])","anchor":"get!/4"},{"id":"insert/3","deprecated":false,"title":"insert(changeset, subject \\\\ nil, object \\\\ nil)","anchor":"insert/3"},{"id":"insert/5","deprecated":false,"title":"insert(schema, subject, verb, object, options)","anchor":"insert/5"},{"id":"last/4","deprecated":false,"title":"last(schema_or_context, subject, object, opts)","anchor":"last/4"},{"id":"last_date/4","deprecated":false,"title":"last_date(type, subject, object, opts)","anchor":"last_date/4"},{"id":"put_edge_assoc/3","deprecated":false,"title":"put_edge_assoc(changeset, subject, object)","anchor":"put_edge_assoc/3"},{"id":"put_edge_assoc/4","deprecated":false,"title":"put_edge_assoc(changeset, type_of_edge_schema, subject, object)","anchor":"put_edge_assoc/4"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_parent/3","deprecated":false,"title":"query_parent(query_schema, filters, opts)","anchor":"query_parent/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Social.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Social.FeedActivities","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.FeedActivities","sections":[],"nested_context":"Bonfire","nested_title":".Social.FeedActivities","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/2","deprecated":false,"title":"cast(changeset, feed_ids)","anchor":"cast/2"},{"id":"cast/3","deprecated":false,"title":"cast(changeset, creator, opts)","anchor":"cast/3"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"count_subjects/2","deprecated":false,"title":"count_subjects(filters \\\\ [], opts \\\\ [])","anchor":"count_subjects/2"},{"id":"count_total/0","deprecated":false,"title":"count_total()","anchor":"count_total/0"},{"id":"delete/1","deprecated":false,"title":"delete(filters)","anchor":"delete/1"},{"id":"delete/2","deprecated":false,"title":"delete(objects, by_field)","anchor":"delete/2"},{"id":"exclude_object_types/1","deprecated":false,"title":"exclude_object_types(extras \\\\ [])","anchor":"exclude_object_types/1"},{"id":"feed/2","deprecated":false,"title":"feed(feed, opts \\\\ [])","anchor":"feed/2"},{"id":"feed_contains?/3","deprecated":false,"title":"feed_contains?(feed_name, object, opts \\\\ [])","anchor":"feed_contains?/3"},{"id":"feed_contains_single?/3","deprecated":false,"title":"feed_contains_single?(feed_name, filters, opts)","anchor":"feed_contains_single?/3"},{"id":"feed_ids_and_opts/2","deprecated":false,"title":"feed_ids_and_opts(feed_name, opts)","anchor":"feed_ids_and_opts/2"},{"id":"feed_many_paginated/2","deprecated":false,"title":"feed_many_paginated(query, opts)","anchor":"feed_many_paginated/2"},{"id":"feed_name/2","deprecated":false,"title":"feed_name(name, current_user_or_socket)","anchor":"feed_name/2"},{"id":"feed_paginated/2","deprecated":false,"title":"feed_paginated(filters \\\\ [], opts \\\\ [])","anchor":"feed_paginated/2"},{"id":"feed_with_object/3","deprecated":false,"title":"feed_with_object(feed_name, object, opts \\\\ [])","anchor":"feed_with_object/3"},{"id":"feeds_for_activity/1","deprecated":false,"title":"feeds_for_activity(id)","anchor":"feeds_for_activity/1"},{"id":"filters_from_opts/1","deprecated":false,"title":"filters_from_opts(opts)","anchor":"filters_from_opts/1"},{"id":"get_feed_ids/1","deprecated":false,"title":"get_feed_ids(options)","anchor":"get_feed_ids/1"},{"id":"get_feed_publishes/1","deprecated":false,"title":"get_feed_publishes(options)","anchor":"get_feed_publishes/1"},{"id":"mark_all_seen/2","deprecated":false,"title":"mark_all_seen(feed_id, opts)","anchor":"mark_all_seen/2"},{"id":"maybe_feed_publish/5","deprecated":false,"title":"maybe_feed_publish(subject, verb_or_activity, object, feeds, opts)","anchor":"maybe_feed_publish/5"},{"id":"my_feed/2","deprecated":false,"title":"my_feed(opts, home_feed_ids \\\\ nil)","anchor":"my_feed/2"},{"id":"publish/4","deprecated":false,"title":"publish(subject, verb_or_activity, object, opts \\\\ [])","anchor":"publish/4"},{"id":"put_feed_publishes/2","deprecated":false,"title":"put_feed_publishes(changeset, options)","anchor":"put_feed_publishes/2"},{"id":"query/3","deprecated":false,"title":"query(filters \\\\ [], opts \\\\ [], query \\\\ default_query())","anchor":"query/3"},{"id":"query_extras_boundarised/2","deprecated":false,"title":"query_extras_boundarised(query \\\\ nil, opts)","anchor":"query_extras_boundarised/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"query_object_extras_boundarised/2","deprecated":false,"title":"query_object_extras_boundarised(query \\\\ nil, opts)","anchor":"query_object_extras_boundarised/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"skip_verbs_default/0","deprecated":false,"title":"skip_verbs_default()","anchor":"skip_verbs_default/0"},{"id":"the_object/1","deprecated":false,"title":"the_object(object)","anchor":"the_object/1"},{"id":"to_feed_options/1","deprecated":false,"title":"to_feed_options(opts)","anchor":"to_feed_options/1"},{"id":"unseen_count/2","deprecated":false,"title":"unseen_count(feed_id, opts)","anchor":"unseen_count/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Feeds","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Feeds","sections":[],"nested_context":"Bonfire","nested_title":".Social.Feeds","nodeGroups":[{"name":"Types","nodes":[{"id":"feed_name/0","deprecated":false,"title":"feed_name()","anchor":"t:feed_name/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"admin_notifications/1","deprecated":false,"title":"admin_notifications(admin)","anchor":"admin_notifications/1"},{"id":"admins_notifications/0","deprecated":false,"title":"admins_notifications()","anchor":"admins_notifications/0"},{"id":"admins_notifications/1","deprecated":false,"title":"admins_notifications(admins)","anchor":"admins_notifications/1"},{"id":"feed_id/2","deprecated":false,"title":"feed_id(type, object)","anchor":"feed_id/2"},{"id":"feed_id!/2","deprecated":false,"title":"feed_id!(feed_name, for_subject)","anchor":"feed_id!/2"},{"id":"feed_ids/2","deprecated":false,"title":"feed_ids(feed_name, for_subjects)","anchor":"feed_ids/2"},{"id":"feed_ids_to_publish/4","deprecated":false,"title":"feed_ids_to_publish(me, boundary, assigns, notify_feeds \\\\ nil)","anchor":"feed_ids_to_publish/4"},{"id":"inbox_of_obj_creator/1","deprecated":false,"title":"inbox_of_obj_creator(object)","anchor":"inbox_of_obj_creator/1"},{"id":"maybe_create_feed/2","deprecated":false,"title":"maybe_create_feed(type, for_subject)","anchor":"maybe_create_feed/2"},{"id":"maybe_creator_notification/3","deprecated":false,"title":"maybe_creator_notification(subject, object_creator, opts \\\\ [])","anchor":"maybe_creator_notification/3"},{"id":"maybe_custom_feeds/1","deprecated":false,"title":"maybe_custom_feeds(preset_and_custom_boundary)","anchor":"maybe_custom_feeds/1"},{"id":"maybe_my_outbox_feed_id/2","deprecated":false,"title":"maybe_my_outbox_feed_id(me, boundary)","anchor":"maybe_my_outbox_feed_id/2"},{"id":"my_feed_id/2","deprecated":false,"title":"my_feed_id(type, other)","anchor":"my_feed_id/2"},{"id":"my_home_feed_ids/2","deprecated":false,"title":"my_home_feed_ids(socket_or_opts, extra_feeds \\\\ [])","anchor":"my_home_feed_ids/2"},{"id":"named_feed_id/2","deprecated":false,"title":"named_feed_id(name, opts \\\\ [])","anchor":"named_feed_id/2"},{"id":"reply_and_or_mentions_notifications_feeds/5","deprecated":false,"title":"reply_and_or_mentions_notifications_feeds(me, boundary, mentions, reply_to_creator, to_circles \\\\ [])","anchor":"reply_and_or_mentions_notifications_feeds/5"},{"id":"reply_and_or_mentions_to_notify/5","deprecated":false,"title":"reply_and_or_mentions_to_notify(me, boundary, mentions, reply_to_creator, to_circles \\\\ [])","anchor":"reply_and_or_mentions_to_notify/5"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"target_feeds/3","deprecated":false,"title":"target_feeds(changeset, creator, opts)","anchor":"target_feeds/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Feeds.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Feeds.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Feeds.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"actions_update_many/2","deprecated":false,"title":"actions_update_many(assigns_sockets, opts)","anchor":"actions_update_many/2"},{"id":"activity_update_many/2","deprecated":false,"title":"activity_update_many(assigns_sockets, opts)","anchor":"activity_update_many/2"},{"id":"assign_feed/3","deprecated":false,"title":"assign_feed(socket, assigns, opts \\\\ [])","anchor":"assign_feed/3"},{"id":"feed_assigns_maybe_async/4","deprecated":false,"title":"feed_assigns_maybe_async(other, socket, show_loader \\\\ true, reset_stream \\\\ false)","anchor":"feed_assigns_maybe_async/4"},{"id":"feed_assigns_non_live/3","deprecated":false,"title":"feed_assigns_non_live(feed_id, assigns, opts)","anchor":"feed_assigns_non_live/3"},{"id":"feed_default_assigns/2","deprecated":false,"title":"feed_default_assigns(feed_name, socket)","anchor":"feed_default_assigns/2"},{"id":"feed_extra_preloads_list/2","deprecated":false,"title":"feed_extra_preloads_list(showing_within, thread_mode \\\\ nil)","anchor":"feed_extra_preloads_list/2"},{"id":"feed_live_update_many_preloads?/0","deprecated":false,"title":"feed_live_update_many_preloads?()","anchor":"feed_live_update_many_preloads?/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, 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(attrs, _, socket)","anchor":"handle_params/3"},{"id":"insert_feed/3","deprecated":false,"title":"insert_feed(socket, feed_edges, opts \\\\ [])","anchor":"insert_feed/3"},{"id":"load_user_feed_assigns/3","deprecated":false,"title":"load_user_feed_assigns(selected_tab_and_user_id, params, socket)","anchor":"load_user_feed_assigns/3"},{"id":"load_user_feed_assigns/4","deprecated":false,"title":"load_user_feed_assigns(tab, feed_id, attrs, socket)","anchor":"load_user_feed_assigns/4"},{"id":"object_preloads/0","deprecated":false,"title":"object_preloads()","anchor":"object_preloads/0"},{"id":"paginate_feed/4","deprecated":false,"title":"paginate_feed(feed_id, attrs, socket, opts \\\\ [])","anchor":"paginate_feed/4"},{"id":"paginate_fetch_assign_default/2","deprecated":false,"title":"paginate_fetch_assign_default(opts, socket)","anchor":"paginate_fetch_assign_default/2"},{"id":"paginate_opts/3","deprecated":false,"title":"paginate_opts(attrs, socket, opts)","anchor":"paginate_opts/3"},{"id":"preload_activity_and_object_assocs/3","deprecated":false,"title":"preload_activity_and_object_assocs(feed, under, opts)","anchor":"preload_activity_and_object_assocs/3"},{"id":"remove_activity/1","deprecated":false,"title":"remove_activity(activity)","anchor":"remove_activity/1"},{"id":"reply_to_activity/2","deprecated":false,"title":"reply_to_activity(js \\\\ %JS{}, target)","anchor":"reply_to_activity/2"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"user_feed_assign_or_load_async/4","deprecated":false,"title":"user_feed_assign_or_load_async(tab, user_or_feed, params, socket)","anchor":"user_feed_assign_or_load_async/4"}],"key":"functions"}]},{"id":"Bonfire.Social.Flags","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Flags","sections":[],"nested_context":"Bonfire","nested_title":".Social.Flags","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, flag)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, objects)","anchor":"ap_receive_activity/3"},{"id":"by_flagged/1","deprecated":false,"title":"by_flagged(object)","anchor":"by_flagged/1"},{"id":"by_flagger/1","deprecated":false,"title":"by_flagger(subject)","anchor":"by_flagger/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"flag/3","deprecated":false,"title":"flag(flagger, flagged, opts \\\\ [])","anchor":"flag/3"},{"id":"flagged?/2","deprecated":false,"title":"flagged?(user, object)","anchor":"flagged?/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"instance_moderators/0","deprecated":false,"title":"instance_moderators()","anchor":"instance_moderators/0"},{"id":"list/1","deprecated":false,"title":"list(opts)","anchor":"list/1"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts)","anchor":"list_paginated/2"},{"id":"list_preloaded/1","deprecated":false,"title":"list_preloaded(opts)","anchor":"list_preloaded/1"},{"id":"moderators/1","deprecated":false,"title":"moderators(object)","anchor":"moderators/1"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unflag/2","deprecated":false,"title":"unflag(flagger, flagged)","anchor":"unflag/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Flags.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Flags.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Flags.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Social.Graph","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"graph_add/3","deprecated":false,"title":"graph_add(subject, object, type)","anchor":"graph_add/3"},{"id":"graph_clear/0","deprecated":false,"title":"graph_clear()","anchor":"graph_clear/0"},{"id":"graph_conn/0","deprecated":false,"title":"graph_conn()","anchor":"graph_conn/0"},{"id":"graph_distance/2","deprecated":false,"title":"graph_distance(subject, object)","anchor":"graph_distance/2"},{"id":"graph_distances/1","deprecated":false,"title":"graph_distances(subject)","anchor":"graph_distances/1"},{"id":"graph_query/2","deprecated":false,"title":"graph_query(graph_conn \\\\ graph_conn(), query)","anchor":"graph_query/2"},{"id":"graph_remove/3","deprecated":false,"title":"graph_remove(subject, object, type)","anchor":"graph_remove/3"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"},{"id":"init_and_load/0","deprecated":false,"title":"init_and_load()","anchor":"init_and_load/0"},{"id":"load_from_db/0","deprecated":false,"title":"load_from_db()","anchor":"load_from_db/0"},{"id":"maybe_applications/0","deprecated":false,"title":"maybe_applications()","anchor":"maybe_applications/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(_)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Aliases","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Aliases","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Aliases","nodeGroups":[{"name":"Functions","nodes":[{"id":"add/3","deprecated":false,"title":"add(user, target, opts \\\\ [])","anchor":"add/3"},{"id":"all_by_object/2","deprecated":false,"title":"all_by_object(object, opts \\\\ [])","anchor":"all_by_object/2"},{"id":"all_by_subject/2","deprecated":false,"title":"all_by_subject(user, opts \\\\ [])","anchor":"all_by_subject/2"},{"id":"all_objects_by_subject/2","deprecated":false,"title":"all_objects_by_subject(user, opts \\\\ [])","anchor":"all_objects_by_subject/2"},{"id":"all_subjects_by_object/2","deprecated":false,"title":"all_subjects_by_object(object, opts \\\\ [])","anchor":"all_subjects_by_object/2"},{"id":"also_known_as?/2","deprecated":false,"title":"also_known_as?(local_ap_id, target)","anchor":"also_known_as?/2"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, target)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(subject, activity, origin_object)","anchor":"ap_receive_activity/3"},{"id":"exists?/2","deprecated":false,"title":"exists?(subject, target)","anchor":"exists?/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_aliased/2","deprecated":false,"title":"list_aliased(user, opts \\\\ [])","anchor":"list_aliased/2"},{"id":"list_aliases/2","deprecated":false,"title":"list_aliases(user, opts \\\\ [])","anchor":"list_aliases/2"},{"id":"list_my_aliased/2","deprecated":false,"title":"list_my_aliased(current_user, opts \\\\ [])","anchor":"list_my_aliased/2"},{"id":"list_my_aliases/2","deprecated":false,"title":"list_my_aliases(current_user, opts \\\\ [])","anchor":"list_my_aliases/2"},{"id":"move/2","deprecated":false,"title":"move(subject, target)","anchor":"move/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"remove/2","deprecated":false,"title":"remove(user, target)","anchor":"remove/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Aliases.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Aliases.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Aliases.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Fake","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Fake","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Fake","nodeGroups":[{"name":"Functions","nodes":[{"id":"fake_follow!/0","deprecated":false,"title":"fake_follow!()","anchor":"fake_follow!/0"},{"id":"fake_incoming_follow!/0","deprecated":false,"title":"fake_incoming_follow!()","anchor":"fake_incoming_follow!/0"},{"id":"fake_outgoing_follow!/0","deprecated":false,"title":"fake_outgoing_follow!()","anchor":"fake_outgoing_follow!/0"},{"id":"fake_remote_user!/0","deprecated":false,"title":"fake_remote_user!()","anchor":"fake_remote_user!/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Follows","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Follows","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Follows","nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/2","deprecated":false,"title":"accept(request, opts)","anchor":"accept/2"},{"id":"accept_from/2","deprecated":false,"title":"accept_from(subject, opts)","anchor":"accept_from/2"},{"id":"all_by_object/2","deprecated":false,"title":"all_by_object(user, opts \\\\ [])","anchor":"all_by_object/2"},{"id":"all_by_subject/2","deprecated":false,"title":"all_by_subject(user, opts \\\\ [])","anchor":"all_by_subject/2"},{"id":"all_followed_outboxes/2","deprecated":false,"title":"all_followed_outboxes(user, opts \\\\ [])","anchor":"all_followed_outboxes/2"},{"id":"all_objects_by_subject/2","deprecated":false,"title":"all_objects_by_subject(user, opts \\\\ [])","anchor":"all_objects_by_subject/2"},{"id":"all_subjects_by_object/2","deprecated":false,"title":"all_subjects_by_object(user, opts \\\\ [])","anchor":"all_subjects_by_object/2"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, object)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(follower, activity, object)","anchor":"ap_receive_activity/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"follow/3","deprecated":false,"title":"follow(user, object, opts \\\\ [])","anchor":"follow/3"},{"id":"following?/2","deprecated":false,"title":"following?(subject, object)","anchor":"following?/2"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"ignore/2","deprecated":false,"title":"ignore(request, opts)","anchor":"ignore/2"},{"id":"list_followed/2","deprecated":false,"title":"list_followed(user, opts \\\\ [])","anchor":"list_followed/2"},{"id":"list_followers/2","deprecated":false,"title":"list_followers(user, opts \\\\ [])","anchor":"list_followers/2"},{"id":"list_my_followed/2","deprecated":false,"title":"list_my_followed(current_user, opts \\\\ [])","anchor":"list_my_followed/2"},{"id":"list_my_followers/2","deprecated":false,"title":"list_my_followers(current_user, opts \\\\ [])","anchor":"list_my_followers/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"requested?/2","deprecated":false,"title":"requested?(subject, object)","anchor":"requested?/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unfollow/3","deprecated":false,"title":"unfollow(user, object, opts \\\\ [])","anchor":"unfollow/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Follows.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Follows.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Follows.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Import","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Import","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Import","nodeGroups":[{"name":"Functions","nodes":[{"id":"import_from_csv_file/3","deprecated":false,"title":"import_from_csv_file(arg1, scope, path)","anchor":"import_from_csv_file/3"},{"id":"perform/1","deprecated":false,"title":"perform(map)","anchor":"perform/1"},{"id":"perform/3","deprecated":false,"title":"perform(op, identifier, scope)","anchor":"perform/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Graph.Integration","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Graph.Integration","sections":[],"nested_context":"Bonfire","nested_title":".Social.Graph.Integration","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"}],"key":"functions"}]},{"id":"Bonfire.Social.Likes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Likes","sections":[],"nested_context":"Bonfire","nested_title":".Social.Likes","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, arg2, like)","anchor":"ap_publish_activity/3"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(liker, activity, object)","anchor":"ap_receive_activity/3"},{"id":"by_liked/2","deprecated":false,"title":"by_liked(object, opts \\\\ [])","anchor":"by_liked/2"},{"id":"by_liker/2","deprecated":false,"title":"by_liker(subject, opts \\\\ [])","anchor":"by_liker/2"},{"id":"count/2","deprecated":false,"title":"count(filters \\\\ [], opts \\\\ [])","anchor":"count/2"},{"id":"do_like/3","deprecated":false,"title":"do_like(liker, liked, opts \\\\ [])","anchor":"do_like/3"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"get_or_create_emoji/2","deprecated":false,"title":"get_or_create_emoji(emoji, meta)","anchor":"get_or_create_emoji/2"},{"id":"like/3","deprecated":false,"title":"like(liker, object, opts \\\\ [])","anchor":"like/3"},{"id":"liked?/2","deprecated":false,"title":"liked?(user, object)","anchor":"liked?/2"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts)","anchor":"list_paginated/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unlike/3","deprecated":false,"title":"unlike(liker, object, opts \\\\ [])","anchor":"unlike/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Likes.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Likes.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Likes.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_like/3","deprecated":false,"title":"do_like(object, params, socket)","anchor":"do_like/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"liker_count/1","deprecated":false,"title":"liker_count(arg1)","anchor":"liker_count/1"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"update_many/2","deprecated":false,"title":"update_many(assigns_sockets, opts \\\\ [])","anchor":"update_many/2"},{"id":"update_many_opts/1","deprecated":false,"title":"update_many_opts(opts \\\\ [])","anchor":"update_many_opts/1"}],"key":"functions"}]},{"id":"Bonfire.Social.LivePush","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.LivePush","sections":[],"nested_context":"Bonfire","nested_title":".Social.LivePush","nodeGroups":[{"name":"Functions","nodes":[{"id":"hide_activity/2","deprecated":false,"title":"hide_activity(feed_id, activity_id)","anchor":"hide_activity/2"},{"id":"notify/2","deprecated":false,"title":"notify(activity, opts)","anchor":"notify/2"},{"id":"notify/4","deprecated":false,"title":"notify(subject, verb, object, opts)","anchor":"notify/4"},{"id":"notify_of_message/4","deprecated":false,"title":"notify_of_message(subject, verb, object, users)","anchor":"notify_of_message/4"},{"id":"notify_users/4","deprecated":false,"title":"notify_users(subject, verb, object, users)","anchor":"notify_users/4"},{"id":"prepare_activity/2","deprecated":false,"title":"prepare_activity(activity, opts \\\\ [])","anchor":"prepare_activity/2"},{"id":"push_activity/3","deprecated":false,"title":"push_activity(to_feeds, activity, opts \\\\ [])","anchor":"push_activity/3"},{"id":"push_activity_object/4","deprecated":false,"title":"push_activity_object(to_notify, parent_object, object, opts)","anchor":"push_activity_object/4"}],"key":"functions"}]},{"id":"Bonfire.Social.Objects","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Objects","sections":[],"nested_context":"Bonfire","nested_title":".Social.Objects","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_maybe_delete/2","deprecated":false,"title":"ap_maybe_delete(creator, object)","anchor":"ap_maybe_delete/2"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity, object)","anchor":"ap_receive_activity/3"},{"id":"as_permitted_for/3","deprecated":false,"title":"as_permitted_for(q, opts \\\\ [], verbs \\\\ [:see, :read])","anchor":"as_permitted_for/3"},{"id":"care_closures/1","deprecated":false,"title":"care_closures(ids)","anchor":"care_closures/1"},{"id":"care_taken/1","deprecated":false,"title":"care_taken(ids)","anchor":"care_taken/1"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, creator, opts)","anchor":"cast/4"},{"id":"cast_acl/3","deprecated":false,"title":"cast_acl(changeset, creator, opts)","anchor":"cast_acl/3"},{"id":"cast_basic/4","deprecated":false,"title":"cast_basic(changeset, attrs, creator, opts)","anchor":"cast_basic/4"},{"id":"cast_caretaker/2","deprecated":false,"title":"cast_caretaker(changeset, caretaker)","anchor":"cast_caretaker/2"},{"id":"cast_creator/2","deprecated":false,"title":"cast_creator(changeset, creator)","anchor":"cast_creator/2"},{"id":"cast_creator_caretaker/2","deprecated":false,"title":"cast_creator_caretaker(changeset, user)","anchor":"cast_creator_caretaker/2"},{"id":"cast_mini/4","deprecated":false,"title":"cast_mini(changeset, attrs, creator, opts)","anchor":"cast_mini/4"},{"id":"cast_publish/4","deprecated":false,"title":"cast_publish(changeset, attrs, creator, opts)","anchor":"cast_publish/4"},{"id":"cast_sensitivity/2","deprecated":false,"title":"cast_sensitivity(changeset, sensitive?)","anchor":"cast_sensitivity/2"},{"id":"changeset_named/2","deprecated":false,"title":"changeset_named(object \\\\ %{}, attrs)","anchor":"changeset_named/2"},{"id":"delete/2","deprecated":false,"title":"delete(object, opts)","anchor":"delete/2"},{"id":"delete_apply_error/2","deprecated":false,"title":"delete_apply_error(error, args)","anchor":"delete_apply_error/2"},{"id":"delete_caretaken/1","deprecated":false,"title":"delete_caretaken(main)","anchor":"delete_caretaken/1"},{"id":"do_delete/2","deprecated":false,"title":"do_delete(objects, opts \\\\ [])","anchor":"do_delete/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"filter/3","deprecated":false,"title":"filter(atom, user, query)","anchor":"filter/3"},{"id":"list_paginated/2","deprecated":false,"title":"list_paginated(filters, opts \\\\ [])","anchor":"list_paginated/2"},{"id":"list_query/2","deprecated":false,"title":"list_query(type_or_query \\\\ nil, opts)","anchor":"list_query/2"},{"id":"maybe_generic_delete/3","deprecated":false,"title":"maybe_generic_delete(type, object, options \\\\ [])","anchor":"maybe_generic_delete/3"},{"id":"maybe_preload_activity_object/2","deprecated":false,"title":"maybe_preload_activity_object(pointer, opts)","anchor":"maybe_preload_activity_object/2"},{"id":"object_creator/1","deprecated":false,"title":"object_creator(object)","anchor":"object_creator/1"},{"id":"permalink/1","deprecated":false,"title":"permalink(object)","anchor":"permalink/1"},{"id":"preload_creator/1","deprecated":false,"title":"preload_creator(object)","anchor":"preload_creator/1"},{"id":"preload_reply_creator/1","deprecated":false,"title":"preload_reply_creator(object)","anchor":"preload_reply_creator/1"},{"id":"publish/5","deprecated":false,"title":"publish(creator, verb, thing, opts_or_attrs \\\\ nil, for_module \\\\ __MODULE__)","anchor":"publish/5"},{"id":"query_base/1","deprecated":false,"title":"query_base(type \\\\ nil)","anchor":"query_base/1"},{"id":"read/2","deprecated":false,"title":"read(object_id, opts)","anchor":"read/2"},{"id":"reset_preset_boundary/5","deprecated":false,"title":"reset_preset_boundary(creator, thing, previous_preset, opts_or_attrs \\\\ [], for_module \\\\ nil)","anchor":"reset_preset_boundary/5"},{"id":"run_epic/3","deprecated":false,"title":"run_epic(type, options \\\\ [], on \\\\ :object)","anchor":"run_epic/3"},{"id":"set_boundaries/4","deprecated":false,"title":"set_boundaries(creator, thing, opts_or_attrs \\\\ [], for_module \\\\ __MODULE__)","anchor":"set_boundaries/4"},{"id":"set_name/3","deprecated":false,"title":"set_name(id, name, opts)","anchor":"set_name/3"},{"id":"set_sensitivity/2","deprecated":false,"title":"set_sensitivity(pointer, arg2)","anchor":"set_sensitivity/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Objects.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Objects.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Objects.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"load_object_assigns/1","deprecated":false,"title":"load_object_assigns(socket)","anchor":"load_object_assigns/1"},{"id":"load_object_assigns/2","deprecated":false,"title":"load_object_assigns(assigns, socket)","anchor":"load_object_assigns/2"},{"id":"not_found_fallback/3","deprecated":false,"title":"not_found_fallback(id, params, socket)","anchor":"not_found_fallback/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Pins","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Pins","sections":[],"nested_context":"Bonfire","nested_title":".Social.Pins","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, pin)","anchor":"ap_publish_activity/3"},{"id":"by_pinned/2","deprecated":false,"title":"by_pinned(object, opts \\\\ [])","anchor":"by_pinned/2"},{"id":"by_pinner/2","deprecated":false,"title":"by_pinner(subject, opts \\\\ [])","anchor":"by_pinner/2"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"list_by/2","deprecated":false,"title":"list_by(by_user, opts \\\\ [])","anchor":"list_by/2"},{"id":"list_instance_pins/1","deprecated":false,"title":"list_instance_pins(opts)","anchor":"list_instance_pins/1"},{"id":"list_my/1","deprecated":false,"title":"list_my(opts)","anchor":"list_my/1"},{"id":"list_of/2","deprecated":false,"title":"list_of(object, opts \\\\ [])","anchor":"list_of/2"},{"id":"pin/4","deprecated":false,"title":"pin(pinner, object, scope \\\\ nil, opts \\\\ [])","anchor":"pin/4"},{"id":"pinned?/2","deprecated":false,"title":"pinned?(scope, object)","anchor":"pinned?/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"rank_pin/3","deprecated":false,"title":"rank_pin(pin, scope, position)","anchor":"rank_pin/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unpin/3","deprecated":false,"title":"unpin(user, object, scope \\\\ nil)","anchor":"unpin/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Pins.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Pins.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Pins.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"do_pin/3","deprecated":false,"title":"do_pin(object, params, socket)","anchor":"do_pin/3"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Social.PostContents","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.PostContents","sections":[],"nested_context":"Bonfire","nested_title":".Social.PostContents","nodeGroups":[{"name":"Functions","nodes":[{"id":"all_text_content/1","deprecated":false,"title":"all_text_content(attrs)","anchor":"all_text_content/1"},{"id":"ap_receive_activity/3","deprecated":false,"title":"ap_receive_activity(creator, activity_data, object)","anchor":"ap_receive_activity/3"},{"id":"ap_receive_attrs_prepare/4","deprecated":false,"title":"ap_receive_attrs_prepare(creator, activity_data, post_data, direct_recipients \\\\ [])","anchor":"ap_receive_attrs_prepare/4"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"cast/5","deprecated":false,"title":"cast(changeset, attrs, creator, boundary, opts)","anchor":"cast/5"},{"id":"changeset/2","deprecated":false,"title":"changeset(cs \\\\ %PostContent{}, attrs)","anchor":"changeset/2"},{"id":"diff/2","deprecated":false,"title":"diff(previous_version, current_version)","anchor":"diff/2"},{"id":"edit/3","deprecated":false,"title":"edit(current_user, id, attrs)","anchor":"edit/3"},{"id":"editor_output_content_type/1","deprecated":false,"title":"editor_output_content_type(user)","anchor":"editor_output_content_type/1"},{"id":"federation_module/0","deprecated":false,"title":"federation_module()","anchor":"federation_module/0"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_versions/1","deprecated":false,"title":"get_versions(post_content)","anchor":"get_versions/1"},{"id":"get_versions_diffed/1","deprecated":false,"title":"get_versions_diffed(post_content)","anchor":"get_versions_diffed/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(obj)","anchor":"indexing_object_format/1"},{"id":"maybe_detect_languages/2","deprecated":false,"title":"maybe_detect_languages(attrs, fields \\\\ [:name, :summary, :html_body])","anchor":"maybe_detect_languages/2"},{"id":"maybe_prepare_contents/4","deprecated":false,"title":"maybe_prepare_contents(attrs, creator, boundary, opts)","anchor":"maybe_prepare_contents/4"},{"id":"merge_with_body_or_nil/2","deprecated":false,"title":"merge_with_body_or_nil(attrs, map)","anchor":"merge_with_body_or_nil/2"},{"id":"no_known_output/2","deprecated":false,"title":"no_known_output(error, args)","anchor":"no_known_output/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"prepare_text/3","deprecated":false,"title":"prepare_text(text, creator, opts)","anchor":"prepare_text/3"},{"id":"query/2","deprecated":false,"title":"query(filters, opts \\\\ [])","anchor":"query/2"},{"id":"query_base/0","deprecated":false,"title":"query_base()","anchor":"query_base/0"},{"id":"search_query/2","deprecated":false,"title":"search_query(text, opts)","anchor":"search_query/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Requests","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Requests","sections":[],"nested_context":"Bonfire","nested_title":".Social.Requests","nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/2","deprecated":false,"title":"accept(request, opts)","anchor":"accept/2"},{"id":"all_by_object/3","deprecated":false,"title":"all_by_object(user, type, opts \\\\ [])","anchor":"all_by_object/3"},{"id":"all_by_subject/3","deprecated":false,"title":"all_by_subject(user, type, opts \\\\ [])","anchor":"all_by_subject/3"},{"id":"all_objects_by_subject/3","deprecated":false,"title":"all_objects_by_subject(user, type, opts \\\\ [])","anchor":"all_objects_by_subject/3"},{"id":"all_requested_outboxes/3","deprecated":false,"title":"all_requested_outboxes(user, type, opts \\\\ [])","anchor":"all_requested_outboxes/3"},{"id":"all_subjects_by_object/3","deprecated":false,"title":"all_subjects_by_object(user, type, opts \\\\ [])","anchor":"all_subjects_by_object/3"},{"id":"ap_publish_activity/3","deprecated":false,"title":"ap_publish_activity(subject, verb, action)","anchor":"ap_publish_activity/3"},{"id":"exists?/4","deprecated":false,"title":"exists?(subject, type, object, opts \\\\ [])","anchor":"exists?/4"},{"id":"get/2","deprecated":false,"title":"get(filters, opts \\\\ [])","anchor":"get/2"},{"id":"get/4","deprecated":false,"title":"get(subject, type, object, opts \\\\ [])","anchor":"get/4"},{"id":"get!/4","deprecated":false,"title":"get!(subject, type, object, opts \\\\ [])","anchor":"get!/4"},{"id":"ignore/2","deprecated":false,"title":"ignore(request, opts)","anchor":"ignore/2"},{"id":"list_my_requested/1","deprecated":false,"title":"list_my_requested(opts)","anchor":"list_my_requested/1"},{"id":"list_my_requesters/1","deprecated":false,"title":"list_my_requesters(opts)","anchor":"list_my_requesters/1"},{"id":"list_requested/2","deprecated":false,"title":"list_requested(user, opts \\\\ [])","anchor":"list_requested/2"},{"id":"list_requesters/2","deprecated":false,"title":"list_requesters(user, opts \\\\ [])","anchor":"list_requesters/2"},{"id":"many/2","deprecated":false,"title":"many(query, opts)","anchor":"many/2"},{"id":"query/3","deprecated":false,"title":"query(filters, type \\\\ nil, opts)","anchor":"query/3"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"request/4","deprecated":false,"title":"request(user, type, object, opts \\\\ [])","anchor":"request/4"},{"id":"requested/2","deprecated":false,"title":"requested(request, opts \\\\ [])","anchor":"requested/2"},{"id":"requested?/3","deprecated":false,"title":"requested?(subject, type, object)","anchor":"requested?/3"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unrequest/3","deprecated":false,"title":"unrequest(requester, type, object)","anchor":"unrequest/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Seen","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Seen","sections":[],"nested_context":"Bonfire","nested_title":".Social.Seen","nodeGroups":[{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(subject, object, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(subject, object, opts \\\\ [])","anchor":"get!/3"},{"id":"mark_seen/2","deprecated":false,"title":"mark_seen(subject, object)","anchor":"mark_seen/2"},{"id":"mark_unseen/2","deprecated":false,"title":"mark_unseen(subject, object)","anchor":"mark_unseen/2"},{"id":"query/2","deprecated":false,"title":"query(filters, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"seen?/2","deprecated":false,"title":"seen?(user, object)","anchor":"seen?/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Tags","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Tags","sections":[],"nested_context":"Bonfire","nested_title":".Social.Tags","nodeGroups":[{"name":"Functions","nodes":[{"id":"auto_boost/2","deprecated":false,"title":"auto_boost(categories_auto_boost, object)","anchor":"auto_boost/2"},{"id":"indexing_format_tags/1","deprecated":false,"title":"indexing_format_tags(tags)","anchor":"indexing_format_tags/1"},{"id":"maybe_auto_boost/3","deprecated":false,"title":"maybe_auto_boost(creator, category_or_categories, object)","anchor":"maybe_auto_boost/3"},{"id":"maybe_boostable_categories/2","deprecated":false,"title":"maybe_boostable_categories(creator, categories)","anchor":"maybe_boostable_categories/2"},{"id":"maybe_cast/4","deprecated":false,"title":"maybe_cast(changeset, attrs, creator, opts)","anchor":"maybe_cast/4"},{"id":"maybe_process/3","deprecated":false,"title":"maybe_process(creator, text, opts)","anchor":"maybe_process/3"}],"key":"functions"}]},{"id":"Bonfire.Social.Threads","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Threads","sections":[],"nested_context":"Bonfire","nested_title":".Social.Threads","nodeGroups":[{"name":"Functions","nodes":[{"id":"ap_prepare/2","deprecated":false,"title":"ap_prepare(object_or_thread_or_reply_to_id, key \\\\ :thread_id)","anchor":"ap_prepare/2"},{"id":"arrange_replies/2","deprecated":false,"title":"arrange_replies(replies, opts \\\\ [])","anchor":"arrange_replies/2"},{"id":"arrange_replies_tree/2","deprecated":false,"title":"arrange_replies_tree(replies, opts \\\\ [])","anchor":"arrange_replies_tree/2"},{"id":"base_query/0","deprecated":false,"title":"base_query()","anchor":"base_query/0"},{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, user, preset_or_custom_boundary)","anchor":"cast/4"},{"id":"changeset/2","deprecated":false,"title":"changeset(replied \\\\ %Replied{}, attrs)","anchor":"changeset/2"},{"id":"count_participants/2","deprecated":false,"title":"count_participants(thread_id, opts \\\\ [])","anchor":"count_participants/2"},{"id":"create_parent_replied/3","deprecated":false,"title":"create_parent_replied(changeset, replied, replied_attrs)","anchor":"create_parent_replied/3"},{"id":"filter/3","deprecated":false,"title":"filter(arg1, thread_id, query)","anchor":"filter/3"},{"id":"find_reply_to/2","deprecated":false,"title":"find_reply_to(attrs, user)","anchor":"find_reply_to/2"},{"id":"find_thread/2","deprecated":false,"title":"find_thread(attrs, user)","anchor":"find_thread/2"},{"id":"init_parent_replied/1","deprecated":false,"title":"init_parent_replied(replied_attrs)","anchor":"init_parent_replied/1"},{"id":"list_participants/3","deprecated":false,"title":"list_participants(activity_or_object, thread_or_object_id \\\\ nil, opts \\\\ [])","anchor":"list_participants/3"},{"id":"list_replies/2","deprecated":false,"title":"list_replies(thread, opts \\\\ [])","anchor":"list_replies/2"},{"id":"mark_all_seen/2","deprecated":false,"title":"mark_all_seen(filters, opts)","anchor":"mark_all_seen/2"},{"id":"maybe_re_order_result/2","deprecated":false,"title":"maybe_re_order_result(result, opts)","anchor":"maybe_re_order_result/2"},{"id":"maybe_with_pins/3","deprecated":false,"title":"maybe_with_pins(query, thread_id, opts)","anchor":"maybe_with_pins/3"},{"id":"query/2","deprecated":false,"title":"query(filter, opts)","anchor":"query/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"re_order_using_subquery/2","deprecated":false,"title":"re_order_using_subquery(query, opts)","anchor":"re_order_using_subquery/2"},{"id":"read/2","deprecated":false,"title":"read(object_id, opts)","anchor":"read/2"},{"id":"schema_module/0","deprecated":false,"title":"schema_module()","anchor":"schema_module/0"},{"id":"unseen_count/2","deprecated":false,"title":"unseen_count(filters, opts)","anchor":"unseen_count/2"},{"id":"unseen_query/2","deprecated":false,"title":"unseen_query(filters, opts)","anchor":"unseen_query/2"}],"key":"functions"}]},{"id":"Bonfire.Social.Threads.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Social.Threads.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Social.Threads.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, attrs, 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(attrs, uri, socket)","anchor":"handle_params/3"},{"id":"insert_comments/3","deprecated":false,"title":"insert_comments(socket, replies, opts \\\\ [])","anchor":"insert_comments/3"},{"id":"live_more/3","deprecated":false,"title":"live_more(thread_id, paginate, socket)","anchor":"live_more/3"},{"id":"load_thread/1","deprecated":false,"title":"load_thread(socket)","anchor":"load_thread/1"},{"id":"load_thread_assigns/2","deprecated":false,"title":"load_thread_assigns(socket, thread_id \\\\ nil)","anchor":"load_thread_assigns/2"},{"id":"load_thread_maybe_async/3","deprecated":false,"title":"load_thread_maybe_async(socket_or_opts, show_loader \\\\ true, reset_stream \\\\ false)","anchor":"load_thread_maybe_async/3"},{"id":"max_depth/1","deprecated":false,"title":"max_depth(ui_compact \\\\ nil)","anchor":"max_depth/1"},{"id":"maybe_subscribe/2","deprecated":false,"title":"maybe_subscribe(socket, thread_id)","anchor":"maybe_subscribe/2"},{"id":"reply/3","deprecated":false,"title":"reply(reply_to, activity, socket)","anchor":"reply/3"},{"id":"send_thread_updates/4","deprecated":false,"title":"send_thread_updates(pid \\\\ self(), thread_id, assigns, component \\\\ Bonfire.UI.Social.ThreadLive)","anchor":"send_thread_updates/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"},{"id":"thread_init/1","deprecated":false,"title":"thread_init(socket)","anchor":"thread_init/1"}],"key":"functions"}]},{"id":"Bonfire.Tag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag","sections":[{"id":"Handy commands","anchor":"module-handy-commands"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Tag","nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/4","deprecated":false,"title":"cast(changeset, attrs, creator, opts \\\\ [])","anchor":"cast/4"},{"id":"context_module/0","deprecated":false,"title":"context_module()","anchor":"context_module/0"},{"id":"find/2","deprecated":false,"title":"find(id, types \\\\ nil)","anchor":"find/2"},{"id":"format_tag/1","deprecated":false,"title":"format_tag(obj)","anchor":"format_tag/1"},{"id":"format_tags/1","deprecated":false,"title":"format_tags(tags)","anchor":"format_tags/1"},{"id":"get/2","deprecated":false,"title":"get(id, opts \\\\ [])","anchor":"get/2"},{"id":"get_hashtag/1","deprecated":false,"title":"get_hashtag(name)","anchor":"get_hashtag/1"},{"id":"get_hashtags_from_changeset/1","deprecated":false,"title":"get_hashtags_from_changeset(changeset)","anchor":"get_hashtags_from_changeset/1"},{"id":"get_mentions_from_changeset/1","deprecated":false,"title":"get_mentions_from_changeset(arg1)","anchor":"get_mentions_from_changeset/1"},{"id":"get_or_create_hashtag/1","deprecated":false,"title":"get_or_create_hashtag(name)","anchor":"get_or_create_hashtag/1"},{"id":"indexing_object_format/1","deprecated":false,"title":"indexing_object_format(object)","anchor":"indexing_object_format/1"},{"id":"indexing_object_format_name/1","deprecated":false,"title":"indexing_object_format_name(object)","anchor":"indexing_object_format_name/1"},{"id":"list_trending/2","deprecated":false,"title":"list_trending(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending/2"},{"id":"list_trending_reset/2","deprecated":false,"title":"list_trending_reset(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending_reset/2"},{"id":"list_trending_without_cache/2","deprecated":false,"title":"list_trending_without_cache(in_last_x_days \\\\ 30, limit \\\\ 10)","anchor":"list_trending_without_cache/2"},{"id":"many/2","deprecated":false,"title":"many(filters \\\\ [], opts \\\\ [])","anchor":"many/2"},{"id":"maybe_find_tag/3","deprecated":false,"title":"maybe_find_tag(current_user, id_or_username_or_url, types \\\\ nil)","anchor":"maybe_find_tag/3"},{"id":"maybe_find_tags/3","deprecated":false,"title":"maybe_find_tags(current_user, id_or_username_or_url, types \\\\ nil)","anchor":"maybe_find_tags/3"},{"id":"maybe_lookup_tag/2","deprecated":false,"title":"maybe_lookup_tag(id_or_username_or_url, prefix \\\\ \"@\")","anchor":"maybe_lookup_tag/2"},{"id":"maybe_put_tree_parent/3","deprecated":false,"title":"maybe_put_tree_parent(changeset, category, creator)","anchor":"maybe_put_tree_parent/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(user, thing, tags \\\\ nil, boost_category_mentions? \\\\ true)","anchor":"maybe_tag/4"},{"id":"maybe_taxonomy_tag/2","deprecated":false,"title":"maybe_taxonomy_tag(user, id)","anchor":"maybe_taxonomy_tag/2"},{"id":"one/2","deprecated":false,"title":"one(filters, opts \\\\ [])","anchor":"one/2"},{"id":"query_module/0","deprecated":false,"title":"query_module()","anchor":"query_module/0"},{"id":"search_hashtag/2","deprecated":false,"title":"search_hashtag(text, opts \\\\ [])","anchor":"search_hashtag/2"},{"id":"search_hashtag_query/2","deprecated":false,"title":"search_hashtag_query(text, opts)","anchor":"search_hashtag_query/2"},{"id":"tag_ids/1","deprecated":false,"title":"tag_ids(tags)","anchor":"tag_ids/1"},{"id":"tag_something/4","deprecated":false,"title":"tag_something(user, thing, tags, boost_or_label_category_tags? \\\\ true)","anchor":"tag_something/4"},{"id":"tag_things_changeset/2","deprecated":false,"title":"tag_things_changeset(tag, things)","anchor":"tag_things_changeset/2"},{"id":"thing_tags_changeset/2","deprecated":false,"title":"thing_tags_changeset(thing, tags)","anchor":"thing_tags_changeset/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Acts.Tag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Acts.Tag","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Acts.Tag","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Autocomplete","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Autocomplete","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Autocomplete","nodeGroups":[{"name":"Functions","nodes":[{"id":"api_tag_lookup/3","deprecated":false,"title":"api_tag_lookup(tag_search, prefix, consumer)","anchor":"api_tag_lookup/3"},{"id":"api_tag_lookup_public/4","deprecated":false,"title":"api_tag_lookup_public(tag_search, prefix, consumer, index_type)","anchor":"api_tag_lookup_public/4"},{"id":"filter_results/1","deprecated":false,"title":"filter_results(res)","anchor":"filter_results/1"},{"id":"find_all_tags/1","deprecated":false,"title":"find_all_tags(content)","anchor":"find_all_tags/1"},{"id":"maybe_find_tags/2","deprecated":false,"title":"maybe_find_tags(tag_search, index_type)","anchor":"maybe_find_tags/2"},{"id":"maybe_search/4","deprecated":false,"title":"maybe_search(tag_search, facets \\\\ nil, prefix \\\\ nil, consumer \\\\ nil)","anchor":"maybe_search/4"},{"id":"prefix_index/1","deprecated":false,"title":"prefix_index(prefix)","anchor":"prefix_index/1"},{"id":"search_or_lookup/3","deprecated":false,"title":"search_or_lookup(tag_search, index, facets \\\\ nil)","anchor":"search_or_lookup/3"},{"id":"search_prefix/2","deprecated":false,"title":"search_prefix(tag_search, prefix)","anchor":"search_prefix/2"},{"id":"search_type/2","deprecated":false,"title":"search_type(tag_search, type)","anchor":"search_type/2"},{"id":"tag_add_field/4","deprecated":false,"title":"tag_add_field(hit, consumer, prefix, username)","anchor":"tag_add_field/4"},{"id":"tag_hit_prepare/4","deprecated":false,"title":"tag_hit_prepare(hit, tag_search, prefix, consumer)","anchor":"tag_hit_prepare/4"},{"id":"tag_lookup_public/4","deprecated":false,"title":"tag_lookup_public(tag_search, index_type, prefix \\\\ nil, consumer \\\\ nil)","anchor":"tag_lookup_public/4"},{"id":"tag_search/2","deprecated":false,"title":"tag_search(tag_search, tag_prefix)","anchor":"tag_search/2"},{"id":"tag_search_from_tags/1","deprecated":false,"title":"tag_search_from_tags(text)","anchor":"tag_search_from_tags/1"},{"id":"tag_search_from_text/2","deprecated":false,"title":"tag_search_from_text(text, prefix)","anchor":"tag_search_from_text/2"},{"id":"tags_split/1","deprecated":false,"title":"tags_split(text)","anchor":"tags_split/1"},{"id":"try_all_prefixes/1","deprecated":false,"title":"try_all_prefixes(content)","anchor":"try_all_prefixes/1"},{"id":"try_prefixes/1","deprecated":false,"title":"try_prefixes(content)","anchor":"try_prefixes/1"},{"id":"try_tag_search/1","deprecated":false,"title":"try_tag_search(content)","anchor":"try_tag_search/1"},{"id":"try_tag_search/2","deprecated":false,"title":"try_tag_search(tag_prefix, words)","anchor":"try_tag_search/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.GraphQL.TagResolver","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.GraphQL.TagResolver","sections":[],"nested_context":"Bonfire","nested_title":".Tag.GraphQL.TagResolver","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_tag/2","deprecated":false,"title":"fetch_tag(info, id)","anchor":"fetch_tag/2"},{"id":"name/3","deprecated":false,"title":"name(arg1, _, arg3)","anchor":"name/3"},{"id":"summary/3","deprecated":false,"title":"summary(arg1, _, arg3)","anchor":"summary/3"},{"id":"tag/2","deprecated":false,"title":"tag(map, info)","anchor":"tag/2"},{"id":"tag_prepare/3","deprecated":false,"title":"tag_prepare(tag, page_opts, info)","anchor":"tag_prepare/3"},{"id":"tag_something/2","deprecated":false,"title":"tag_something(map, info)","anchor":"tag_something/2"},{"id":"tagged_things_edges/3","deprecated":false,"title":"tagged_things_edges(tag, page_opts, info)","anchor":"tagged_things_edges/3"},{"id":"tags_edges/3","deprecated":false,"title":"tags_edges(thing, page_opts, info)","anchor":"tags_edges/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.Hashtag","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Hashtag","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Hashtag","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(hashtag \\\\ %Hashtag{}, params)","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"normalize_name/1","deprecated":false,"title":"normalize_name(name)","anchor":"normalize_name/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.LiveHandler","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.LiveHandler","sections":[],"nested_context":"Bonfire","nested_title":".Tag.LiveHandler","nodeGroups":[{"name":"Functions","nodes":[{"id":"declared_extension/0","deprecated":false,"title":"declared_extension()","anchor":"declared_extension/0"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"maybe_tag/4","deprecated":false,"title":"maybe_tag(creator, object, tags, mentions_are_private? \\\\ false)","anchor":"maybe_tag/4"},{"id":"sigil_p/2","deprecated":false,"title":"sigil_p(route, extra)","anchor":"sigil_p/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Queries","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Queries","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Queries","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(q, filter_or_filters)","anchor":"filter/2"},{"id":"join_to/3","deprecated":false,"title":"join_to(q, table_or_tables, jq \\\\ :left)","anchor":"join_to/3"},{"id":"list_trending/2","deprecated":false,"title":"list_trending(since_date, opts \\\\ [])","anchor":"list_trending/2"},{"id":"queries/4","deprecated":false,"title":"queries(query, base_filters, data_filters, count_filters)","anchor":"queries/4"},{"id":"query/1","deprecated":false,"title":"query(pointable)","anchor":"query/1"},{"id":"query/2","deprecated":false,"title":"query(q, filters)","anchor":"query/2"}],"key":"functions"}]},{"id":"Bonfire.Tag.Simulate","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Simulate","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Simulate"},{"id":"Bonfire.Tag.Tagged","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Tagged","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Tagged","nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"},{"id":"changeset/2","deprecated":false,"title":"changeset(struct, params \\\\ %{})","anchor":"changeset/2"},{"id":"delete/2","deprecated":false,"title":"delete(struct, key)","anchor":"delete/2"},{"id":"get/3","deprecated":false,"title":"get(struct, key, default \\\\ nil)","anchor":"get/3"},{"id":"latest/1","deprecated":false,"title":"latest(thing_id)","anchor":"latest/1"},{"id":"put/3","deprecated":false,"title":"put(struct, key, val)","anchor":"put/3"},{"id":"q_with_tag/1","deprecated":false,"title":"q_with_tag(tag_id)","anchor":"q_with_tag/1"},{"id":"q_with_thing/1","deprecated":false,"title":"q_with_thing(thing_id)","anchor":"q_with_thing/1"},{"id":"q_with_type/1","deprecated":false,"title":"q_with_type(types)","anchor":"q_with_type/1"},{"id":"search_query/2","deprecated":false,"title":"search_query(text, opts)","anchor":"search_query/2"},{"id":"thing_tags_insert/2","deprecated":false,"title":"thing_tags_insert(thing, tags)","anchor":"thing_tags_insert/2"},{"id":"with_tag/1","deprecated":false,"title":"with_tag(tag_id)","anchor":"with_tag/1"},{"id":"with_thing/1","deprecated":false,"title":"with_thing(thing_id)","anchor":"with_thing/1"},{"id":"with_type/1","deprecated":false,"title":"with_type(types)","anchor":"with_type/1"}],"key":"functions"}]},{"id":"Bonfire.Tag.TextContent.Formatter","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.TextContent.Formatter","sections":[],"nested_context":"Bonfire","nested_title":".Tag.TextContent.Formatter","nodeGroups":[{"name":"Functions","nodes":[{"id":"linkify/2","deprecated":false,"title":"linkify(text, options \\\\ [])","anchor":"linkify/2"},{"id":"nothing_handler/3","deprecated":false,"title":"nothing_handler(text, opts, acc)","anchor":"nothing_handler/3"},{"id":"tag_handler/4","deprecated":false,"title":"tag_handler(tag_text, buffer, opts, acc)","anchor":"tag_handler/4"},{"id":"url_handler/3","deprecated":false,"title":"url_handler(url, opts, acc)","anchor":"url_handler/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.TextContent.Process","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.TextContent.Process","sections":[],"nested_context":"Bonfire","nested_title":".Tag.TextContent.Process","nodeGroups":[{"name":"Functions","nodes":[{"id":"html_escape/2","deprecated":false,"title":"html_escape(text, type)","anchor":"html_escape/2"},{"id":"process/3","deprecated":false,"title":"process(user \\\\ nil, text, content_type \\\\ nil)","anchor":"process/3"}],"key":"functions"}]},{"id":"Bonfire.Tag.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tag.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Tag.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Tags.Acts.AutoBoost","deprecated":false,"group":"Feature extensions","title":"Bonfire.Tags.Acts.AutoBoost","sections":[],"nested_context":"Bonfire","nested_title":".Tags.Acts.AutoBoost","nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(epic, act)","anchor":"run/2"}],"key":"functions"}]},{"id":"Bonfire.Telemetry","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry","nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measure, meta, _)","anchor":"handle_event/4"},{"id":"setup/2","deprecated":false,"title":"setup(env, repo_module)","anchor":"setup/2"},{"id":"setup_oban/0","deprecated":false,"title":"setup_oban()","anchor":"setup_oban/0"},{"id":"setup_opentelemetry/2","deprecated":false,"title":"setup_opentelemetry(env, repo_module)","anchor":"setup_opentelemetry/2"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.Metrics","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.Metrics","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.Metrics","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","deprecated":false,"title":"metrics()","anchor":"metrics/0"},{"id":"oban_worker_memory/0","deprecated":false,"title":"oban_worker_memory()","anchor":"oban_worker_memory/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.Storage","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.Storage","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.Storage","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"handle_event/4","deprecated":false,"title":"handle_event(event_name, data, metadata, metric)","anchor":"handle_event/4"},{"id":"metrics_history/1","deprecated":false,"title":"metrics_history(metric)","anchor":"metrics_history/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(args)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Bonfire.Telemetry.SystemMonitor","deprecated":false,"group":"Feature extensions","title":"Bonfire.Telemetry.SystemMonitor","sections":[],"nested_context":"Bonfire","nested_title":".Telemetry.SystemMonitor","nodeGroups":[{"name":"Functions","nodes":[{"id":"format_percent/1","deprecated":false,"title":"format_percent(percent)","anchor":"format_percent/1"},{"id":"handle_alarm/2","deprecated":false,"title":"handle_alarm(alarm_name, alarm_description)","anchor":"handle_alarm/2"},{"id":"handle_event/2","deprecated":false,"title":"handle_event(arg, state)","anchor":"handle_event/2"},{"id":"init/1","deprecated":false,"title":"init(arg)","anchor":"init/1"}],"key":"functions"}]},{"id":"Bonfire.Testing","deprecated":false,"group":"Feature extensions","title":"Bonfire.Testing","sections":[],"nested_context":"Bonfire","nested_title":".Testing","nodeGroups":[{"name":"Functions","nodes":[{"id":"configure_start_test/1","deprecated":false,"title":"configure_start_test(opts \\\\ [migrate: false])","anchor":"configure_start_test/1"}],"key":"functions"}]},{"id":"Bonfire.Testing.InsecurePW","deprecated":false,"group":"Feature extensions","title":"Bonfire.Testing.InsecurePW","sections":[],"nested_context":"Bonfire","nested_title":".Testing.InsecurePW","nodeGroups":[{"name":"Functions","nodes":[{"id":"no_user_verify/0","deprecated":false,"title":"no_user_verify()","anchor":"no_user_verify/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle","sections":[{"id":"Set up","anchor":"module-set-up"},{"id":"Copyright and License","anchor":"module-copyright-and-license"}],"nested_context":"Bonfire","nested_title":".Upcycle","nodeGroups":[{"name":"Functions","nodes":[{"id":"format_date/1","deprecated":false,"title":"format_date(date)","anchor":"format_date/1"},{"id":"involved?/2","deprecated":false,"title":"involved?(resource, context)","anchor":"involved?/2"},{"id":"mailer/0","deprecated":false,"title":"mailer()","anchor":"mailer/0"},{"id":"remote_tag_id/0","deprecated":false,"title":"remote_tag_id()","anchor":"remote_tag_id/0"},{"id":"remote_tag_prefix/0","deprecated":false,"title":"remote_tag_prefix()","anchor":"remote_tag_prefix/0"},{"id":"units/0","deprecated":false,"title":"units()","anchor":"units/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.IntentLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.IntentLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.IntentLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.MapLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.MapLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.MapLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.ResourceLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.ResourceLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.ResourceLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.HomeLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.HomeLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.HomeLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.InventoryLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.InventoryLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.Routes","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.Routes","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.Routes","nodeGroups":[{"name":"Functions","nodes":[{"id":"declare_routes/0","deprecated":false,"title":"declare_routes()","anchor":"declare_routes/0"}],"key":"functions"}]},{"id":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","deprecated":false,"group":"Feature extensions","title":"Bonfire.Upcycle.Web.TransfersLive.GraphQL","sections":[],"nested_context":"Bonfire","nested_title":".Upcycle.Web.TransfersLive.GraphQL","nodeGroups":[{"name":"Functions","nodes":[{"id":"lookup_schema/1","deprecated":false,"title":"lookup_schema(name)","anchor":"lookup_schema/1"},{"id":"pipeline/1","deprecated":false,"title":"pipeline(map)","anchor":"pipeline/1"},{"id":"process/2","deprecated":false,"title":"process(request, _)","anchor":"process/2"}],"key":"functions"}]},{"id":"ActivityPub","deprecated":false,"group":"Federation","title":"ActivityPub","sections":[{"id":"Installation","anchor":"module-installation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept/1","deprecated":false,"title":"accept(params)","anchor":"accept/1"},{"id":"accept_activity/1","deprecated":false,"title":"accept_activity(params)","anchor":"accept_activity/1"},{"id":"announce/1","deprecated":false,"title":"announce(params)","anchor":"announce/1"},{"id":"block/1","deprecated":false,"title":"block(params)","anchor":"block/1"},{"id":"create/1","deprecated":false,"title":"create(params)","anchor":"create/1"},{"id":"delete/3","deprecated":false,"title":"delete(object, is_local?, opts \\\\ [])","anchor":"delete/3"},{"id":"flag/1","deprecated":false,"title":"flag(params)","anchor":"flag/1"},{"id":"follow/1","deprecated":false,"title":"follow(params)","anchor":"follow/1"},{"id":"like/1","deprecated":false,"title":"like(params)","anchor":"like/1"},{"id":"move/4","deprecated":false,"title":"move(origin, target, local \\\\ true, recursing \\\\ false)","anchor":"move/4"},{"id":"reject/1","deprecated":false,"title":"reject(params)","anchor":"reject/1"},{"id":"unannounce/1","deprecated":false,"title":"unannounce(params)","anchor":"unannounce/1"},{"id":"unblock/1","deprecated":false,"title":"unblock(params)","anchor":"unblock/1"},{"id":"unfollow/1","deprecated":false,"title":"unfollow(params)","anchor":"unfollow/1"},{"id":"unlike/1","deprecated":false,"title":"unlike(params)","anchor":"unlike/1"},{"id":"update/1","deprecated":false,"title":"update(params)","anchor":"update/1"}],"key":"functions"}]},{"id":"ActivityPub.Actor","deprecated":false,"group":"Federation","title":"ActivityPub.Actor","sections":[],"nested_context":"ActivityPub","nested_title":".Actor","nodeGroups":[{"name":"Types","nodes":[{"id":"ap_id/0","deprecated":false,"title":"ap_id()","anchor":"t:ap_id/0"},{"id":"id/0","deprecated":false,"title":"id()","anchor":"t:id/0"},{"id":"pointer/0","deprecated":false,"title":"pointer()","anchor":"t:pointer/0"},{"id":"pointer_id/0","deprecated":false,"title":"pointer_id()","anchor":"t:pointer_id/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"},{"id":"username/0","deprecated":false,"title":"username()","anchor":"t:username/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"actor?/1","deprecated":false,"title":"actor?(arg1)","anchor":"actor?/1"},{"id":"actor_url/1","deprecated":false,"title":"actor_url(username)","anchor":"actor_url/1"},{"id":"also_known_as?/2","deprecated":false,"title":"also_known_as?(ap_id, actor)","anchor":"also_known_as?/2"},{"id":"check_actor_is_active/1","deprecated":false,"title":"check_actor_is_active(actor)","anchor":"check_actor_is_active/1"},{"id":"deactivate/1","deprecated":false,"title":"deactivate(actor)","anchor":"deactivate/1"},{"id":"delete/2","deprecated":false,"title":"delete(actor, is_local?)","anchor":"delete/2"},{"id":"fetch_by_username/2","deprecated":false,"title":"fetch_by_username(username, opts \\\\ [])","anchor":"fetch_by_username/2"},{"id":"format_remote_actor/1","deprecated":false,"title":"format_remote_actor(object)","anchor":"format_remote_actor/1"},{"id":"format_username/1","deprecated":false,"title":"format_username(ap_id)","anchor":"format_username/1"},{"id":"format_username/2","deprecated":false,"title":"format_username(ap_id, nick)","anchor":"format_username/2"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(id)","anchor":"get_cached/1"},{"id":"get_cached!/1","deprecated":false,"title":"get_cached!(opts)","anchor":"get_cached!/1"},{"id":"get_cached_or_fetch/1","deprecated":false,"title":"get_cached_or_fetch(username_or_uri)","anchor":"get_cached_or_fetch/1"},{"id":"get_external_followers/1","deprecated":false,"title":"get_external_followers(actor)","anchor":"get_external_followers/1"},{"id":"get_followers/1","deprecated":false,"title":"get_followers(actor)","anchor":"get_followers/1"},{"id":"get_followings/1","deprecated":false,"title":"get_followings(actor)","anchor":"get_followings/1"},{"id":"get_non_cached/1","deprecated":false,"title":"get_non_cached(opts)","anchor":"get_non_cached/1"},{"id":"invalidate_cache/1","deprecated":false,"title":"invalidate_cache(actor)","anchor":"invalidate_cache/1"},{"id":"maybe_create_actor_from_object/1","deprecated":false,"title":"maybe_create_actor_from_object(actor)","anchor":"maybe_create_actor_from_object/1"},{"id":"reactivate/1","deprecated":false,"title":"reactivate(actor)","anchor":"reactivate/1"},{"id":"save_actor_tombstone/2","deprecated":false,"title":"save_actor_tombstone(actor, tombstone)","anchor":"save_actor_tombstone/2"},{"id":"set_cache/1","deprecated":false,"title":"set_cache(actor)","anchor":"set_cache/1"},{"id":"swap_or_create_actor_tombstone/1","deprecated":false,"title":"swap_or_create_actor_tombstone(actor)","anchor":"swap_or_create_actor_tombstone/1"},{"id":"update_actor/1","deprecated":false,"title":"update_actor(actor_id)","anchor":"update_actor/1"},{"id":"update_actor/2","deprecated":false,"title":"update_actor(actor_id, data)","anchor":"update_actor/2"}],"key":"functions"}]},{"id":"ActivityPub.Config","deprecated":false,"group":"Federation","title":"ActivityPub.Config","sections":[],"nested_context":"ActivityPub","nested_title":".Config","nodeGroups":[{"name":"Functions","nodes":[{"id":"actors_and_collections/0","deprecated":false,"title":"actors_and_collections()","anchor":"actors_and_collections/0"},{"id":"collection_types/0","deprecated":false,"title":"collection_types()","anchor":"collection_types/0"},{"id":"delete/1","deprecated":false,"title":"delete(key)","anchor":"delete/1"},{"id":"env/0","deprecated":false,"title":"env()","anchor":"env/0"},{"id":"federating?/0","deprecated":false,"title":"federating?()","anchor":"federating?/0"},{"id":"get/1","deprecated":false,"title":"get(key)","anchor":"get/1"},{"id":"get/2","deprecated":false,"title":"get(key, default)","anchor":"get/2"},{"id":"get!/1","deprecated":false,"title":"get!(key)","anchor":"get!/1"},{"id":"is_in/2","deprecated":false,"title":"is_in(type, fun)","anchor":"is_in/2"},{"id":"public_uri/0","deprecated":false,"title":"public_uri()","anchor":"public_uri/0"},{"id":"public_uris/0","deprecated":false,"title":"public_uris()","anchor":"public_uris/0"},{"id":"put/2","deprecated":false,"title":"put(key, value)","anchor":"put/2"},{"id":"supported_activity_types/0","deprecated":false,"title":"supported_activity_types()","anchor":"supported_activity_types/0"},{"id":"supported_actor_types/0","deprecated":false,"title":"supported_actor_types()","anchor":"supported_actor_types/0"}],"key":"functions"}]},{"id":"ActivityPub.Config.Error","deprecated":false,"group":"Federation","title":"ActivityPub.Config.Error","sections":[],"nested_context":"ActivityPub","nested_title":".Config.Error"},{"id":"ActivityPub.Federator","deprecated":false,"group":"Federation","title":"ActivityPub.Federator","sections":[],"nested_context":"ActivityPub","nested_title":".Federator","nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/3","deprecated":false,"title":"perform(task, activity_or_module, params_or_opts \\\\ [])","anchor":"perform/3"},{"id":"publish/2","deprecated":false,"title":"publish(activity, opts \\\\ [])","anchor":"publish/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.APPublisher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.APPublisher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.APPublisher","nodeGroups":[{"name":"Functions","nodes":[{"id":"determine_inbox/4","deprecated":false,"title":"determine_inbox(user, is_public, type, num_recipients)","anchor":"determine_inbox/4"},{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(actor)","anchor":"gather_webfinger_links/1"},{"id":"is_representable?/1","deprecated":false,"title":"is_representable?(activity)","anchor":"is_representable?/1"},{"id":"maybe_federate_to_search_index/2","deprecated":false,"title":"maybe_federate_to_search_index(recipients, activity)","anchor":"maybe_federate_to_search_index/2"},{"id":"publish/3","deprecated":false,"title":"publish(actor, activity, opts \\\\ [])","anchor":"publish/3"},{"id":"publish_one/1","deprecated":false,"title":"publish_one(params)","anchor":"publish_one/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Adapter","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Adapter","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Adapter","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"c:base_url/0"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(t, t)","anchor":"c:external_followers_for_activity/2"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(ap_id)","anchor":"c:get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"c:get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"c:get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(t)","anchor":"c:get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(t)","anchor":"c:get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"c:get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"c:get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(arg1)","anchor":"c:get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(t)","anchor":"c:handle_activity/1"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(t)","anchor":"c:maybe_create_remote_actor/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(t, t)","anchor":"c:maybe_publish_object/2"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(t, t)","anchor":"c:update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(t)","anchor":"c:update_remote_actor/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"adapter/0","deprecated":false,"title":"adapter()","anchor":"adapter/0"},{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"call_or/3","deprecated":false,"title":"call_or(fun, args \\\\ [], fallback \\\\ nil)","anchor":"call_or/3"},{"id":"external_followers_for_activity/2","deprecated":false,"title":"external_followers_for_activity(actor, activity)","anchor":"external_followers_for_activity/2"},{"id":"federate_actor?/3","deprecated":false,"title":"federate_actor?(actor, direction \\\\ nil, by_actor \\\\ nil)","anchor":"federate_actor?/3"},{"id":"get_actor_by_ap_id/1","deprecated":false,"title":"get_actor_by_ap_id(id)","anchor":"get_actor_by_ap_id/1"},{"id":"get_actor_by_id/1","deprecated":false,"title":"get_actor_by_id(id)","anchor":"get_actor_by_id/1"},{"id":"get_actor_by_username/1","deprecated":false,"title":"get_actor_by_username(username)","anchor":"get_actor_by_username/1"},{"id":"get_follower_local_ids/1","deprecated":false,"title":"get_follower_local_ids(actor)","anchor":"get_follower_local_ids/1"},{"id":"get_following_local_ids/1","deprecated":false,"title":"get_following_local_ids(actor)","anchor":"get_following_local_ids/1"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"get_or_create_service_actor/0","deprecated":false,"title":"get_or_create_service_actor()","anchor":"get_or_create_service_actor/0"},{"id":"get_redirect_url/1","deprecated":false,"title":"get_redirect_url(id_or_username_or_object)","anchor":"get_redirect_url/1"},{"id":"handle_activity/1","deprecated":false,"title":"handle_activity(activity)","anchor":"handle_activity/1"},{"id":"maybe_create_remote_actor/1","deprecated":false,"title":"maybe_create_remote_actor(actor)","anchor":"maybe_create_remote_actor/1"},{"id":"maybe_handle_activity/1","deprecated":false,"title":"maybe_handle_activity(activity)","anchor":"maybe_handle_activity/1"},{"id":"maybe_publish_object/2","deprecated":false,"title":"maybe_publish_object(object, manually_fetching? \\\\ false)","anchor":"maybe_publish_object/2"},{"id":"update_local_actor/2","deprecated":false,"title":"update_local_actor(actor, params)","anchor":"update_local_actor/2"},{"id":"update_remote_actor/1","deprecated":false,"title":"update_remote_actor(actor)","anchor":"update_remote_actor/1"},{"id":"update_remote_actor/2","deprecated":false,"title":"update_remote_actor(actor, data)","anchor":"update_remote_actor/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Fetcher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Fetcher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Fetcher","nodeGroups":[{"name":"Functions","nodes":[{"id":"allowed_recursion?/2","deprecated":false,"title":"allowed_recursion?(distance, max_recursion \\\\ nil)","anchor":"allowed_recursion?/2"},{"id":"cache_fetch_error/1","deprecated":false,"title":"cache_fetch_error(id)","anchor":"cache_fetch_error/1"},{"id":"enqueue_fetch/2","deprecated":false,"title":"enqueue_fetch(id, worker_attrs \\\\ %{})","anchor":"enqueue_fetch/2"},{"id":"fetch_collection/2","deprecated":false,"title":"fetch_collection(ap_id, opts \\\\ [])","anchor":"fetch_collection/2"},{"id":"fetch_fresh_object_from_id/2","deprecated":false,"title":"fetch_fresh_object_from_id(id, opts \\\\ [])","anchor":"fetch_fresh_object_from_id/2"},{"id":"fetch_object_from_id/2","deprecated":false,"title":"fetch_object_from_id(id, opts \\\\ [])","anchor":"fetch_object_from_id/2"},{"id":"fetch_objects_from_id/2","deprecated":false,"title":"fetch_objects_from_id(ids, opts \\\\ [])","anchor":"fetch_objects_from_id/2"},{"id":"fetch_outbox/2","deprecated":false,"title":"fetch_outbox(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_outbox/2"},{"id":"fetch_remote_object_from_id/2","deprecated":false,"title":"fetch_remote_object_from_id(id, options \\\\ [])","anchor":"fetch_remote_object_from_id/2"},{"id":"fetch_replies/2","deprecated":false,"title":"fetch_replies(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_replies/2"},{"id":"fetch_thread/2","deprecated":false,"title":"fetch_thread(actor, opts \\\\ [fetch_collection: :async])","anchor":"fetch_thread/2"},{"id":"get_cached_object_or_fetch_ap_id/2","deprecated":false,"title":"get_cached_object_or_fetch_ap_id(id, opts \\\\ [])","anchor":"get_cached_object_or_fetch_ap_id/2"},{"id":"get_cached_object_or_fetch_pointer_id/2","deprecated":false,"title":"get_cached_object_or_fetch_pointer_id(pointer, opts \\\\ [])","anchor":"get_cached_object_or_fetch_pointer_id/2"},{"id":"maybe_fetch/2","deprecated":false,"title":"maybe_fetch(entries, opts \\\\ [])","anchor":"maybe_fetch/2"},{"id":"maybe_parse_header_url/2","deprecated":false,"title":"maybe_parse_header_url(str, type)","anchor":"maybe_parse_header_url/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/4","deprecated":false,"title":"delete(url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"delete/4"},{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], options \\\\ [])","anchor":"get/3"},{"id":"http_request/5","deprecated":false,"title":"http_request(method, url, body \\\\ \"\", headers \\\\ [], options \\\\ [])","anchor":"http_request/5"},{"id":"post/4","deprecated":false,"title":"post(url, body, headers \\\\ [], options \\\\ [])","anchor":"post/4"},{"id":"put/4","deprecated":false,"title":"put(url, body, headers \\\\ [], options \\\\ [])","anchor":"put/4"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.Connection","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.Connection","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.Connection","nodeGroups":[{"name":"Functions","nodes":[{"id":"adapter_options/2","deprecated":false,"title":"adapter_options(adapter \\\\ Tesla.Adapter.Hackney, opts)","anchor":"adapter_options/2"},{"id":"new/1","deprecated":false,"title":"new(opts \\\\ [])","anchor":"new/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.RateLimit","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RateLimit","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RateLimit"},{"id":"ActivityPub.Federator.HTTP.RequestBuilder","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RequestBuilder","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RequestBuilder","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_param/4","deprecated":false,"title":"add_param(request, atom1, atom2, values)","anchor":"add_param/4"},{"id":"headers/2","deprecated":false,"title":"headers(request, header_list)","anchor":"headers/2"},{"id":"method/2","deprecated":false,"title":"method(request, m)","anchor":"method/2"},{"id":"opts/2","deprecated":false,"title":"opts(request, options)","anchor":"opts/2"},{"id":"url/2","deprecated":false,"title":"url(request, u)","anchor":"url/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.HTTP.RetryAfter","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.RetryAfter","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.RetryAfter"},{"id":"ActivityPub.Federator.HTTP.Tesla","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.HTTP.Tesla","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.HTTP.Tesla","nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"delete/3","deprecated":false,"title":"delete(client, url, opts)","anchor":"delete/3"},{"id":"delete!/3","deprecated":false,"title":"delete!(client, url, opts)","anchor":"delete!/3"},{"id":"get/3","deprecated":false,"title":"get(client, url, opts)","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(client, url, opts)","anchor":"get!/3"},{"id":"head/3","deprecated":false,"title":"head(client, url, opts)","anchor":"head/3"},{"id":"head!/3","deprecated":false,"title":"head!(client, url, opts)","anchor":"head!/3"},{"id":"options/3","deprecated":false,"title":"options(client, url, opts)","anchor":"options/3"},{"id":"options!/3","deprecated":false,"title":"options!(client, url, opts)","anchor":"options!/3"},{"id":"patch/4","deprecated":false,"title":"patch(client, url, body, opts)","anchor":"patch/4"},{"id":"patch!/4","deprecated":false,"title":"patch!(client, url, body, opts)","anchor":"patch!/4"},{"id":"post/4","deprecated":false,"title":"post(client, url, body, opts)","anchor":"post/4"},{"id":"post!/4","deprecated":false,"title":"post!(client, url, body, opts)","anchor":"post!/4"},{"id":"put/4","deprecated":false,"title":"put(client, url, body, opts)","anchor":"put/4"},{"id":"put!/4","deprecated":false,"title":"put!(client, url, body, opts)","anchor":"put!/4"},{"id":"request/2","deprecated":false,"title":"request(client \\\\ %Tesla.Client{}, options)","anchor":"request/2"},{"id":"request!/2","deprecated":false,"title":"request!(client \\\\ %Tesla.Client{}, options)","anchor":"request!/2"},{"id":"trace/3","deprecated":false,"title":"trace(client, url, opts)","anchor":"trace/3"},{"id":"trace!/3","deprecated":false,"title":"trace!(client, url, opts)","anchor":"trace!/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Publisher","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Publisher","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Publisher","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(t)","anchor":"c:gather_webfinger_links/1"},{"id":"is_representable?/1","deprecated":false,"title":"is_representable?(t)","anchor":"c:is_representable?/1"},{"id":"publish/2","deprecated":false,"title":"publish(t, t)","anchor":"c:publish/2"},{"id":"publish_one/1","deprecated":false,"title":"publish_one(t)","anchor":"c:publish_one/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"enqueue_one/2","deprecated":false,"title":"enqueue_one(module, params)","anchor":"enqueue_one/2"},{"id":"gather_webfinger_links/1","deprecated":false,"title":"gather_webfinger_links(user)","anchor":"gather_webfinger_links/1"},{"id":"publish/2","deprecated":false,"title":"publish(user, activity)","anchor":"publish/2"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Transformer","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Transformer","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Transformer","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_emoji_tags/1","deprecated":false,"title":"add_emoji_tags(object)","anchor":"add_emoji_tags/1"},{"id":"fix_actor/1","deprecated":false,"title":"fix_actor(data)","anchor":"fix_actor/1"},{"id":"fix_addressing/1","deprecated":false,"title":"fix_addressing(object)","anchor":"fix_addressing/1"},{"id":"fix_attachments/1","deprecated":false,"title":"fix_attachments(object)","anchor":"fix_attachments/1"},{"id":"fix_content_map/1","deprecated":false,"title":"fix_content_map(object)","anchor":"fix_content_map/1"},{"id":"fix_context/2","deprecated":false,"title":"fix_context(object, options)","anchor":"fix_context/2"},{"id":"fix_emoji/1","deprecated":false,"title":"fix_emoji(object)","anchor":"fix_emoji/1"},{"id":"fix_in_reply_to/2","deprecated":false,"title":"fix_in_reply_to(object, options \\\\ [])","anchor":"fix_in_reply_to/2"},{"id":"fix_object/2","deprecated":false,"title":"fix_object(object, options \\\\ [])","anchor":"fix_object/2"},{"id":"fix_quote_url/2","deprecated":false,"title":"fix_quote_url(object, options \\\\ [])","anchor":"fix_quote_url/2"},{"id":"fix_replies/2","deprecated":false,"title":"fix_replies(data, options)","anchor":"fix_replies/2"},{"id":"fix_summary/1","deprecated":false,"title":"fix_summary(object)","anchor":"fix_summary/1"},{"id":"fix_tag/1","deprecated":false,"title":"fix_tag(object)","anchor":"fix_tag/1"},{"id":"fix_url/1","deprecated":false,"title":"fix_url(object)","anchor":"fix_url/1"},{"id":"format_input/3","deprecated":false,"title":"format_input(text, binary, options \\\\ [])","anchor":"format_input/3"},{"id":"handle_incoming/2","deprecated":false,"title":"handle_incoming(data, opts \\\\ [])","anchor":"handle_incoming/2"},{"id":"maybe_handle_other_activity/1","deprecated":false,"title":"maybe_handle_other_activity(data)","anchor":"maybe_handle_other_activity/1"},{"id":"prepare_outgoing/1","deprecated":false,"title":"prepare_outgoing(data)","anchor":"prepare_outgoing/1"},{"id":"preserve_privacy_of_outgoing/2","deprecated":false,"title":"preserve_privacy_of_outgoing(other, target_instance_uri \\\\ nil)","anchor":"preserve_privacy_of_outgoing/2"},{"id":"replies/1","deprecated":false,"title":"replies(arg1)","anchor":"replies/1"},{"id":"set_replies/1","deprecated":false,"title":"set_replies(object)","anchor":"set_replies/1"},{"id":"take_emoji_tags/1","deprecated":false,"title":"take_emoji_tags(arg1)","anchor":"take_emoji_tags/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.WebFinger","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.WebFinger","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.WebFinger","nodeGroups":[{"name":"Functions","nodes":[{"id":"base_url/1","deprecated":false,"title":"base_url(account)","anchor":"base_url/1"},{"id":"finger/1","deprecated":false,"title":"finger(account)","anchor":"finger/1"},{"id":"output/1","deprecated":false,"title":"output(resource)","anchor":"output/1"},{"id":"represent_user/1","deprecated":false,"title":"represent_user(actor)","anchor":"represent_user/1"},{"id":"webfinger_from_json/1","deprecated":false,"title":"webfinger_from_json(doc)","anchor":"webfinger_from_json/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Worker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Worker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Worker","nodeGroups":[{"name":"Functions","nodes":[{"id":"worker_args/1","deprecated":false,"title":"worker_args(queue)","anchor":"worker_args/1"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.PublisherWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.PublisherWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.PublisherWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.ReceiverWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.ReceiverWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.ReceiverWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Federator.Workers.RemoteFetcherWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Federator.Workers.RemoteFetcherWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Federator.Workers.RemoteFetcherWorker","nodeGroups":[{"name":"Functions","nodes":[{"id":"enqueue/3","deprecated":false,"title":"enqueue(op, params, worker_args \\\\ [])","anchor":"enqueue/3"},{"id":"enqueueable/3","deprecated":false,"title":"enqueueable(op, params, worker_args \\\\ [])","anchor":"enqueueable/3"}],"key":"functions"}]},{"id":"ActivityPub.Fixtures","deprecated":false,"group":"Federation","title":"ActivityPub.Fixtures","sections":[],"nested_context":"ActivityPub","nested_title":".Fixtures","nodeGroups":[{"name":"Functions","nodes":[{"id":"file/1","deprecated":false,"title":"file(path)","anchor":"file/1"},{"id":"fixtures/0","deprecated":false,"title":"fixtures()","anchor":"fixtures/0"},{"id":"fixtures_generic/0","deprecated":false,"title":"fixtures_generic()","anchor":"fixtures_generic/0"},{"id":"fixtures_get/0","deprecated":false,"title":"fixtures_get()","anchor":"fixtures_get/0"},{"id":"get/4","deprecated":false,"title":"get(url, query \\\\ [], body \\\\ [], headers \\\\ [])","anchor":"get/4"},{"id":"head/4","deprecated":false,"title":"head(url, query, body, headers)","anchor":"head/4"},{"id":"insert/1","deprecated":false,"title":"insert(url)","anchor":"insert/1"},{"id":"insert_all/0","deprecated":false,"title":"insert_all()","anchor":"insert_all/0"},{"id":"insert_file/1","deprecated":false,"title":"insert_file(file)","anchor":"insert_file/1"},{"id":"insert_json/1","deprecated":false,"title":"insert_json(data)","anchor":"insert_json/1"},{"id":"maybe_get_local/4","deprecated":false,"title":"maybe_get_local(url, query, body, headers)","anchor":"maybe_get_local/4"},{"id":"mock_global/1","deprecated":false,"title":"mock_global(fun)","anchor":"mock_global/1"},{"id":"none/4","deprecated":false,"title":"none(url, query, body, headers)","anchor":"none/4"},{"id":"post/4","deprecated":false,"title":"post(url, query \\\\ [], body \\\\ [], headers \\\\ [])","anchor":"post/4"},{"id":"request/1","deprecated":false,"title":"request(env)","anchor":"request/1"}],"key":"functions"}]},{"id":"ActivityPub.Instances","deprecated":false,"group":"Federation","title":"ActivityPub.Instances","sections":[],"nested_context":"ActivityPub","nested_title":".Instances","nodeGroups":[{"name":"Functions","nodes":[{"id":"filter_reachable/1","deprecated":false,"title":"filter_reachable(urls_or_hosts)","anchor":"filter_reachable/1"},{"id":"host/1","deprecated":false,"title":"host(url_or_host)","anchor":"host/1"},{"id":"reachability_datetime_threshold/0","deprecated":false,"title":"reachability_datetime_threshold()","anchor":"reachability_datetime_threshold/0"},{"id":"reachable?/1","deprecated":false,"title":"reachable?(url_or_host)","anchor":"reachable?/1"},{"id":"scrape_nodeinfo/1","deprecated":false,"title":"scrape_nodeinfo(instance_uri)","anchor":"scrape_nodeinfo/1"},{"id":"set_consistently_unreachable/1","deprecated":false,"title":"set_consistently_unreachable(url_or_host)","anchor":"set_consistently_unreachable/1"},{"id":"set_reachable/1","deprecated":false,"title":"set_reachable(url_or_host)","anchor":"set_reachable/1"},{"id":"set_unreachable/2","deprecated":false,"title":"set_unreachable(url_or_host, unreachable_since \\\\ nil)","anchor":"set_unreachable/2"}],"key":"functions"}]},{"id":"ActivityPub.Instances.Instance","deprecated":false,"group":"Federation","title":"ActivityPub.Instances.Instance","sections":[],"nested_context":"ActivityPub","nested_title":".Instances.Instance","nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(struct, params \\\\ %{})","anchor":"changeset/2"},{"id":"do_set_reachable/1","deprecated":false,"title":"do_set_reachable(host)","anchor":"do_set_reachable/1"},{"id":"filter_reachable/1","deprecated":false,"title":"filter_reachable(urls_or_hosts)","anchor":"filter_reachable/1"},{"id":"host/1","deprecated":false,"title":"host(url_or_host)","anchor":"host/1"},{"id":"reachable?/1","deprecated":false,"title":"reachable?(uri_or_host)","anchor":"reachable?/1"},{"id":"set_reachable/1","deprecated":false,"title":"set_reachable(uri_or_host)","anchor":"set_reachable/1"},{"id":"set_unreachable/2","deprecated":false,"title":"set_unreachable(uri_or_host, unreachable_since \\\\ nil)","anchor":"set_unreachable/2"}],"key":"functions"}]},{"id":"ActivityPub.MRF","deprecated":false,"group":"Federation","title":"ActivityPub.MRF","sections":[{"id":"Writing your own MRF Policy","anchor":"module-writing-your-own-mrf-policy"}],"nested_context":"ActivityPub","nested_title":".MRF","nodeGroups":[{"name":"Callbacks","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(t, boolean)","anchor":"c:filter/2"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"filter/2","deprecated":false,"title":"filter(object, is_local?)","anchor":"filter/2"},{"id":"filter/3","deprecated":false,"title":"filter(policies, object, is_local?)","anchor":"filter/3"},{"id":"get_policies/0","deprecated":false,"title":"get_policies()","anchor":"get_policies/0"},{"id":"subdomain_match?/2","deprecated":false,"title":"subdomain_match?(domains, host)","anchor":"subdomain_match?/2"},{"id":"subdomains_regex/1","deprecated":false,"title":"subdomains_regex(domains)","anchor":"subdomains_regex/1"}],"key":"functions"}]},{"id":"ActivityPub.MRF.SimplePolicy","deprecated":false,"group":"Federation","title":"ActivityPub.MRF.SimplePolicy","sections":[],"nested_context":"ActivityPub","nested_title":".MRF.SimplePolicy","nodeGroups":[{"name":"Functions","nodes":[{"id":"check_reject/2","deprecated":false,"title":"check_reject(actor_info, object \\\\ nil)","anchor":"check_reject/2"}],"key":"functions"}]},{"id":"ActivityPub.Object","deprecated":false,"group":"Federation","title":"ActivityPub.Object","sections":[],"nested_context":"ActivityPub","nested_title":".Object","nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"actor_from_data/1","deprecated":false,"title":"actor_from_data(actor)","anchor":"actor_from_data/1"},{"id":"actor_id_from_data/1","deprecated":false,"title":"actor_id_from_data(id)","anchor":"actor_id_from_data/1"},{"id":"all/1","deprecated":false,"title":"all(filters)","anchor":"all/1"},{"id":"changeset/1","deprecated":false,"title":"changeset(attrs)","anchor":"changeset/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(object, attrs)","anchor":"changeset/2"},{"id":"common_changeset/1","deprecated":false,"title":"common_changeset(object)","anchor":"common_changeset/1"},{"id":"delete/1","deprecated":false,"title":"delete(object)","anchor":"delete/1"},{"id":"do_insert/1","deprecated":false,"title":"do_insert(attrs)","anchor":"do_insert/1"},{"id":"do_update_existing/2","deprecated":false,"title":"do_update_existing(object, attrs)","anchor":"do_update_existing/2"},{"id":"fetch_latest_block/2","deprecated":false,"title":"fetch_latest_block(map1, map2)","anchor":"fetch_latest_block/2"},{"id":"fetch_latest_follow/2","deprecated":false,"title":"fetch_latest_follow(follower_id, followed_id)","anchor":"fetch_latest_follow/2"},{"id":"get_activity_for_object_ap_id/2","deprecated":false,"title":"get_activity_for_object_ap_id(ap_id, verb \\\\ \"Create\")","anchor":"get_activity_for_object_ap_id/2"},{"id":"get_ap_id/1","deprecated":false,"title":"get_ap_id(_)","anchor":"get_ap_id/1"},{"id":"get_cached/1","deprecated":false,"title":"get_cached(id)","anchor":"get_cached/1"},{"id":"get_cached!/1","deprecated":false,"title":"get_cached!(opts)","anchor":"get_cached!/1"},{"id":"get_existing_announce/2","deprecated":false,"title":"get_existing_announce(actor, map)","anchor":"get_existing_announce/2"},{"id":"get_existing_like/2","deprecated":false,"title":"get_existing_like(actor, object_id)","anchor":"get_existing_like/2"},{"id":"get_follow_activity/2","deprecated":false,"title":"get_follow_activity(follow_object, followed)","anchor":"get_follow_activity/2"},{"id":"get_inbox/2","deprecated":false,"title":"get_inbox(all_or_instance_or_actor_url, page \\\\ 1)","anchor":"get_inbox/2"},{"id":"get_outbox_for_actor/2","deprecated":false,"title":"get_outbox_for_actor(ap_id, page \\\\ 1)","anchor":"get_outbox_for_actor/2"},{"id":"get_outbox_for_instance/1","deprecated":false,"title":"get_outbox_for_instance(page \\\\ 1)","anchor":"get_outbox_for_instance/1"},{"id":"get_uncached/1","deprecated":false,"title":"get_uncached(opts)","anchor":"get_uncached/1"},{"id":"hard_delete/1","deprecated":false,"title":"hard_delete(object)","anchor":"hard_delete/1"},{"id":"hashtags/1","deprecated":false,"title":"hashtags(arg1)","anchor":"hashtags/1"},{"id":"invalidate_cache/1","deprecated":false,"title":"invalidate_cache(object)","anchor":"invalidate_cache/1"},{"id":"is_deleted?/1","deprecated":false,"title":"is_deleted?(data)","anchor":"is_deleted?/1"},{"id":"make_tombstone/2","deprecated":false,"title":"make_tombstone(map, deleted \\\\ DateTime.utc_now())","anchor":"make_tombstone/2"},{"id":"maybe_fetch/2","deprecated":false,"title":"maybe_fetch(ap_id, arg2)","anchor":"maybe_fetch/2"},{"id":"maybe_upsert/3","deprecated":false,"title":"maybe_upsert(arg1, existing_object, attrs)","anchor":"maybe_upsert/3"},{"id":"normalise_tos/1","deprecated":false,"title":"normalise_tos(object)","anchor":"normalise_tos/1"},{"id":"normalize/3","deprecated":false,"title":"normalize(object, fetch_remote? \\\\ true, pointer \\\\ nil)","anchor":"normalize/3"},{"id":"normalize_actors/1","deprecated":false,"title":"normalize_actors(params)","anchor":"normalize_actors/1"},{"id":"normalize_params/3","deprecated":false,"title":"normalize_params(params, activity_id \\\\ nil, pointer \\\\ nil)","anchor":"normalize_params/3"},{"id":"object_url/1","deprecated":false,"title":"object_url(id)","anchor":"object_url/1"},{"id":"prepare_data/4","deprecated":false,"title":"prepare_data(data, local \\\\ false, pointer \\\\ nil, associated_activity \\\\ nil)","anchor":"prepare_data/4"},{"id":"query/1","deprecated":false,"title":"query(list)","anchor":"query/1"},{"id":"self_replies_ids/2","deprecated":false,"title":"self_replies_ids(object, limit)","anchor":"self_replies_ids/2"},{"id":"set_cache/1","deprecated":false,"title":"set_cache(object)","anchor":"set_cache/1"},{"id":"swap_object_with_tombstone/1","deprecated":false,"title":"swap_object_with_tombstone(object)","anchor":"swap_object_with_tombstone/1"},{"id":"update_and_set_cache/1","deprecated":false,"title":"update_and_set_cache(changeset)","anchor":"update_and_set_cache/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(object, attrs)","anchor":"update_changeset/2"},{"id":"update_existing/2","deprecated":false,"title":"update_existing(object_id, attrs)","anchor":"update_existing/2"},{"id":"update_state/3","deprecated":false,"title":"update_state(activity, type, state)","anchor":"update_state/3"}],"key":"functions"}]},{"id":"ActivityPub.Pruner","deprecated":false,"group":"Federation","title":"ActivityPub.Pruner","sections":[],"nested_context":"ActivityPub","nested_title":".Pruner","nodeGroups":[{"name":"Functions","nodes":[{"id":"prune_all/1","deprecated":false,"title":"prune_all(cutoff_days \\\\ nil)","anchor":"prune_all/1"},{"id":"prune_deletes/1","deprecated":false,"title":"prune_deletes(cutoff_days)","anchor":"prune_deletes/1"},{"id":"prune_objects/1","deprecated":false,"title":"prune_objects(options \\\\ [prune_orphaned_activities: true, keep_threads: false, keep_non_public: false])","anchor":"prune_objects/1"},{"id":"prune_orphaned_activities/0","deprecated":false,"title":"prune_orphaned_activities()","anchor":"prune_orphaned_activities/0"},{"id":"prune_removes/1","deprecated":false,"title":"prune_removes(cutoff_days)","anchor":"prune_removes/1"},{"id":"prune_stale_follow_requests/1","deprecated":false,"title":"prune_stale_follow_requests(cutoff_days)","anchor":"prune_stale_follow_requests/1"},{"id":"prune_tombstones/1","deprecated":false,"title":"prune_tombstones(cutoff_days)","anchor":"prune_tombstones/1"},{"id":"prune_undos/1","deprecated":false,"title":"prune_undos(cutoff_days)","anchor":"prune_undos/1"},{"id":"remove_embedded_objects/0","deprecated":false,"title":"remove_embedded_objects()","anchor":"remove_embedded_objects/0"}],"key":"functions"}]},{"id":"ActivityPub.Pruner.PruneDatabaseWorker","deprecated":false,"group":"Federation","title":"ActivityPub.Pruner.PruneDatabaseWorker","sections":[],"nested_context":"ActivityPub","nested_title":".Pruner.PruneDatabaseWorker"},{"id":"ActivityPub.Queries","deprecated":false,"group":"Federation","title":"ActivityPub.Queries","sections":[],"nested_context":"ActivityPub","nested_title":".Queries","nodeGroups":[{"name":"Types","nodes":[{"id":"query/0","deprecated":false,"title":"query()","anchor":"t:query/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"activity_by_object_ap_id/2","deprecated":false,"title":"activity_by_object_ap_id(ap_id, verb \\\\ \"Create\")","anchor":"activity_by_object_ap_id/2"},{"id":"by_actor/2","deprecated":false,"title":"by_actor(query \\\\ Object, ap_id)","anchor":"by_actor/2"},{"id":"by_ap_id/2","deprecated":false,"title":"by_ap_id(query \\\\ Object, ap_id)","anchor":"by_ap_id/2"},{"id":"by_id/2","deprecated":false,"title":"by_id(query \\\\ Object, id)","anchor":"by_id/2"},{"id":"by_object_id/2","deprecated":false,"title":"by_object_id(query \\\\ Object, object_id)","anchor":"by_object_id/2"},{"id":"by_object_in_reply_to_id/3","deprecated":false,"title":"by_object_in_reply_to_id(query, in_reply_to_id, opts \\\\ [])","anchor":"by_object_in_reply_to_id/3"},{"id":"by_type/2","deprecated":false,"title":"by_type(query \\\\ Object, activity_type)","anchor":"by_type/2"},{"id":"exclude_type/2","deprecated":false,"title":"exclude_type(query \\\\ Object, type)","anchor":"exclude_type/2"},{"id":"find_by_object_ap_id/2","deprecated":false,"title":"find_by_object_ap_id(activities, object_ap_id)","anchor":"find_by_object_ap_id/2"},{"id":"last_follow/2","deprecated":false,"title":"last_follow(query, followed_id)","anchor":"last_follow/2"},{"id":"ordered/1","deprecated":false,"title":"ordered(query)","anchor":"ordered/1"},{"id":"replies/2","deprecated":false,"title":"replies(object, opts \\\\ [])","anchor":"replies/2"},{"id":"self_replies/1","deprecated":false,"title":"self_replies(object)","anchor":"self_replies/1"},{"id":"with_joined_activity/3","deprecated":false,"title":"with_joined_activity(query, activity_type \\\\ \"Create\", join_type \\\\ :left)","anchor":"with_joined_activity/3"},{"id":"with_joined_object/2","deprecated":false,"title":"with_joined_object(query, join_type \\\\ :inner)","anchor":"with_joined_object/2"},{"id":"with_preloaded_object/2","deprecated":false,"title":"with_preloaded_object(query, join_type \\\\ :left)","anchor":"with_preloaded_object/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Containment","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Containment","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Containment","nodeGroups":[{"name":"Functions","nodes":[{"id":"contain_child/1","deprecated":false,"title":"contain_child(arg1)","anchor":"contain_child/1"},{"id":"contain_origin/2","deprecated":false,"title":"contain_origin(id, params)","anchor":"contain_origin/2"},{"id":"contain_origin_from_id/2","deprecated":false,"title":"contain_origin_from_id(id, params)","anchor":"contain_origin_from_id/2"},{"id":"contain_uri/2","deprecated":false,"title":"contain_uri(id, data)","anchor":"contain_uri/2"},{"id":"get_object/1","deprecated":false,"title":"get_object(arg1)","anchor":"get_object/1"},{"id":"restrict_unauthenticated_access?/1","deprecated":false,"title":"restrict_unauthenticated_access?(object)","anchor":"restrict_unauthenticated_access?/1"},{"id":"restrict_unauthenticated_access?/2","deprecated":false,"title":"restrict_unauthenticated_access?(resource, kind)","anchor":"restrict_unauthenticated_access?/2"},{"id":"visible_for_user?/2","deprecated":false,"title":"visible_for_user?(object, actor)","anchor":"visible_for_user?/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Encryption","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Encryption","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Encryption","nodeGroups":[{"name":"Functions","nodes":[{"id":"decrypt/2","deprecated":false,"title":"decrypt(encrypted_data, actor)","anchor":"decrypt/2"},{"id":"encrypt/2","deprecated":false,"title":"encrypt(data, ap_id)","anchor":"encrypt/2"}],"key":"functions"}]},{"id":"ActivityPub.Safety.HTTP.Signatures","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.HTTP.Signatures","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.HTTP.Signatures","nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_fresh_public_key/1","deprecated":false,"title":"fetch_fresh_public_key(conn)","anchor":"fetch_fresh_public_key/1"},{"id":"fetch_public_key/1","deprecated":false,"title":"fetch_public_key(conn)","anchor":"fetch_public_key/1"},{"id":"get_public_key/1","deprecated":false,"title":"get_public_key(conn)","anchor":"get_public_key/1"}],"key":"functions"}]},{"id":"ActivityPub.Safety.Keys","deprecated":false,"group":"Federation","title":"ActivityPub.Safety.Keys","sections":[],"nested_context":"ActivityPub","nested_title":".Safety.Keys","nodeGroups":[{"name":"Functions","nodes":[{"id":"add_public_key/2","deprecated":false,"title":"add_public_key(actor, generate_if_missing \\\\ true)","anchor":"add_public_key/2"},{"id":"cast_uri/1","deprecated":false,"title":"cast_uri(object)","anchor":"cast_uri/1"},{"id":"ensure_keys_present/1","deprecated":false,"title":"ensure_keys_present(object)","anchor":"ensure_keys_present/1"},{"id":"fetch_public_key_for_ap_id/1","deprecated":false,"title":"fetch_public_key_for_ap_id(ap_id)","anchor":"fetch_public_key_for_ap_id/1"},{"id":"generate_rsa_pem/0","deprecated":false,"title":"generate_rsa_pem()","anchor":"generate_rsa_pem/0"},{"id":"get_public_key_for_ap_id/1","deprecated":false,"title":"get_public_key_for_ap_id(ap_id)","anchor":"get_public_key_for_ap_id/1"},{"id":"http_host/1","deprecated":false,"title":"http_host(map)","anchor":"http_host/1"},{"id":"key_id_to_actor_id/1","deprecated":false,"title":"key_id_to_actor_id(key_id)","anchor":"key_id_to_actor_id/1"},{"id":"keypair_from_pem/1","deprecated":false,"title":"keypair_from_pem(pem)","anchor":"keypair_from_pem/1"},{"id":"maybe_add_fetch_signature_headers/3","deprecated":false,"title":"maybe_add_fetch_signature_headers(headers, id, date \\\\ nil)","anchor":"maybe_add_fetch_signature_headers/3"},{"id":"public_key_decode/1","deprecated":false,"title":"public_key_decode(public_key_pem)","anchor":"public_key_decode/1"},{"id":"public_key_from_data/1","deprecated":false,"title":"public_key_from_data(actor)","anchor":"public_key_from_data/1"},{"id":"sign/2","deprecated":false,"title":"sign(actor, headers)","anchor":"sign/2"}],"key":"functions"}]},{"id":"ActivityPub.Utils","deprecated":false,"group":"Federation","title":"ActivityPub.Utils","sections":[],"nested_context":"ActivityPub","nested_title":".Utils","nodeGroups":[{"name":"Functions","nodes":[{"id":"activitypub_object_headers/0","deprecated":false,"title":"activitypub_object_headers()","anchor":"activitypub_object_headers/0"},{"id":"adapter_fallback/0","deprecated":false,"title":"adapter_fallback()","anchor":"adapter_fallback/0"},{"id":"ap_base_url/0","deprecated":false,"title":"ap_base_url()","anchor":"ap_base_url/0"},{"id":"ap_id/1","deprecated":false,"title":"ap_id(map)","anchor":"ap_id/1"},{"id":"as_local_public/0","deprecated":false,"title":"as_local_public()","anchor":"as_local_public/0"},{"id":"cache_clear/0","deprecated":false,"title":"cache_clear()","anchor":"cache_clear/0"},{"id":"cachex_fetch/4","deprecated":false,"title":"cachex_fetch(cache, key, fallback, options \\\\ [])","anchor":"cachex_fetch/4"},{"id":"error_json/3","deprecated":false,"title":"error_json(conn, error, status \\\\ 500)","anchor":"error_json/3"},{"id":"format_date/1","deprecated":false,"title":"format_date(date \\\\ NaiveDateTime.utc_now(Calendar.ISO))","anchor":"format_date/1"},{"id":"generate_id/1","deprecated":false,"title":"generate_id(type)","anchor":"generate_id/1"},{"id":"generate_object_id/0","deprecated":false,"title":"generate_object_id()","anchor":"generate_object_id/0"},{"id":"get_with_cache/4","deprecated":false,"title":"get_with_cache(get_fun, cache_bucket, key, identifier)","anchor":"get_with_cache/4"},{"id":"has_as_public?/1","deprecated":false,"title":"has_as_public?(tos)","anchor":"has_as_public?/1"},{"id":"is_uid?/1","deprecated":false,"title":"is_uid?(input)","anchor":"is_uid?/1"},{"id":"is_ulid?/1","deprecated":false,"title":"is_ulid?(str)","anchor":"is_ulid?/1"},{"id":"is_uuid?/1","deprecated":false,"title":"is_uuid?(str)","anchor":"is_uuid?/1"},{"id":"json_with_cache/6","deprecated":false,"title":"json_with_cache(conn \\\\ nil, get_fun, cache_bucket, id, ret_fn \\\\ &return_json/4, opts \\\\ [])","anchor":"json_with_cache/6"},{"id":"label_in_collection?/2","deprecated":false,"title":"label_in_collection?(label, collection)","anchor":"label_in_collection?/2"},{"id":"make_date/0","deprecated":false,"title":"make_date()","anchor":"make_date/0"},{"id":"make_json_ld_header/1","deprecated":false,"title":"make_json_ld_header(type \\\\ :object)","anchor":"make_json_ld_header/1"},{"id":"maybe_put/3","deprecated":false,"title":"maybe_put(map, key, value)","anchor":"maybe_put/3"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"},{"id":"maybe_to_string/1","deprecated":false,"title":"maybe_to_string(atom)","anchor":"maybe_to_string/1"},{"id":"ok_unwrap/2","deprecated":false,"title":"ok_unwrap(val, fallback \\\\ nil)","anchor":"ok_unwrap/2"},{"id":"public?/1","deprecated":false,"title":"public?(params)","anchor":"public?/1"},{"id":"public?/2","deprecated":false,"title":"public?(activity_data, object_data)","anchor":"public?/2"},{"id":"put_if_present/4","deprecated":false,"title":"put_if_present(map, key, value, value_function \\\\ &{:ok, &1})","anchor":"put_if_present/4"},{"id":"repo/0","deprecated":false,"title":"repo()","anchor":"repo/0"},{"id":"request_ip/1","deprecated":false,"title":"request_ip(remote_ip)","anchor":"request_ip/1"},{"id":"return_json/4","deprecated":false,"title":"return_json(conn, meta, json, opts \\\\ [])","anchor":"return_json/4"},{"id":"safe_put_in/3","deprecated":false,"title":"safe_put_in(data, keys, value)","anchor":"safe_put_in/3"},{"id":"service_actor/0","deprecated":false,"title":"service_actor()","anchor":"service_actor/0"},{"id":"service_actor!/0","deprecated":false,"title":"service_actor!()","anchor":"service_actor!/0"},{"id":"set_repo/1","deprecated":false,"title":"set_repo(repo)","anchor":"set_repo/1"},{"id":"single_ap_id/1","deprecated":false,"title":"single_ap_id(ap_id)","anchor":"single_ap_id/1"},{"id":"single_ap_id_or_object/1","deprecated":false,"title":"single_ap_id_or_object(ap_id)","anchor":"single_ap_id_or_object/1"},{"id":"stringify_keys/2","deprecated":false,"title":"stringify_keys(map, recursive \\\\ false)","anchor":"stringify_keys/2"},{"id":"uid/1","deprecated":false,"title":"uid(input)","anchor":"uid/1"}],"key":"functions"}]},{"id":"ActivityPub.Web","deprecated":false,"group":"Federation","title":"ActivityPub.Web","sections":[],"nested_context":"ActivityPub","nested_title":".Web","nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","deprecated":false,"title":"__using__(which)","anchor":"__using__/1"},{"id":"base_url/0","deprecated":false,"title":"base_url()","anchor":"base_url/0"},{"id":"channel/0","deprecated":false,"title":"channel()","anchor":"channel/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"rate_limit_reached/2","deprecated":false,"title":"rate_limit_reached(conn, opts)","anchor":"rate_limit_reached/2"},{"id":"router/0","deprecated":false,"title":"router()","anchor":"router/0"},{"id":"view/0","deprecated":false,"title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"ActivityPub.Web.ActivityPubController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ActivityPubController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ActivityPubController","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor/2","deprecated":false,"title":"actor(conn, map)","anchor":"actor/2"},{"id":"ap_route_helper/1","deprecated":false,"title":"ap_route_helper(uuid)","anchor":"ap_route_helper/1"},{"id":"followers/2","deprecated":false,"title":"followers(conn, params)","anchor":"followers/2"},{"id":"following/2","deprecated":false,"title":"following(conn, params)","anchor":"following/2"},{"id":"json_object_with_cache/3","deprecated":false,"title":"json_object_with_cache(conn \\\\ nil, id, opts \\\\ [])","anchor":"json_object_with_cache/3"},{"id":"maybe_inbox/2","deprecated":false,"title":"maybe_inbox(conn, params)","anchor":"maybe_inbox/2"},{"id":"object/2","deprecated":false,"title":"object(conn, map)","anchor":"object/2"},{"id":"outbox/2","deprecated":false,"title":"outbox(conn, params)","anchor":"outbox/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ActorView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ActorView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ActorView","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor_json/1","deprecated":false,"title":"actor_json(username)","anchor":"actor_json/1"},{"id":"collection/4","deprecated":false,"title":"collection(collection, iri, page, total \\\\ nil)","anchor":"collection/4"},{"id":"render/2","deprecated":false,"title":"render(binary, map)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Endpoint","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Endpoint","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Endpoint","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":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/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"}],"key":"functions"}]},{"id":"ActivityPub.Web.ErrorHelpers","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ErrorHelpers","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ErrorHelpers","nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(form, field)","anchor":"error_tag/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ErrorView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ErrorView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ErrorView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/2","deprecated":false,"title":"render(binary, 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":"ActivityPub.Web.IncomingActivityPubController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.IncomingActivityPubController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".IncomingActivityPubController","nodeGroups":[{"name":"Functions","nodes":[{"id":"inbox/2","deprecated":false,"title":"inbox(conn, params)","anchor":"inbox/2"},{"id":"outbox_info/2","deprecated":false,"title":"outbox_info(conn, params)","anchor":"outbox_info/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.LayoutView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.LayoutView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".LayoutView","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/2","deprecated":false,"title":"render(binary, assigns)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.ObjectView","deprecated":false,"group":"Federation","title":"ActivityPub.Web.ObjectView","sections":[],"nested_context":"ActivityPub.Web","nested_title":".ObjectView","nodeGroups":[{"name":"Functions","nodes":[{"id":"collection/4","deprecated":false,"title":"collection(collection, iri, page, total \\\\ nil)","anchor":"collection/4"},{"id":"render/2","deprecated":false,"title":"render(binary, params)","anchor":"render/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.DigestPlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.DigestPlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.DigestPlug","nodeGroups":[{"name":"Functions","nodes":[{"id":"read_body/2","deprecated":false,"title":"read_body(conn, opts)","anchor":"read_body/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.EnsureHTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.EnsureHTTPSignaturePlug","nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, _)","anchor":"call/2"},{"id":"ignore/1","deprecated":false,"title":"ignore(conn)","anchor":"ignore/1"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"},{"id":"maybe_reject!/2","deprecated":false,"title":"maybe_reject!(conn, arg2)","anchor":"maybe_reject!/2"},{"id":"unauthorized/1","deprecated":false,"title":"unauthorized(conn)","anchor":"unauthorized/1"}],"key":"functions"}]},{"id":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.FetchHTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.FetchHTTPSignaturePlug","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":"ActivityPub.Web.Plugs.HTTPSignaturePlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.HTTPSignaturePlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.HTTPSignaturePlug","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":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Plugs.MappedSignatureToIdentityPlug","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Plugs.MappedSignatureToIdentityPlug","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":"ActivityPub.Web.RedirectController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.RedirectController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".RedirectController","nodeGroups":[{"name":"Functions","nodes":[{"id":"actor/2","deprecated":false,"title":"actor(conn, map)","anchor":"actor/2"},{"id":"object/2","deprecated":false,"title":"object(conn, map)","anchor":"object/2"},{"id":"remote_interaction/2","deprecated":false,"title":"remote_interaction(conn, params)","anchor":"remote_interaction/2"}],"key":"functions"}]},{"id":"ActivityPub.Web.Router","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Router","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Router"},{"id":"ActivityPub.Web.Telemetry","deprecated":false,"group":"Federation","title":"ActivityPub.Web.Telemetry","sections":[],"nested_context":"ActivityPub.Web","nested_title":".Telemetry","nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"metrics/0","deprecated":false,"title":"metrics()","anchor":"metrics/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(arg)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"ActivityPub.Web.UserSocket","deprecated":false,"group":"Federation","title":"ActivityPub.Web.UserSocket","sections":[],"nested_context":"ActivityPub.Web","nested_title":".UserSocket"},{"id":"ActivityPub.Web.WebFingerController","deprecated":false,"group":"Federation","title":"ActivityPub.Web.WebFingerController","sections":[],"nested_context":"ActivityPub.Web","nested_title":".WebFingerController","nodeGroups":[{"name":"Functions","nodes":[{"id":"webfinger/2","deprecated":false,"title":"webfinger(conn, map)","anchor":"webfinger/2"}],"key":"functions"}]},{"id":"Iconify","deprecated":false,"group":"Icons","title":"Iconify","sections":[{"id":"Installation","anchor":"module-installation"},{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_icon_to_css/2","deprecated":false,"title":"add_icon_to_css(icon_css_name, svg_code)","anchor":"add_icon_to_css/2"},{"id":"complex?/1","deprecated":false,"title":"complex?(icon)","anchor":"complex?/1"},{"id":"dev_env?/0","deprecated":false,"title":"dev_env?()","anchor":"dev_env?/0"},{"id":"emoji?/1","deprecated":false,"title":"emoji?(icon)","anchor":"emoji?/1"},{"id":"fallback_icon/0","deprecated":false,"title":"fallback_icon()","anchor":"fallback_icon/0"},{"id":"generate_css_from_components/0","deprecated":false,"title":"generate_css_from_components()","anchor":"generate_css_from_components/0"},{"id":"generate_css_from_static_files/0","deprecated":false,"title":"generate_css_from_static_files()","anchor":"generate_css_from_static_files/0"},{"id":"generate_sets_from_components/0","deprecated":false,"title":"generate_sets_from_components()","anchor":"generate_sets_from_components/0"},{"id":"iconify/1","deprecated":false,"title":"iconify(assigns)","anchor":"iconify/1"},{"id":"list_all_existing/0","deprecated":false,"title":"list_all_existing()","anchor":"list_all_existing/0"},{"id":"list_components/0","deprecated":false,"title":"list_components()","anchor":"list_components/0"},{"id":"list_icons_in_css/0","deprecated":false,"title":"list_icons_in_css()","anchor":"list_icons_in_css/0"},{"id":"list_icons_in_images/0","deprecated":false,"title":"list_icons_in_images()","anchor":"list_icons_in_images/0"},{"id":"manual/2","deprecated":false,"title":"manual(icon, opts \\\\ nil)","anchor":"manual/2"},{"id":"maybe_phx_live_set_dynamic/3","deprecated":false,"title":"maybe_phx_live_set_dynamic(socket, icon, type \\\\ \"svg\")","anchor":"maybe_phx_live_set_dynamic/3"},{"id":"maybe_set_favicon/2","deprecated":false,"title":"maybe_set_favicon(socket, icon)","anchor":"maybe_set_favicon/2"},{"id":"path/0","deprecated":false,"title":"path()","anchor":"path/0"},{"id":"prepare/2","deprecated":false,"title":"prepare(assigns, opts \\\\ [])","anchor":"prepare/2"},{"id":"prepare_entire_icon_family/2","deprecated":false,"title":"prepare_entire_icon_family(family_name, mode \\\\ nil)","anchor":"prepare_entire_icon_family/2"},{"id":"static_path/0","deprecated":false,"title":"static_path()","anchor":"static_path/0"},{"id":"static_url/0","deprecated":false,"title":"static_url()","anchor":"static_url/0"},{"id":"using_svg_inject?/0","deprecated":false,"title":"using_svg_inject?()","anchor":"using_svg_inject?/0"}],"key":"functions"}]},{"id":"Iconify.Icon","deprecated":false,"group":"Icons","title":"Iconify.Icon","sections":[{"id":"Specifying what icon to use","anchor":"module-specifying-what-icon-to-use"},{"id":"Extra Properties","anchor":"module-extra-properties"},{"id":"Examples","anchor":"module-examples"},{"id":"Properties","anchor":"module-properties"}],"nested_context":"Iconify","nested_title":".Icon","nodeGroups":[{"name":"Functions","nodes":[{"id":"class_to_string/1","deprecated":false,"title":"class_to_string(class)","anchor":"class_to_string/1"},{"id":"expand/3","deprecated":false,"title":"expand(attributes, content, meta)","anchor":"expand/3"},{"id":"icon_name/1","deprecated":false,"title":"icon_name(icon)","anchor":"icon_name/1"}],"key":"functions"}]},{"id":"Iconify.MaterialSymbols.CalendarMonth","deprecated":false,"group":"Icons","title":"Iconify.MaterialSymbols.CalendarMonth","sections":[],"nested_context":"Iconify","nested_title":".MaterialSymbols.CalendarMonth","nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"AbsintheClient","deprecated":false,"group":"Utilities","title":"AbsintheClient","sections":[{"id":"Example","anchor":"module-example"},{"id":"Differences with the GraphQL Specification","anchor":"module-differences-with-the-graphql-specification"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"absinthe_pipeline/2","deprecated":false,"title":"absinthe_pipeline(schema, t)","anchor":"c:absinthe_pipeline/2"},{"id":"cast_param/3","deprecated":false,"title":"cast_param(value, target_type, schema)","anchor":"c:cast_param/3"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"default_pipeline/2","deprecated":false,"title":"default_pipeline(schema, options)","anchor":"default_pipeline/2"},{"id":"variables/1","deprecated":false,"title":"variables(conn_or_socket)","anchor":"variables/1"}],"key":"functions"}]},{"id":"AbsintheClient.Helpers","deprecated":false,"group":"Utilities","title":"AbsintheClient.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"assign/3","deprecated":false,"title":"assign(conn, key, val)","anchor":"assign/3"},{"id":"error/2","deprecated":false,"title":"error(conn, error)","anchor":"error/2"},{"id":"maybe_to_atom/1","deprecated":false,"title":"maybe_to_atom(str)","anchor":"maybe_to_atom/1"}],"key":"functions"}]},{"id":"ConsoleHelpers","deprecated":false,"group":"Utilities","title":"ConsoleHelpers","sections":[]},{"id":"DaisyTheme","deprecated":false,"group":"Utilities","title":"DaisyTheme","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"adjust/5","deprecated":false,"title":"adjust(theme, name, variable, field, percent \\\\ 0.8)","anchor":"adjust/5"},{"id":"clamp/3","deprecated":false,"title":"clamp(value, min, max)","anchor":"clamp/3"},{"id":"darken/2","deprecated":false,"title":"darken(hex, amount)","anchor":"darken/2"},{"id":"darker/5","deprecated":false,"title":"darker(theme, name, variable, field, percent \\\\ 0.2)","anchor":"darker/5"},{"id":"default_theme/0","deprecated":false,"title":"default_theme()","anchor":"default_theme/0"},{"id":"generate/1","deprecated":false,"title":"generate(config \\\\ %{})","anchor":"generate/1"},{"id":"is_dark?/1","deprecated":false,"title":"is_dark?(value)","anchor":"is_dark?/1"},{"id":"keys/0","deprecated":false,"title":"keys()","anchor":"keys/0"},{"id":"lighten/2","deprecated":false,"title":"lighten(hex, amount)","anchor":"lighten/2"},{"id":"style_attr/1","deprecated":false,"title":"style_attr(config \\\\ %{})","anchor":"style_attr/1"},{"id":"theme/1","deprecated":false,"title":"theme(config)","anchor":"theme/1"}],"key":"functions"}]},{"id":"DummyAdapter","deprecated":false,"group":"Utilities","title":"DummyAdapter","sections":[]},{"id":"Entrepot","deprecated":false,"group":"Utilities","title":"Entrepot","sections":[{"id":"Concepts","anchor":"module-concepts"},{"id":"Built-in Integrations","anchor":"module-built-in-integrations"},{"id":"Storages","anchor":"module-storages"},{"id":"uploads","anchor":"module-uploads"},{"id":"EntrepôtEcto","anchor":"module-entrep%C3%B4tecto"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_metadata/2","deprecated":false,"title":"add_metadata(locator, data)","anchor":"add_metadata/2"},{"id":"add_metadata/3","deprecated":false,"title":"add_metadata(locator, key, val)","anchor":"add_metadata/3"},{"id":"copy/3","deprecated":false,"title":"copy(locator, dest_storage, opts \\\\ [])","anchor":"copy/3"},{"id":"storage!/1","deprecated":false,"title":"storage!(locator)","anchor":"storage!/1"}],"key":"functions"}]},{"id":"Entrepot.Ecto","deprecated":false,"group":"Utilities","title":"Entrepot.Ecto","sections":[{"id":"Entrepot.Ecto.Type","anchor":"module-entrepot-ecto-type"},{"id":"Entrepot.Ecto.upload","anchor":"module-entrepot-ecto-upload"},{"id":"Upload cleanup","anchor":"module-upload-cleanup"},{"id":"Testing","anchor":"module-testing"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"upload/4","deprecated":false,"title":"upload(changeset, params, permitted, fun)","anchor":"upload/4"},{"id":"upload/5","deprecated":false,"title":"upload(changeset, params, permitted, module, func_name)","anchor":"upload/5"}],"key":"functions"}]},{"id":"Entrepot.Ecto.Type","deprecated":false,"group":"Utilities","title":"Entrepot.Ecto.Type","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(value)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(locator)","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(serialized_data)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Entrepot.Errors.InvalidLocator","deprecated":false,"group":"Utilities","title":"Entrepot.Errors.InvalidLocator","sections":[]},{"id":"Entrepot.Errors.InvalidStorage","deprecated":false,"group":"Utilities","title":"Entrepot.Errors.InvalidStorage","sections":[]},{"id":"Entrepot.Locator","deprecated":false,"group":"Utilities","title":"Entrepot.Locator","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"},{"id":"new!/1","deprecated":false,"title":"new!(attrs)","anchor":"new!/1"}],"key":"functions"}]},{"id":"Entrepot.Storage","deprecated":false,"group":"Utilities","title":"Entrepot.Storage","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"locator_id/0","deprecated":false,"title":"locator_id()","anchor":"t:locator_id/0"},{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"delete/1","deprecated":false,"title":"delete(locator_id)","anchor":"c:delete/1"},{"id":"delete/2","deprecated":false,"title":"delete(locator_id, list)","anchor":"c:delete/2"},{"id":"path/1","deprecated":false,"title":"path(locator_id)","anchor":"c:path/1"},{"id":"path/2","deprecated":false,"title":"path(locator_id, list)","anchor":"c:path/2"},{"id":"put/1","deprecated":false,"title":"put(t)","anchor":"c:put/1"},{"id":"put/2","deprecated":false,"title":"put(t, list)","anchor":"c:put/2"},{"id":"read/1","deprecated":false,"title":"read(locator_id)","anchor":"c:read/1"},{"id":"read/2","deprecated":false,"title":"read(locator_id, list)","anchor":"c:read/2"},{"id":"stream/1","deprecated":false,"title":"stream(locator_id)","anchor":"c:stream/1"},{"id":"stream/2","deprecated":false,"title":"stream(locator_id, list)","anchor":"c:stream/2"},{"id":"url/1","deprecated":false,"title":"url(locator_id)","anchor":"c:url/1"},{"id":"url/2","deprecated":false,"title":"url(locator_id, list)","anchor":"c:url/2"}],"key":"callbacks"}]},{"id":"Entrepot.Storages.Disk","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.Disk","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Storages.RAM","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.RAM","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Storages.S3","deprecated":false,"group":"Utilities","title":"Entrepot.Storages.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clone/3","deprecated":false,"title":"clone(source_id, dest_path, opts \\\\ [])","anchor":"clone/3"}],"key":"functions"}]},{"id":"Entrepot.Upload","deprecated":false,"group":"Utilities","title":"Entrepot.Upload","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"contents/1","deprecated":false,"title":"contents(upload)","anchor":"contents/1"},{"id":"name/1","deprecated":false,"title":"name(upload)","anchor":"name/1"},{"id":"path/1","deprecated":false,"title":"path(upload)","anchor":"path/1"}],"key":"functions"}]},{"id":"Entrepot.Uploader","deprecated":false,"group":"Utilities","title":"Entrepot.Uploader","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"option/0","deprecated":false,"title":"option()","anchor":"t:option/0"},{"id":"storage/0","deprecated":false,"title":"storage()","anchor":"t:storage/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"build_metadata/3","deprecated":false,"title":"build_metadata(t, storage, list)","anchor":"c:build_metadata/3"},{"id":"build_options/3","deprecated":false,"title":"build_options(any, storage, list)","anchor":"c:build_options/3"},{"id":"store/3","deprecated":false,"title":"store(any, storage, list)","anchor":"c:store/3"}],"key":"callbacks"}]},{"id":"Import2Alias","deprecated":false,"group":"Utilities","title":"Import2Alias","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import2alias/2","deprecated":false,"title":"import2alias(alias, entries)","anchor":"import2alias/2"}],"key":"functions"}]},{"id":"Import2Alias.CallerTracer","deprecated":false,"group":"Utilities","title":"Import2Alias.CallerTracer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"trace/2","deprecated":false,"title":"trace(arg1, env)","anchor":"trace/2"}],"key":"functions"}]},{"id":"Import2Alias.Server","deprecated":false,"group":"Utilities","title":"Import2Alias.Server","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"entries/0","deprecated":false,"title":"entries()","anchor":"entries/0"},{"id":"record/6","deprecated":false,"title":"record(file, line, column, module, name, arity)","anchor":"record/6"},{"id":"start_link/1","deprecated":false,"title":"start_link(module)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Nebulex.DiskAdapter","deprecated":false,"group":"Utilities","title":"Nebulex.DiskAdapter","sections":[]},{"id":"Nebulex.DiskAdapter.DiskCacheHelper","deprecated":false,"group":"Utilities","title":"Nebulex.DiskAdapter.DiskCacheHelper","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cache_path/3","deprecated":false,"title":"cache_path(key, adapter_meta, opts)","anchor":"cache_path/3"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"disk_clear/2","deprecated":false,"title":"disk_clear(cache_module \\\\ nil, opts \\\\ [])","anchor":"disk_clear/2"},{"id":"disk_delete/3","deprecated":false,"title":"disk_delete(adapter_meta, key, opts)","anchor":"disk_delete/3"},{"id":"disk_get/4","deprecated":false,"title":"disk_get(adapter_meta, key, fun, opts)","anchor":"disk_get/4"},{"id":"disk_list/2","deprecated":false,"title":"disk_list(cache_module \\\\ nil, opts \\\\ [])","anchor":"disk_list/2"},{"id":"disk_put/4","deprecated":false,"title":"disk_put(adapter_meta, key, data, opts)","anchor":"disk_put/4"},{"id":"start_link/1","deprecated":false,"title":"start_link(options \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Paginator","deprecated":false,"group":"Utilities","title":"Paginator","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Options","anchor":"module-options"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"paginate/3","deprecated":false,"title":"paginate(queryable, opts, repo_opts)","anchor":"c:paginate/3"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"cursor_for_record/3","deprecated":false,"title":"cursor_for_record(record, cursor_fields, fetch_cursor_value_fun \\\\ &Paginator.default_fetch_cursor_value/2)","anchor":"cursor_for_record/3"},{"id":"default_fetch_cursor_value/2","deprecated":false,"title":"default_fetch_cursor_value(schema, field)","anchor":"default_fetch_cursor_value/2"},{"id":"paginated_query/2","deprecated":false,"title":"paginated_query(queryable, opts)","anchor":"paginated_query/2"}],"key":"functions"}]},{"id":"Paginator.Page","deprecated":false,"group":"Utilities","title":"Paginator.Page","sections":[{"id":"Fields","anchor":"module-fields"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Paginator.PageInfo","deprecated":false,"group":"Utilities","title":"Paginator.PageInfo","sections":[{"id":"Fields","anchor":"module-fields"}],"nodeGroups":[{"name":"Types","nodes":[{"id":"opaque_cursor/0","deprecated":false,"title":"opaque_cursor()","anchor":"t:opaque_cursor/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"UserAuthLiveMount","deprecated":false,"group":"Utilities","title":"UserAuthLiveMount","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","deprecated":false,"title":"on_mount(type, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"GraphQL Introduction","anchor":"graphql-introduction"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Bonfire Networks","headers":[{"id":"Main features","anchor":"main-features"},{"id":"How to get the most out of the documentation","anchor":"how-to-get-the-most-out-of-the-documentation"},{"id":"Prerequisite knowledge","anchor":"prerequisite-knowledge"},{"id":"Join our community","anchor":"join-our-community"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"hacking","group":"Getting Started","title":"Development setup","headers":[{"id":"Status: beta - have fun and provide feedback 🙏","anchor":"status-beta-have-fun-and-provide-feedback"},{"id":"System Requirements","anchor":"system-requirements"},{"id":"Download","anchor":"download"},{"id":"Configure","anchor":"configure"},{"id":"Light a fire!","anchor":"light-a-fire"},{"id":"Onboarding","anchor":"onboarding"},{"id":"The Bonfire environment","anchor":"the-bonfire-environment"},{"id":"Documentation","anchor":"documentation"},{"id":"Additional information","anchor":"additional-information"},{"id":"Troubleshooting","anchor":"troubleshooting"}]},{"id":"deploy","group":"Getting Started","title":"Hosting guide","headers":[{"id":"Security Warning","anchor":"security-warning"},{"id":"Step 1 - Decide how you want to deploy and manage the app","anchor":"step-1-decide-how-you-want-to-deploy-and-manage-the-app"},{"id":"Preparing the config (in .env)","anchor":"preparing-the-config-in-env"},{"id":"Running the app","anchor":"running-the-app"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Admin tools","anchor":"admin-tools"},{"id":"Troubleshooting","anchor":"troubleshooting"}]},{"id":"changelog","group":"Getting Started","title":"Bonfire Changelog","headers":[{"id":"[0.3.5-beta (2022-09-23)]","anchor":"0-3-5-beta-2022-09-23"},{"id":"[0.3.4-beta.8 (2022-08-26)]","anchor":"0-3-4-beta-8-2022-08-26"},{"id":"[0.3.4-beta.6 (2022-08-19)]","anchor":"0-3-4-beta-6-2022-08-19"},{"id":"[0.3.4 (2022-08-09)]","anchor":"0-3-4-2022-08-09"},{"id":"[0.3.3 (2022-08-02)]","anchor":"0-3-3-2022-08-02"},{"id":"[0.3.2 (2022-07-30)]","anchor":"0-3-2-2022-07-30"},{"id":"0.3.1-beta.9 (2022-07-22)","anchor":"0-3-1-beta-9-2022-07-22"},{"id":"0.3.1-beta (2022-07-19)","anchor":"0-3-1-beta-2022-07-19"}]},{"id":"add-a-new-widget","group":"Building on Bonfire","title":"Add a new widget","headers":[{"id":"Let’s code!","anchor":"let-s-code"},{"id":"Adding Settings","anchor":"adding-settings"},{"id":"Next Steps","anchor":"next-steps"}]},{"id":"add-a-page-to-the-sidebar","group":"Building on Bonfire","title":"Bonfire Navigation Sidebar","headers":[{"id":"Overview","anchor":"overview"},{"id":"Key Concepts","anchor":"key-concepts"},{"id":"Creating a New Navigation Menu","anchor":"creating-a-new-navigation-menu"},{"id":"Using the Default Navigation Menu","anchor":"using-the-default-navigation-menu"},{"id":"Overriding Default Navigation with a Custom Menu","anchor":"overriding-default-navigation-with-a-custom-menu"}]},{"id":"add-an-extension-settings","group":"Building on Bonfire","title":"Add a new extension settings","headers":[]},{"id":"create-a-new-extension","group":"Building on Bonfire","title":"Create a new extension","headers":[{"id":"Create your Bonfire extension","anchor":"create-your-bonfire-extension"}]},{"id":"create-a-new-page","group":"Building on Bonfire","title":"Create a new page","headers":[]},{"id":"edit-an-existing-extension","group":"Building on Bonfire","title":"Make changes to an extension","headers":[{"id":"Fork the extension","anchor":"fork-the-extension"},{"id":"Enable the extension","anchor":"enable-the-extension"},{"id":"Make and test your changes","anchor":"make-and-test-your-changes"},{"id":"Push changes","anchor":"push-changes"},{"id":"Great works 🎉🎉🎉","anchor":"great-works"}]},{"id":"extensions-overview","group":"Building on Bonfire","title":"What is a Bonfire extension","headers":[{"id":"Using extensions","anchor":"using-extensions"},{"id":"Extension helpers","anchor":"extension-helpers"}]},{"id":"project-structure","group":"Building on Bonfire","title":"Project structure","headers":[]},{"id":"routing","group":"Building on Bonfire","title":"Routing","headers":[{"id":"Add a new route","anchor":"add-a-new-route"}]},{"id":"what-is-flavour","group":"Building on Bonfire","title":"What is a Bonfire flavour?","headers":[]},{"id":"working-with-flavour","group":"Building on Bonfire","title":"Working with flavour","headers":[]},{"id":"architecture","group":"Concepts","title":"Bonfire Architecture","headers":[{"id":"Hacking","anchor":"hacking"},{"id":"Design Decisions","anchor":"design-decisions"},{"id":"Stack","anchor":"stack"},{"id":"The Bonfire Environment","anchor":"the-bonfire-environment"},{"id":"Code Structure","anchor":"code-structure"},{"id":"Naming","anchor":"naming"},{"id":"Federation libraries","anchor":"federation-libraries"}]},{"id":"bonfire-flavoured-elixir","group":"Concepts","title":"Bonfire-flavoured Elixir","headers":[{"id":"Arrows","anchor":"arrows"},{"id":"Untangle","anchor":"untangle"},{"id":"Error handling","anchor":"error-handling"}]},{"id":"design","group":"Concepts","title":"Design Guidelines","headers":[]},{"id":"just","group":"Concepts","title":"Just commands","headers":[{"id":"General Setup Related Commands","anchor":"general-setup-related-commands"}]},{"id":"Needle","group":"Concepts","title":"Needles and Pointers: Universal foreign keys, virtual schemas, and shared data fields for Ecto","headers":[{"id":"Intro","anchor":"intro"},{"id":"What is Needle?","anchor":"what-is-needle"},{"id":"Identifying objects - the UID type","anchor":"identifying-objects-the-uid-type"},{"id":"It's just a table","anchor":"it-s-just-a-table"},{"id":"Installation","anchor":"installation"},{"id":"Declaring Object Types","anchor":"declaring-object-types"},{"id":"Adding re-usable fields","anchor":"adding-re-usable-fields"},{"id":"Writing Migrations","anchor":"writing-migrations"},{"id":"Configuration and overrides","anchor":"configuration-and-overrides"},{"id":"Referencing Pointables","anchor":"referencing-pointables"},{"id":"Dereferencing Pointables","anchor":"dereferencing-pointables"},{"id":"Inserting data","anchor":"inserting-data"},{"id":"Querying Needle","anchor":"querying-needle"},{"id":"Tradeoffs","anchor":"tradeoffs"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Mailer","group":"Concepts","title":"Email Delivery in Bonfire","headers":[{"id":"Before You Begin","anchor":"before-you-begin"},{"id":"Choosing an Email Delivery Method","anchor":"choosing-an-email-delivery-method"},{"id":"1. Default Behaviour: Direct SMTP Delivery","anchor":"1-default-behaviour-direct-smtp-delivery"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Boundaries","group":"Concepts","title":"Boundaries for Access Control","headers":[{"id":"Glossary","anchor":"glossary"},{"id":"Users and Circles","anchor":"users-and-circles"},{"id":"Verbs","anchor":"verbs"},{"id":"Permissions","anchor":"permissions"},{"id":"ACLs","anchor":"acls"},{"id":"Controlled - Applying boundaries to an object","anchor":"controlled-applying-boundaries-to-an-object"},{"id":"Practical example: Surprise birthday party","anchor":"practical-example-surprise-birthday-party"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.API.Graphql","group":"Concepts","title":"Bonfire.API.GraphQL","headers":[{"id":"GraphQL Introduction","anchor":"graphql-introduction"},{"id":"Absinthe Introduction","anchor":"absinthe-introduction"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"blog","group":"Flavours of Bonfire","title":"Bonfire Community","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"classic","group":"Flavours of Bonfire","title":"Bonfire Classic","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"community","group":"Flavours of Bonfire","title":"Bonfire Community","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"cooperation","group":"Flavours of Bonfire","title":"Bonfire Cooperation","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"coordination","group":"Flavours of Bonfire","title":"Bonfire Coordination","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"open-science","group":"Flavours of Bonfire","title":"Open Science Network","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"reflow","group":"Flavours of Bonfire","title":"Reflow","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"upcycle","group":"Flavours of Bonfire","title":"Upcycle","headers":[{"id":"More information","anchor":"more-information"}]},{"id":"Bonfire.Data.Assort","group":"Data schemas","title":"Bonfire.Data.Assort","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.AccessControl","group":"Data schemas","title":"Bonfire.Data.AccessControl","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.ActivityPub","group":"Data schemas","title":"Bonfire.Data.ActivityPub","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Identity","group":"Data schemas","title":"Bonfire.Data.Identity","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Social","group":"Data schemas","title":"Bonfire.Data.Social","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Data.Edges","group":"Data schemas","title":"Bonfire.Data.Edges","headers":[]},{"id":"Bonfire.Data.SharedUser","group":"Data schemas","title":"Bonfire.Data.SharedUser","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Common","group":"UI extensions","title":"Bonfire.UI.Common","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Me","group":"UI extensions","title":"Bonfire.UI.Me","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Social","group":"UI extensions","title":"Bonfire.UI.Social","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.SocialGraph","group":"UI extensions","title":"Bonfire.UI.Social.Graph","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Posts","group":"UI extensions","title":"Bonfire.UI.Posts","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Messages","group":"UI extensions","title":"Bonfire.UI.Messages","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Reactions","group":"UI extensions","title":"Bonfire.UI.Reactions","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Moderation","group":"UI extensions","title":"Bonfire.UI.Moderation","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Topics","group":"UI extensions","title":"Bonfire.UI.Topics","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Groups","group":"UI extensions","title":"Bonfire UI Groups","headers":[{"id":"Roadmap","anchor":"roadmap"},{"id":"Sponsors","anchor":"sponsors"},{"id":"📖 Documentation","anchor":"documentation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Valueflows","group":"UI extensions","title":"Bonfire.UI.ValueFlows","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Kanban","group":"UI extensions","title":"Bonfire.UI.Kanban","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Coordination","group":"UI extensions","title":"Bonfire.UI.Coordination","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.UI.Reflow","group":"UI extensions","title":"Bonfire.UI.Reflow","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Files","group":"Bonfire utilities","title":"Bonfire.Files","headers":[{"id":"Configuration","anchor":"configuration"},{"id":"TODO's","anchor":"todo-s"}]},{"id":"Bonfire.Common","group":"Bonfire utilities","title":"Bonfire.Common","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Epics","group":"Bonfire utilities","title":"Bonfire.Epics","headers":[{"id":"Key components and concepts:","anchor":"key-components-and-concepts"},{"id":"How it works","anchor":"how-it-works"},{"id":"1. How to write an Act","anchor":"1-how-to-write-an-act"},{"id":"2. How to define an Epic","anchor":"2-how-to-define-an-epic"},{"id":"3. How to run an Epic","anchor":"3-how-to-run-an-epic"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Ecto","group":"Bonfire utilities","title":"Bonfire.Ecto","headers":[{"id":"Introduction","anchor":"introduction"}]},{"id":"Bonfire.Classify","group":"Feature extensions","title":"Bonfire.Classify","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Tag","group":"Feature extensions","title":"Bonfire.Tag","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Label","group":"Feature extensions","title":"Bonfire.Label","headers":[{"id":"Features","anchor":"features"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.OpenScience","group":"Feature extensions","title":"Bonfire.OpenScience","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Poll","group":"Feature extensions","title":"Bonfire.Poll","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.OpenId","group":"Feature extensions","title":"Bonfire.OpenID","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Search","group":"Feature extensions","title":"Bonfire.Search","headers":[{"id":"Development & Deployment Documentation","anchor":"development-deployment-documentation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.FederateActivitypub","group":"Feature extensions","title":"Bonfire.Federate.ActivityPub","headers":[{"id":"Testing","anchor":"testing"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Editor.Milkdown","group":"Feature extensions","title":"Bonfire.Editor.Milkdown","headers":[{"id":"ROADMAP","anchor":"roadmap"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Me","group":"Feature extensions","title":"Bonfire.Me","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Social","group":"Feature extensions","title":"Bonfire.Social","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.SocialGraph","group":"Feature extensions","title":"Bonfire.Social.Graph","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Posts","group":"Feature extensions","title":"Bonfire.Posts","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Messages","group":"Feature extensions","title":"Bonfire.Messages","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.InviteLinks","group":"Feature extensions","title":"Bonfire.Invite.Links","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Pages","group":"Feature extensions","title":"Bonfire.Pages","headers":[{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Quantify","group":"Feature extensions","title":"Bonfire.Quantify","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Geolocate","group":"Feature extensions","title":"Bonfire.Geolocate","headers":[{"id":"Usage","anchor":"usage"},{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Valueflows","group":"Feature extensions","title":"ValueFlows","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Breadpub","group":"Feature extensions","title":"Bonfire.Breadpub","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.ValueflowsObserve","group":"Feature extensions","title":"Bonfire.ValueFlows.Observe","headers":[{"id":"Handy commands","anchor":"handy-commands"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire.Upcycle","group":"Feature extensions","title":"Bonfire:Upcycle","headers":[{"id":"Set up","anchor":"set-up"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Bonfire","group":"Other utilities","title":"Bonfire","headers":[]},{"id":"ActivityPub","group":"Other utilities","title":"ActivityPub","headers":[{"id":"Installation","anchor":"installation"}]},{"id":"Needle.Uid","group":"Other utilities","title":"Needle.UID","headers":[{"id":"Installation","anchor":"installation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Needle.Ulid","group":"Other utilities","title":"Needle.ULID","headers":[{"id":"Installation","anchor":"installation"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"EctoSparkles","group":"Other utilities","title":"EctoSparkles","headers":[{"id":"proload documentation","anchor":"proload-documentation"},{"id":"Example using proload","anchor":"example-using-proload"},{"id":"Example using join_preload","anchor":"example-using-join_preload"},{"id":"reusable_join documentation","anchor":"reusable_join-documentation"},{"id":"Copyright","anchor":"copyright"}]},{"id":"Entrepot","group":"Other utilities","title":"Entrepôt","headers":[{"id":"Concepts","anchor":"concepts"},{"id":"Built-in Integrations","anchor":"built-in-integrations"},{"id":"Storages","anchor":"storages"},{"id":"uploads","anchor":"uploads"},{"id":"EntrepôtEcto","anchor":"entrep%C3%B4tecto"}]},{"id":"EntrepotEcto","group":"Other utilities","title":"EntrepôtEcto","headers":[{"id":"Entrepot.Ecto.Type","anchor":"entrepot-ecto-type"},{"id":"Entrepot.Ecto.upload","anchor":"entrepot-ecto-upload"},{"id":"Upload cleanup","anchor":"upload-cleanup"},{"id":"Testing","anchor":"testing"}]},{"id":"Paginator","group":"Other utilities","title":"Paginator","headers":[{"id":"Why?","anchor":"why"},{"id":"Getting started","anchor":"getting-started"},{"id":"Install","anchor":"install"},{"id":"Usage","anchor":"usage"},{"id":"Security Considerations","anchor":"security-considerations"},{"id":"Indexes","anchor":"indexes"},{"id":"Caveats","anchor":"caveats"},{"id":"Documentation","anchor":"documentation"},{"id":"Contributing","anchor":"contributing"},{"id":"LICENSE","anchor":"license"}]},{"id":"IconifyEx","group":"Other utilities","title":"Iconify for Phoenix","headers":[{"id":"Installation","anchor":"installation"},{"id":"Usage","anchor":"usage"}]},{"id":"Voodoo","group":"Other utilities","title":"Voodoo","headers":[]},{"id":"Untangle","group":"Other utilities","title":"Untangle","headers":[{"id":"Logging/inspecting","anchor":"logging-inspecting"},{"id":"Timing functions","anchor":"timing-functions"},{"id":"Installation","anchor":"installation"},{"id":"In config/config.exs","anchor":"in-config-config-exs"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"Arrows","group":"Other utilities","title":"Arrows","headers":[{"id":"Installation","anchor":"installation"},{"id":"Documentation","anchor":"documentation"}]},{"id":"Exto","group":"Other utilities","title":"Exto","headers":[{"id":"Usage","anchor":"usage"},{"id":"Copyright and License","anchor":"copyright-and-license"}]},{"id":"AbsintheClient","group":"Other utilities","title":"Absinthe Client","headers":[{"id":"License","anchor":"license"}]},{"id":"deps-classic","group":"Dependencies","title":"Classic","headers":[]},{"id":"deps-cooperation","group":"Dependencies","title":"Cooperation","headers":[]}],"tasks":[{"id":"Mix.Tasks.Bonfire.Account.New","deprecated":false,"group":"Utilities","title":"mix bonfire.account.new","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/4","deprecated":false,"title":"get(prompt, key, opts, must?)","anchor":"get/4"},{"id":"password/1","deprecated":false,"title":"password(prompt)","anchor":"password/1"},{"id":"password/3","deprecated":false,"title":"password(prompt, pid, ref)","anchor":"password/3"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.Compile","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.compile","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"force_compile/2","deprecated":false,"title":"force_compile(dep_or_deps, compile_args \\\\ [])","anchor":"force_compile/2"},{"id":"loaded_by_name/3","deprecated":false,"title":"loaded_by_name(given, all_deps \\\\ nil, opts \\\\ [])","anchor":"loaded_by_name/3"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"},{"id":"touch_manifests/0","deprecated":false,"title":"touch_manifests()","anchor":"touch_manifests/0"},{"id":"try_compile/2","deprecated":false,"title":"try_compile(dep_or_deps, compile_args \\\\ [])","anchor":"try_compile/2"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.CopyMigrations","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.copy_migrations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"copy/3","deprecated":false,"title":"copy(extension_paths, dest_path, opts)","anchor":"copy/3"},{"id":"maybe_copy/2","deprecated":false,"title":"maybe_copy(extensions \\\\ nil, opts)","anchor":"maybe_copy/2"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Extension.New","deprecated":false,"group":"Utilities","title":"mix bonfire.extension.new","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.FullDocs","deprecated":false,"group":"Utilities","title":"mix bonfire.full_docs","sections":[{"id":"Command line options","anchor":"module-command-line-options"}]},{"id":"Mix.Tasks.Bonfire.LoadTesting","deprecated":false,"group":"Utilities","title":"mix bonfire.load_testing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Localise.Extract","deprecated":false,"group":"Utilities","title":"mix bonfire.localise.extract","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Release","deprecated":false,"group":"Utilities","title":"mix bonfire.release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"main/1","deprecated":false,"title":"main(args)","anchor":"main/1"},{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Secrets","deprecated":false,"group":"Utilities","title":"mix bonfire.secrets","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"main/1","deprecated":false,"title":"main(args)","anchor":"main/1"},{"id":"print/1","deprecated":false,"title":"print(int)","anchor":"print/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.User.Admin.Promote","deprecated":false,"group":"Utilities","title":"mix bonfire.user.admin.promote","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.User.New","deprecated":false,"group":"Utilities","title":"mix bonfire.user.new","sections":[{"id":"Usage","anchor":"module-usage"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(args)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.Bonfire.Widget.New","deprecated":false,"group":"Utilities","title":"mix bonfire.widget.new","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ext_path_for_module/4","deprecated":false,"title":"ext_path_for_module(module_name, kind_or_prefix \\\\ \"lib\", file_ext \\\\ nil, path_prefix \\\\ \"extensions\")","anchor":"ext_path_for_module/4"},{"id":"igniter/2","deprecated":false,"title":"igniter(igniter, argv)","anchor":"igniter/2"}],"key":"functions"}]},{"id":"Mix.Tasks.Import2alias","deprecated":false,"group":"Utilities","title":"mix import2alias","sections":[]}]} \ No newline at end of file diff --git a/edit-an-existing-extension.html b/edit-an-existing-extension.html index 39e88ac6c3..fd1d09d995 100644 --- a/edit-an-existing-extension.html +++ b/edit-an-existing-extension.html @@ -5,16 +5,16 @@ - + - Make changes to an extension — Bonfire v0.9.10-classic-beta.156 + Make changes to an extension — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/extensions-overview.html b/extensions-overview.html index e43fe144b2..304b38a461 100644 --- a/extensions-overview.html +++ b/extensions-overview.html @@ -5,16 +5,16 @@ - + - What is a Bonfire extension — Bonfire v0.9.10-classic-beta.156 + What is a Bonfire extension — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -142,7 +142,7 @@

    Using extensions

    -

    In order to make changes to extensions, you need to clone them locally. As you may imagine, we have a just command for that.

    just dep-clone-local **[extension name]** **[extension url]**

    This command (eg. just dep-clone-local bonfire_ui_social https://github.com/bonfire-app/bonfire_ui_social) will create a local copy of the extension in ./extensions/bonfire_ui_social.

    If the extension is enabled locally, you will see an entry in config/deps.flavour.path with the path to the local extension:

    bonfire_ui_social = "extensions/bonfire_ui_social"

    If you want to disable the extension, you can remove the entry from config/deps.flavour.path

    Info

    config/deps.flavour.path is a symlink of the file flavours/[flavour]/deps.flavour.path. Ensure this file exist in the flavour you are working on, or create one to begin use your extensions locally.

    When the extension is enabled, Bonfire will use the code in extensions/ instead of the one in deps/.

    We will dive more into the creation and the lifecycle of extensions in the next sections.

    +

    In order to make changes to extensions, you need to clone them locally. As you may imagine, we have a just command for that.

    just dep-clone-local **[extension name]** **[extension url]**

    This command (eg. just dep-clone-local bonfire_ui_social https://github.com/bonfire-app/bonfire_ui_social) will create a local copy of the extension in ./extensions/bonfire_ui_social.

    If the extension is enabled locally, you will see an entry in config/deps.flavour.path with the path to the local extension:

    bonfire_ui_social = "extensions/bonfire_ui_social"

    If you want to disable the extension, you can remove the entry from config/deps.flavour.path

    Info

    config/deps.flavour.path is a symlink of the file flavours/[flavour]/deps.flavour.path. Ensure this file exist in the flavour you are working on, or create one to begin use your extensions locally.

    When the extension is enabled, Bonfire will use the code in extensions/ instead of the one in deps/.

    We will dive more into the creation and the lifecycle of extensions in the next sections.

    @@ -151,18 +151,18 @@

    Given Bonfire modularity, you will likely find yourself combining functions from several extensions when using the framework. A significant portion of its codebase is included in extensions, each serving specific purposes. Moreover, extensions often utilise code from other extensions. -For instance, bonfire_common and bonfire_ui_common provide a suite of helpers to ease a good amount of tasks.

    When using extensions functions, we need a way to ensure the app will not break if the extension is not enabled.

    Bonfire provides a few built-in components that allows users to optionally inject components or functions from different extensions.

    Bonfire.Common.Utils.maybe_apply

    • Helpers for calling hypothetical functions in other modules. Returns the result of calling a function with the given arguments, or the result of fallback function if the primary function is not defined (by default just logging an error message).
    Bonfire.Common.Utils.maybe_apply(Bonfire.Social.Graph, :maybe_applications, [],
    -          fallback_return: []
    -        )

    Bonfire.UI.Common.Modular.StatefulComponent

    • A built-in component that allows users to optionally inject dynamic live components into a Surface template. -Based on Surface.Components.Dynamic.LiveComponent to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.
    <StatefulComponent
    -    :if={current_user(@__context__)}
    -    module={maybe_component(Bonfire.Boundaries.Web.MyCirclesLive, @__context__)}
    +For instance, bonfire_common and bonfire_ui_common provide a suite of helpers to ease a good amount of tasks.

    When using extensions functions, we need a way to ensure the app will not break if the extension is not enabled.

    Bonfire provides a few built-in components that allows users to optionally inject components or functions from different extensions.

    Bonfire.Common.Utils.maybe_apply

    • Helpers for calling hypothetical functions in other modules. Returns the result of calling a function with the given arguments, or the result of fallback function if the primary function is not defined (by default just logging an error message).
    Bonfire.Common.Utils.maybe_apply(Bonfire.Social.Graph, :maybe_applications, [],
    +          fallback_return: []
    +        )

    Bonfire.UI.Common.Modular.StatefulComponent

    • A built-in component that allows users to optionally inject dynamic live components into a Surface template. +Based on Surface.Components.Dynamic.LiveComponent to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.
    <StatefulComponent
    +    :if={current_user(@__context__)}
    +    module={maybe_component(Bonfire.Boundaries.Web.MyCirclesLive, @__context__)}
         id="circles"
    -scope={@scope}
    +scope={@scope}
     />

    Bonfire.UI.Common.Modular.StatelessComponent

    • A built-in component that allows users to optionally inject dynamic functional components into a Surface template. -Based on Surface.Components.Dynamic.Component to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.
    <StatelessComponent
    -    selected_tab={@selected_tab}
    -    module={maybe_component(Bonfire.UI.Me.SettingsViewsLive.InstanceSummaryLive, @__context__)}
    +Based on Surface.Components.Dynamic.Component to which it adds the ability to check if a module is enabled and even to swap it out for another in settings.
    <StatelessComponent
    +    selected_tab={@selected_tab}
    +    module={maybe_component(Bonfire.UI.Me.SettingsViewsLive.InstanceSummaryLive, @__context__)}
     />
    diff --git a/hacking.html b/hacking.html index a59d0e15db..755d46002f 100644 --- a/hacking.html +++ b/hacking.html @@ -5,16 +5,16 @@ - + - Development setup — Bonfire v0.9.10-classic-beta.156 + Development setup — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -312,7 +312,7 @@

    Example:

    ** (DBConnection.ConnectionError) tcp recv: closed (the connection was closed by the pool, possibly due to a timeout or because the pool has been terminated)

    In this case, the seeds were unable to complete because a query took too long to execute on your machine. You can configure the timeout to be larger in the dev environment:

    1. Open config/dev.exs in your editor.
    2. Find the database configuration (search for Bonfire.Common.Repo).
    3. Add timeout: 60_000 to the list of options:
    config :bonfire, Bonfire.Common.Repo,
       timeout: 60_000,
    -  [...]

    + [...]

    diff --git a/index.html b/index.html index 29685a0fc7..d641a1b6fd 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - Bonfire v0.9.10-classic-beta.156 — Documentation + Bonfire v0.9.10-classic-beta.160 — Documentation diff --git a/just.html b/just.html index 13aa365a85..3462e0f996 100644 --- a/just.html +++ b/just.html @@ -5,16 +5,16 @@ - + - Just commands — Bonfire v0.9.10-classic-beta.156 + Just commands — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/open-science.html b/open-science.html index ede3548e0e..faa2314991 100644 --- a/open-science.html +++ b/open-science.html @@ -5,16 +5,16 @@ - + - Open Science Network — Bonfire v0.9.10-classic-beta.156 + Open Science Network — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/project-structure.html b/project-structure.html index 8ed7df0462..23a9d6eaf3 100644 --- a/project-structure.html +++ b/project-structure.html @@ -5,16 +5,16 @@ - + - Project structure — Bonfire v0.9.10-classic-beta.156 + Project structure — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    diff --git a/readme.html b/readme.html index 86ea7d05f3..0bb1e60bf1 100644 --- a/readme.html +++ b/readme.html @@ -5,16 +5,16 @@ - + - Bonfire Networks — Bonfire v0.9.10-classic-beta.156 + Bonfire Networks — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire diff --git a/reflow.html b/reflow.html index dc6d7fcc1e..af34437d01 100644 --- a/reflow.html +++ b/reflow.html @@ -5,16 +5,16 @@ - + - Reflow — Bonfire v0.9.10-classic-beta.156 + Reflow — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire @@ -141,7 +141,7 @@

    More information

    -

    See the main docs.

    +

    See the main docs.

    diff --git a/routing.html b/routing.html index f6d9e109ec..2d67bd48e4 100644 --- a/routing.html +++ b/routing.html @@ -5,16 +5,16 @@ - + - Routing — Bonfire v0.9.10-classic-beta.156 + Routing — Bonfire v0.9.10-classic-beta.160 - + @@ -54,7 +54,7 @@ Bonfire
    diff --git a/search.html b/search.html index 87bcb41e19..b88ce27537 100644 --- a/search.html +++ b/search.html @@ -5,18 +5,18 @@ - + - Search — Bonfire v0.9.10-classic-beta.156 + Search — Bonfire v0.9.10-classic-beta.160 - + @@ -56,7 +56,7 @@ Bonfire @@ -132,7 +132,7 @@

    - +